0

短版——

我有一个使用 WinApi 调用创建的 OpenGL 窗口。我宁愿保持这种方式,而不是将 OpenGL 包装到 VCL 表单中。

为了提供一些首选项菜单和文件对话框,我使用了 VCL 表单和典型的对话框(TOpenDialog、TSaveDialog)。

我想知道的是 - 我如何让这些表单和对话框将我的 OpenGL 窗口视为它们的所有者?

我试图将我的窗口句柄传递给表单,但我确信我这样做不正确,因为它没有任何效果。

Form1 := TForm1.Create(nil);   
Form1.ParentWindow := hwnd; //handle to OpenGL Window

VCL 表单需要什么才能将本机窗口视为它的所有者?

长版 -

我的应用程序有两种模式。独立模式,它自己运行。其次,有一个插件模式在宿主应用程序的进程空间中运行

在独立模式下,我对 VCL 表单和对话框没有任何问题。即使它们的所有权是不确定的,它也不会以任何方式影响可用性。

在插件模式下,我发现主机应用程序将控制我的 VCL 表单和打开和保存对话框。

因此,当在主机的进程空间中运行时,我的 VCL 表单呈现非常奇怪。我尝试手动修复它们,但它们不会响应样式更改。

编辑 - 对话框的详细信息

我主要关心的是 VCL 表单的呈现,但这里有一些关于对话框的更多细节,如果它有任何用处的话。

我正在执行这样的对话框:

if FileOpenDialog.Execute(hwnd) then
Begin
  //open up file
End;

它没有任何效果。该对话框的行为与我没有将句柄传递给它一样。请记住,我使用的是 Delphi 2006,而这个版本的 Delphi 仍在使用旧的文件对话框,它们是在 Windows XP 中引入的。

最后 - 当作为插件运行时,我的打开/保存对话框将出现,就好像它们属于任务栏上的主机应用程序一样。因此,主机有一个任务栏选项卡。我的应用程序也有它自己的选项卡。当我执行它时,我的打开对话框会附加到主机的选项卡上。

图片

独立模式下的首选项菜单:

独立模式下的首选项菜单

首选项菜单作为主机中的插件:

主机中的首选项菜单

如果我可以简单地更改黑色文本的颜色,那就足够了,但我似乎做不到。

4

1 回答 1

2

对于 VCL 表单,您需要覆盖 CreateParams 并将 Params.WndParent 设置为拥有窗口。据我了解,这将是您的 OpenGL 窗口。

procedure TMyForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := MyOpenGLWindow;
end;

公共对话框类有一个接收窗口句柄的 Execute 重载。传递 OpenGL 窗口的句柄,该 OpenGL 窗口将成为对话框的所有者窗口。

关于您的表格呈现奇怪的主题,很难给出明确的建议。我的猜测是,奇怪是由于主机应用程序没有启用主题。如果您控制主机修复它。否则,您需要使用激活上下文。我对这个问题的回答提供了示例代码:可能通过在运行时添加应用程序清单来执行运行时可选切换**运行时主题**?

于 2013-04-05T18:26:34.920 回答