Lors de l'utilisation de l'interface MDI, il est parfois nécessaire d'afficher des graphiques ou des couvertures logicielles dans la fenêtre du client MDI afin que l'interface logicielle n'apparaisse pas vide et que les fonctions logicielles puissent être claires en un coup d'œil. Cependant, ces interfaces ne sont pas directement fournies dans Delphi. Les contrôles graphiques placés dans le formulaire MDI ne peuvent pas être affichés au moment de l'exécution. Le formulaire MDI doit donc être modifié.
Déclaration:
Cette solution concerne uniquement les formulaires MDI. Si elle est appliquée aux formulaires non-MDI, les conséquences sont difficiles à évaluer vous-même.
N'oubliez pas que la propriété FormStyle du formulaire doit être définie sur : fsMDIForm.
Solution:
1. Le message de la fenêtre client MDI (Message) ne peut pas être reçu dans le formulaire principal MDI. Par conséquent, vous devez personnaliser le processus de traitement de la fenêtre client (Window PROcedure) et prendre en charge la fenêtre client MDI (doit être implémentée dans CreateWnd surchargé). processus ):
procédure TMDIForm.CreateWnd ;
commencer
hérité;
FNewWndProc := MakeObjectInstance(ClientWndProc);
FOldWndProc := Pointeur(GetWindowLong(ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle, GWL_WNDPROC, Longint(FNewWndProc));
fin;
Parmi eux, ClientWndProc est une procédure de fenêtre personnalisée : procédure ClientWndProc(var Message: TMessage);
FOldWndProc est utilisé pour stocker le pointeur de l'ancienne procédure de fenêtre.
2. Mettez en œuvre votre propre processus de fenêtre client :
procédure TMDIForm.ClientWndProc(var Message : TMessage);
var
R : TRECT ;
procédure Par défaut ;
commencer
avec Message faire
Résultat := CallWindowProc(FOldWndProc, ClientHandle, Msg, wParam, lParam);
fin;
var
PS : TPaintStruct ;
commencer
R :=ClientRect;
cas Message.Msg de
WM_PAINT :
commencer
BeginPaint(ClientHandle,PS);
essayer
Toile.Lock ;
essayer
Canvas.Handle := PS.hdc;
essayer
Peinture;
si ControlCount > 0 alors
PaintControls(PS.hdc,Controls[0]);
enfin
Canvas.Handle := 0;
fin;
enfin
Toile.Déverrouiller ;
fin;
enfin
EndPaint(ClientHandle,PS);
fin;
fin;
WM_ERASEBKGND :
commencer
DrawBG(TWMEraseBkGnd(Message).DC);
Message.Résultat := 1;
fin;
WM_VSCROLL,WM_HSCROLL :
commencer
InvalidateRect(ClientHandle,@R,true);
Défaut;
fin;
WM_TAILLE :
commencer
InvalidateRect(ClientHandle,@R,true);
Défaut;
fin;
autre
Défaut;
fin;
fin;
Le DrawBG ci-dessus est utilisé pour dessiner l'arrière-plan de la fenêtre.
3. Implémentez l’arrière-plan de la fenêtre.
Afin de permettre aux successeurs de définir leur propre parcours, le processus est décrit comme virtuel :
protégé
procédure DrawBG(DC : HDC) ;
Ici, le processus DrawBG remplit simplement l'arrière-plan de la fenêtre :
procédure TMDIForm.DrawBG(DC : HDC) ;
commencer
si Brush.Color <> clNone alors
FillRect(DC, ClientRect, Brush.Handle);
fin;
4. En résumé, la définition de la classe TMDIFrom est résumée comme suit :
TMDIForm = classe (TForm)
privé
FOldWndProc : TFarProc ;
FNouveauWndProc : TFarProc ;
procédure ClientWndProc(var Message : TMessage);
protégé
procédure DrawBG(DC: HDC);virtuel;
procédure CreateWnd ;
fin;
5. Après la transformation ci-dessus, vous pouvez dessiner l'arrière-plan spécifié dans DrawBG (vous devez appeler directement l'interface graphique de Windows), ou utiliser directement des contrôles graphiques, ou implémenter l'événement OnPaint du formulaire, et la fenêtre MDI sera colorée de maintenant.