MDI 인터페이스를 사용할 때 소프트웨어 인터페이스가 비어 있지 않고 소프트웨어 기능이 한눈에 명확해질 수 있도록 MDI 클라이언트 창에 일부 그래픽이나 소프트웨어 커버를 표시해야 하는 경우가 있습니다. 그러나 이러한 인터페이스는 Delphi에서 직접 제공되지 않습니다. MDI 양식에 배치된 그래픽 컨트롤은 런타임에 표시될 수 없습니다. 따라서 MDI 양식을 수정해야 합니다.
성명:
이 솔루션은 MDI 형식에만 해당됩니다. MDI 형식이 아닌 경우에는 결과를 직접 확인하기 어렵습니다.
양식의 FormStyle 속성은 fsMDIForm으로 설정되어야 합니다.
해결책:
1. MDI 클라이언트 창 메시지(Message)는 MDI 메인 폼에서 받을 수 없으므로 클라이언트 창 처리 프로세스(Window PROcedure)를 사용자 지정하고 MDI 클라이언트 창을 인수해야 합니다(오버로드된 CreateWnd에서 구현해야 함). 프로세스 ):
절차 TMDIForm.CreateWnd;
시작하다
상속됨;
FNewWndProc := MakeObjectInstance(ClientWndProc);
FOldWndProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle, GWL_WNDPROC, Longint(FNewWndProc));
끝;
그중 ClientWndProc는 사용자 정의 창 프로시저입니다. Procedure ClientWndProc(var Message: TMessage);
FOldWndProc는 이전 창 프로시저의 포인터를 저장하는 데 사용됩니다.
2. 자신만의 고객 창구 프로세스를 구현하세요.
절차 TMDIForm.ClientWndProc(var 메시지: TMessage);
var
R: TRECT;
절차 기본값;
시작하다
메시지와 함께
결과 := CallWindowProc(FOldWndProc, ClientHandle, Msg, wParam, lParam);
끝;
var
PS: TPaintStruct;
시작하다
R := ClientRect;
메시지.메시지
WM_페인트:
시작하다
BeginPaint(클라이언트핸들,PS);
노력하다
캔버스.잠금;
노력하다
Canvas.Handle := PS.hdc;
노력하다
페인트;
ControlCount > 0이면
PaintControls(PS.hdc,Controls[0]);
마지막으로
캔버스.핸들 := 0;
끝;
마지막으로
캔버스.잠금 해제;
끝;
마지막으로
EndPaint(클라이언트핸들,PS);
끝;
끝;
WM_ERASEBKGND:
시작하다
DrawBG(TWMEraseBkGnd(메시지).DC);
메시지.결과 := 1;
끝;
WM_VSCROLL,WM_HSCROLL:
시작하다
InvalidateRect(ClientHandle,@R,true);
기본;
끝;
WM_크기:
시작하다
InvalidateRect(ClientHandle,@R,true);
기본;
끝;
또 다른
기본;
끝;
끝;
위의 DrawBG는 창 배경을 그리는 데 사용됩니다.
3. 창 배경을 구현합니다.
후임자가 자신의 배경을 정의할 수 있도록 프로세스는 가상으로 설명됩니다.
보호됨
절차 DrawBG(DC: HDC);
여기서 DrawBG 프로세스는 단순히 창 배경을 채웁니다.
절차 TMDIForm.DrawBG(DC: HDC);
시작하다
Brush.Color <> clNone이면
FillRect(DC, ClientRect, Brush.Handle);
끝;
4. 요약하면 TMDIFrom 클래스 정의는 다음과 같이 요약됩니다.
TMDIForm = 클래스(TForm)
사적인
FOldWndProc: TFarProc;
FNewWndProc: TFarProc;
절차 ClientWndProc(var 메시지: TMessage);
보호됨
절차 DrawBG(DC: HDC);가상;
프로시저 CreateWnd 재정의;
끝;
5. 위 변환 후 DrawBG에서 지정된 배경을 그리거나(Windows GUI 인터페이스를 직접 호출해야 함) 그래픽 컨트롤을 직접 사용하거나 양식의 OnPaint 이벤트를 구현할 수 있으며 MDI 창은 지금이야.