Ao usar a interface MDI, às vezes é necessário exibir alguns gráficos ou capas de software na janela do cliente MDI para que a interface do software não pareça vazia e as funções do software possam ser claras à primeira vista. No entanto, essas interfaces não são fornecidas diretamente no Delphi. Quaisquer controles gráficos colocados no formulário MDI não podem ser exibidos em tempo de execução. Portanto, o formulário MDI precisa ser modificado.
Declaração:
Esta solução é apenas para formulários MDI. Se for aplicada a formulários não-MDI, é difícil dizer as consequências.
Lembre-se, a propriedade FormStyle do formulário deve ser definida como: fsMDIForm.
Solução:
1. A mensagem da janela do cliente MDI (Mensagem) não pode ser recebida no formulário principal do MDI, portanto, você precisa personalizar o processo de processamento da janela do cliente (Window PROcedure) e assumir o controle da janela do cliente MDI (precisa ser implementado no CreateWnd sobrecarregado). processo ):
procedimento TMDIForm.CreateWnd;
começar
herdado;
FNewWndProc := MakeObjectInstance(ClientWndProc);
FOldWndProc := Ponteiro(GetWindowLong(ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle, GWL_WNDPROC, Longint(FNewWndProc));
fim;
Entre eles, ClientWndProc é um procedimento de janela customizado: procedure ClientWndProc(var Message: TMessage);
FOldWndProc é usado para armazenar o ponteiro do procedimento da janela antiga.
2. Implemente seu próprio processo de janela do cliente:
procedimento TMDIForm.ClientWndProc(var Mensagem: TMessage);
var
R: TREC;
procedimento Padrão;
começar
com mensagem faça
Resultado: = CallWindowProc (FOldWndProc, ClientHandle, Msg, wParam, lParam);
fim;
var
PS: TPaintStruct;
começar
R :=ClienteRect;
caso Mensagem.Msg de
WM_PAINT:
começar
BeginPaint(ClienteHandle,PS);
tentar
Tela.Bloqueio;
tentar
Tela.Handle := PS.hdc;
tentar
Pintar;
se ControlCount > 0 então
PaintControls(PS.hdc,Controles[0]);
finalmente
Tela.Handle := 0;
fim;
finalmente
Tela.Desbloquear;
fim;
finalmente
EndPaint(ClienteHandle,PS);
fim;
fim;
WM_ERASEBKGND:
começar
DrawBG(TWMEraseBkGnd(Mensagem).DC);
Mensagem.Resultado := 1;
fim;
WM_VSCROLL,WM_HSCROLL:
começar
InvalidateRect(ClientHandle,@R,true);
Padrão;
fim;
WM_SIZE:
começar
InvalidateRect(ClientHandle,@R,true);
Padrão;
fim;
outro
Padrão;
fim;
fim;
O DrawBG acima é usado para desenhar o fundo da janela.
3. Implemente o plano de fundo da janela.
Para permitir que os sucessores definam sua própria formação, o processo é descrito como virtual:
protegido
procedimento DrawBG(DC: HDC virtual);
Aqui, o processo DrawBG simplesmente preenche o fundo da janela:
procedimento TMDIForm.DrawBG(DC:HDC);
começar
se Brush.Color <> clNone então
FillRect(DC, ClientRect, Brush.Handle);
fim;
4. Em resumo, a definição da classe TMDIFrom é resumida da seguinte forma:
TMDIForm = classe(TForm)
privado
FOldWndProc: TFarProc;
FNewWndProc: TFarProc;
procedimento ClientWndProc(var Mensagem: TMessage);
protegido
procedimento DrawBG(DC:HDC);virtual;
substituição de procedimento CreateWnd;
fim;
5. Após a transformação acima, você pode desenhar o plano de fundo especificado no DrawBG (você precisa chamar diretamente a interface GUI do Windows), ou usar controles gráficos diretamente, ou implementar o evento OnPaint do formulário, e a janela MDI ficará colorida a partir de agora em diante.