gpt4 book ai didi

delphi - TPanel 作为 MDI 应用程序中的启动屏幕

转载 作者:行者123 更新时间:2023-12-03 15:46:44 33 4
gpt4 key购买 nike

我想在一个窗体中间显示一个 TPanel,该窗体是其他窗体的 MDI 父窗体。某种“飞溅”形式,但不完全是。该面板将包含用户可以调用杂项的链接/按钮/快捷方式。功能。

主要要求是当我单击 MDI 子窗体时,TPanel 应放置在 MDI 子窗体下方。然而,事实上,TPanel 将始终保持在 MDI 子窗体之上。

调用Panel.SendToBack将使面板消失。我该怎么办?

最佳答案

您需要重写面板的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 应用程序创建 MDI 应用程序

<小时/>

编辑:上面的代码剂量实际上回答了您最初的问题。如果您希望您的“面板以某种方式表现得像 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 表单上方。

关于delphi - TPanel 作为 MDI 应用程序中的启动屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12021818/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com