WindowProc
パネルが常に MDI の子の背後にあるように、パネルをオーバーライドする必要があります。
TMainForm = class(TForm)
...
private
FPanelWndProc: TWndMethod;
procedure PanelWndProc(var M: TMessage);
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
Windows.SetParent(Panel1.Handle, ClientHandle);
// Override Panel1 WindowProc
FPanelWndProc := Panel1.WindowProc;
Panel1.WindowProc := PanelWndProc;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
// Restore Panel1 WindowProc
Panel1.WindowProc := FPanelWndProc;
end;
procedure TMainForm.PanelWndProc(var M: TMessage);
var
P: ^WINDOWPOS;
begin
if M.Msg = WM_WINDOWPOSCHANGING then
begin
P := Pointer(M.LParam);
// Always place panel at bottom
P.hwndInsertAfter := HWND_BOTTOM;
end;
FPanelWndProc(M);
end;
注: コードをすばやくテストするために、次の方法で MDI アプリケーションを作成できます。File -> New -> MDI Application
編集:上記のコードは事実上、最初の質問に答えます。「 Panel を何らかの形で MDI 子として動作させたい」(コメントの引用) 場合は、単純に (... うーん...) MDI 子フォームを使用します。つまり、 で新しいフォームを作成し、次の.FormStyle = fsMDIChild
ようなものを使用します。
SetWindowLong(Child.Handle, GWL_STYLE,
GetWindowLong(Child.Handle, GWL_STYLE) and not (WS_BORDER or WS_DLGFRAME or WS_SIZEBOX));
境界線を削除するには(単に設定すると.BorderStyle = bsNone
機能しないため)。
そのフォームに必要なものを入力すると、クリックすると他の MDI フォームの上に移動します。