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 はカスタム ウィンドウ プロシージャです。
FOldWndProc は、古いウィンドウ プロシージャのポインタを格納するために使用されます。
2. 独自の顧客窓口プロセスを実装します。
プロシージャ TMDIForm.ClientWndProc(var Message: TMessage);
変数
R:トレクト。
プロシージャのデフォルト。
始める
メッセージ付き
結果 := CallWindowProc(FOldWndProc, ClientHandle, Msg, wParam, lParam);
終わり;
変数
PS: TPaintStruct;
始める
R := ClientRect;
ケースのメッセージ.メッセージ
WM_ペイント:
始める
BeginPaint(ClientHandle,PS);
試す
キャンバス.ロック;
試す
Canvas.Handle := PS.hdc;
試す
ペイント;
ControlCount > 0 の場合
ペイントコントロール(PS.hdc,コントロール[0]);
ついに
Canvas.Handle := 0;
終わり;
ついに
Canvas.Unlock;
終わり;
ついに
EndPaint(ClientHandle,PS);
終わり;
終わり;
WM_ERASEBKGND:
始める
DrawBG(TWMEraseBkGnd(メッセージ).DC);
メッセージ.結果 := 1;
終わり;
WM_VSCROLL、WM_HSCROLL:
始める
InvalidateRect(ClientHandle,@R,true);
デフォルト;
終わり;
WM_SIZE:
始める
InvalidateRect(ClientHandle,@R,true);
デフォルト;
終わり;
それ以外
デフォルト;
終わり;
終わり;
上記の DrawBG はウィンドウの背景を描画するために使用されます。
3. ウィンドウの背景を実装します。
後続者が独自の背景を定義できるようにするために、プロセスは仮想として記述されます。
保護された
プロシージャ DrawBG(DC:HDC);
ここで、DrawBG プロセスは単にウィンドウの背景を塗りつぶします。
プロシージャ TMDIForm.DrawBG(DC:HDC);
始める
if Brush.Color <> clNone then
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 ウィンドウがカラフルになります。今から。