Cuando se utiliza la interfaz MDI, a veces es necesario mostrar algunos gráficos o cubiertas de software en la ventana del cliente MDI para que la interfaz del software no aparezca vacía y las funciones del software puedan ser claras de un vistazo. Sin embargo, estas interfaces no se proporcionan directamente en Delphi. Los controles gráficos colocados en el formulario MDI no se pueden mostrar en tiempo de ejecución. Por lo tanto, es necesario modificar el formulario MDI.
Declaración:
Esta solución es solo para formularios MDI. Si se aplica a formularios que no son MDI, las consecuencias son difíciles de decir.
Recuerde, la propiedad FormStyle del formulario debe establecerse en: fsMDIForm.
Solución:
1. El mensaje de la ventana del cliente MDI (Mensaje) no se puede recibir en el formulario principal de MDI. Por lo tanto, debe personalizar el proceso de procesamiento de la ventana del cliente (procedimiento de la ventana) y hacerse cargo de la ventana del cliente MDI (debe implementarse en el CreateWnd sobrecargado). proceso ):
procedimiento TMDIForm.CreateWnd;
comenzar
heredado;
FNewWndProc := MakeObjectInstance(ClientWndProc);
FOldWndProc := Puntero(GetWindowLong(ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle, GWL_WNDPROC, Longint(FNewWndProc));
fin;
Entre ellos, ClientWndProc es un procedimiento de ventana personalizado: procedimiento ClientWndProc(var Message: TMessage);
FOldWndProc se utiliza para almacenar el puntero del procedimiento de ventana anterior.
2. Implemente su propio proceso de ventana de cliente:
procedimiento TMDIForm.ClientWndProc(var Mensaje: TMessage);
var
R: TRECTO;
procedimiento Por defecto;
comenzar
con mensaje hacer
Resultado := CallWindowProc(FOldWndProc, ClientHandle, Msg, wParam, lParam);
fin;
var
PD: TPaintStruct;
comenzar
R := ClienteRect;
caso Mensaje.Mensaje de
WM_PAINT:
comenzar
Comenzar pintura (ClientHandle, PS);
intentar
Lienzo.Bloqueo;
intentar
Lienzo.Mango := PS.hdc;
intentar
Pintar;
si ControlCount > 0 entonces
PaintControls(PS.hdc,Controles[0]);
finalmente
Lienzo.Mango:= 0;
fin;
finalmente
Lienzo.Desbloquear;
fin;
finalmente
EndPaint(ClientHandle,PS);
fin;
fin;
WM_ERASEBKGND:
comenzar
DrawBG(TWMEraseBkGnd(Mensaje).DC);
Mensaje.Resultado := 1;
fin;
WM_VSCROLL,WM_HSCROLL:
comenzar
InvalidateRect(ClientHandle,@R,true);
Por defecto;
fin;
WM_TAMAÑO:
comenzar
InvalidateRect(ClientHandle,@R,true);
Por defecto;
fin;
demás
Por defecto;
fin;
fin;
El DrawBG anterior se utiliza para dibujar el fondo de la ventana.
3. Implementar el fondo de la ventana.
Para permitir que los sucesores definan sus propios antecedentes, el proceso se describe como virtual:
protegido
procedimiento DrawBG(DC:HDC);
Aquí, el proceso DrawBG simplemente llena el fondo de la ventana:
procedimiento TMDIForm.DrawBG(DC: HDC);
comenzar
si Brush.Color <> clNone entonces
FillRect(DC, ClientRect, Brush.Handle);
fin;
4. En resumen, la definición de clase TMDIFrom se resume de la siguiente manera:
TMDIForm = clase(TForm)
privado
FOldWndProc: TFarProc;
FNewWndProc: TFarProc;
procedimiento ClientWndProc(var Mensaje: TMessage);
protegido
procedimiento DrawBG(DC: HDC);virtual;
procedimiento CreateWnd;
fin;
5. Después de la transformación anterior, puede dibujar el fondo especificado en DrawBG (debe llamar directamente a la interfaz GUI de Windows), o usar controles gráficos directamente, o implementar el evento OnPaint del formulario, y la ventana MDI será colorida desde ahora adelante.