Récemment, compte tenu du cadre global de l'interface du système MIS, j'ai décidé d'utiliser MDI Child dans le module MDI Form +, mais l'espace de travail du formulaire MDI a toujours des bords épais ennuyeux.
J'ai trouvé la solution à la version C ++ sur Internet hier après-midi, et j'ai passé un peu de temps à le traduire en Delphi.
Écrivez le code suivant dans le formulaire MDI:
interface
Tfmmain = classe (tform)
...
Procédure FormCreate (expéditeur: tobject);
...
Privé
...
procédure createfwndproc ();
Procédure clientwndproc (message var: tMessage);
fin;
Mise en œuvre
...
Procédure tfmmain.CreateDefwndProc;
var
hwnd1: hwnd;
CCS: TClientCreatestruct;
Commencer
ccs.hwindowmenu: = 0;
ccs.idfirstchild: = $ ff00;
hwnd1: = createwindowex (ws_ex_clientEdge,
'Mdiclient', '', ws_child ou ws_visible ou ws_group ou
Ws_tabstop ou ws_clipchildren ou ws_hscroll ou ws_vscroll ou
WS_CLIPSIBLINGS OU MDIS_ALLCHILDSTYLES, 0, 0, ClientWidth,
ClientHeight, Handle, 0, Hinstance, @CCS);
FClientInstance: = Pointer (getwindowlong (hwnd1, gwl_wndproc));
Destroywindow (HWND1);
fin;
procédure tfmmain.clientwndproc (message var: tMessage);
// var
// MyDC: HDC;
Commencer
if (message.msg = wm_erasebkgnd) alors
Commencer
// Le programme source qui simule VCL remplit ici la zone du client avec la couleur d'arrière-plan de la fenêtre principale.
// Vous pouvez également dessiner un graphique dans la zone client.
FillRect (HDC (message.wparam), clientRect, Brush.Handle);
// mydc: = twMeraseBkGnd (message) .dc;
// bitblt (mydc, (clientwidth - imback.picture.width) div 2,
// (ClientHeight - IMBACK.Picture.Height) Div 2,
// imback.picture.width, imback.picture.height,
// imback.picture.bitmap.canvas.handle, 0, 0, srccopy);
Message.result: = 1;
fin
autre
Message.result: = callwindowProc (fclientInstance, clientHandle,
Message.msg, message.wparam, message.lparam);
fin;
procédure tfmmain.formCreate (expéditeur: tobject);
Commencer
// ********* Retirer mdichild frontière épaisse *************
CreatedEFWndProc ();
Setwindowlong (clientHandle, gwl_wndproc,
LongInt (makeObjectInstance (clientwndproc)));
Setwindowlong (clientHandle, gwl_exstyle, getwindowlong (
ClientHandle, gwl_exstyle) et (pas ws_ex_clientEdge));
SetWindowPos (ClientHandle, 0,0,0,0,0, SWP_FRAMECHANGED
ou SWP_NOACTIVATE ou SWP_NOMOVE ou SWP_NOSIZE ou SWP_NOZORDER);
// ************************************************** ************
fin;