如何创建具有主菜单的Delphi子窗口?

时间:2013-05-08 09:40:42

标签: delphi menu childwindow

我正在使用包含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;

1 个答案:

答案 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样式。