0

我正在使用包含 TMainMenu 的 Delphi 表单。在特定情况下,我想在另一个表单中显示此表单的父级和客户端对齐。这工作正常,但没有出现父窗体的主菜单。我在这个 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;
4

1 回答 1

3

MSDN清楚地说明了这一点:

子窗口有一个客户区,但没有其他功能,除非明确要求。应用程序可以为子窗口请求标题栏、窗口菜单、最小化和最大化按钮、边框和滚动条,但子窗口不能有菜单。

这是指由 Windows 本身绘制的菜单。如果你的组件自定义绘制了一个菜单栏,那么它当然可以有一个菜单,即使它是一个子窗口。


您的调用SetParent不会使您的窗口成为子窗口。这在文档中进行了解释:

出于兼容性原因,SetParent 不会修改正在更改其父级的窗口的 WS_CHILD 或 WS_POPUP 窗口样式。因此,如果 hWndNewParent 为 NULL,还应在调用 SetParent 后清除 WS_CHILD 位并设置 WS_POPUP 样式。相反,如果 hWndNewParent 不为 NULL 并且该窗口以前是桌面的子窗口,则应在调用 SetParent 之前清除 WS_POPUP 样式并设置 WS_CHILD 样式。

于 2013-05-08T12:06:55.387 回答