我正在使用包含TMainMenu的Delphi表单。在特定情况下,我想在另一个表单中显示此表单的父级和客户端对齐。这工作正常,但没有出现父级表单的主菜单。我在this SO question中看到了一条评论,其中说明了儿童窗口没有菜单"。我可以做些什么来覆盖这种行为并使TMainMenu出现?
暂且不说:我之前只是注意到了这一点,因为之前我使用过这个原则,我一直在使用Developer Express菜单组件,我很高兴以儿童形式展示。
稍后编辑: 使用下面的TLama代码,这是有效的(但子菜单不是主题,我很简单): 这有效:
procedure TForm65.FormShow(Sender: TObject);
begin
Winapi.Windows.SetParent(ChildForm.Handle, Handle); // <<<<<<<<
ChildForm.BorderStyle := bsNone;
ChildForm.Align := alClient;
ChildForm.Show;
end;
此代码不起作用。为什么呢?
procedure TForm65.FormShow(Sender: TObject);
begin
ChildForm.Parent := Self; // <<<<<<<<<
ChildForm.BorderStyle := bsNone;
ChildForm.Align := alClient;
ChildForm.Show;
end;
答案 0 :(得分:3)
MSDN非常清楚:
子窗口具有客户端区域但没有其他功能,除非明确请求它们。应用程序可以请求标题栏,窗口菜单,最小化和最大化按钮,边框和子窗口的滚动条,但子窗口不能有菜单。
这是指Windows本身绘制的菜单。如果您的组件自定义绘制菜单栏,那么它当然可以有一个菜单,即使它是一个子窗口。
您对SetParent
的来电不会使您的窗口进入子窗口。这在documentation:
出于兼容性原因,SetParent不会修改其父级正在更改的窗口的WS_CHILD或WS_POPUP窗口样式。因此,如果hWndNewParent为NULL,则还应在调用SetParent后清除WS_CHILD位并设置WS_ POPUP样式。相反,如果hWndNewParent不是NULL并且窗口以前是桌面的子窗口,则应该在调用SetParent之前清除WS_POPUP样式并设置WS_CHILD样式。