Bei Verwendung der MDI-Schnittstelle ist es manchmal erforderlich, einige Grafiken oder Software-Cover im MDI-Client-Fenster anzuzeigen, damit die Software-Schnittstelle nicht leer erscheint und die Softwarefunktionen auf einen Blick klar sind. Diese Schnittstellen werden jedoch nicht direkt in Delphi bereitgestellt. Eventuell im MDI-Formular platzierte grafische Steuerelemente können zur Laufzeit nicht angezeigt werden. Daher muss das MDI-Formular geändert werden.
Stellungnahme:
Diese Lösung gilt nur für MDI-Formulare. Wenn sie auf Nicht-MDI-Formulare angewendet wird, sind die Konsequenzen schwer abzuschätzen.
Denken Sie daran, dass die FormStyle-Eigenschaft des Formulars auf fsMDIForm gesetzt sein sollte.
Lösung:
1. Die MDI-Client-Fensternachricht (Nachricht) kann nicht im MDI-Hauptformular empfangen werden. Daher müssen Sie den Client-Fensterverarbeitungsprozess (Window PROcedure) anpassen und das MDI-Client-Fenster übernehmen (muss im überladenen CreateWnd implementiert werden). Verfahren ):
Prozedur TMDIForm.CreateWnd;
beginnen
geerbt;
FNewWndProc := MakeObjectInstance(ClientWndProc);
FOldWndProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle, GWL_WNDPROC, Longint(FNewWndProc));
Ende;
Unter diesen ist ClientWndProc eine benutzerdefinierte Fensterprozedur: procedure ClientWndProc(var Message: TMessage);
FOldWndProc wird zum Speichern des Zeigers der alten Fensterprozedur verwendet.
2. Implementieren Sie Ihren eigenen Kundenfensterprozess:
procedure TMDIForm.ClientWndProc(var Message: TMessage);
var
R: TRECT;
Prozedur Standard;
beginnen
mit Nachricht tun
Ergebnis := CallWindowProc(FOldWndProc, ClientHandle, Msg, wParam, lParam);
Ende;
var
PS: TPaintStruct;
beginnen
R := ClientRect;
Fall Message.Msg von
WM_PAINT:
beginnen
BeginPaint(ClientHandle,PS);
versuchen
Canvas.Lock;
versuchen
Canvas.Handle := PS.hdc;
versuchen
Malen;
wenn ControlCount > 0 dann
PaintControls(PS.hdc,Controls[0]);
Endlich
Canvas.Handle := 0;
Ende;
Endlich
Canvas.Unlock;
Ende;
Endlich
EndPaint(ClientHandle,PS);
Ende;
Ende;
WM_ERASEBKGND:
beginnen
DrawBG(TWMEraseBkGnd(Message).DC);
Message.Result := 1;
Ende;
WM_VSCROLL,WM_HSCROLL:
beginnen
InvalidateRect(ClientHandle,@R,true);
Standard;
Ende;
WM_SIZE:
beginnen
InvalidateRect(ClientHandle,@R,true);
Standard;
Ende;
anders
Standard;
Ende;
Ende;
Das obige DrawBG wird zum Zeichnen des Fensterhintergrunds verwendet.
3. Fensterhintergrund implementieren.
Um Nachfolgern die Möglichkeit zu geben, ihren eigenen Hintergrund zu definieren, wird der Prozess als virtuell beschrieben:
geschützt
procedure DrawBG(DC: HDC);
Hier füllt der DrawBG-Prozess einfach den Fensterhintergrund:
Prozedur TMDIForm.DrawBG(DC: HDC);
beginnen
wenn Brush.Color <> clNone dann
FillRect(DC, ClientRect, Brush.Handle);
Ende;
4. Zusammenfassend lässt sich die TMDIFrom-Klassendefinition wie folgt zusammenfassen:
TMDIForm = Klasse(TForm)
Privat
FOldWndProc: TFarProc;
FNewWndProc: TFarProc;
procedure ClientWndProc(var Message: TMessage);
geschützt
procedure DrawBG(DC: HDC);virtual;
procedure CreateWnd;
Ende;
5. Nach der obigen Transformation können Sie den angegebenen Hintergrund in DrawBG zeichnen (Sie müssen die Windows-GUI-Schnittstelle direkt aufrufen) oder direkt grafische Steuerelemente verwenden oder das OnPaint-Ereignis des Formulars implementieren, und das MDI-Fenster wird farbig angezeigt jetzt weiter.