使VAC表单和对话框与WinApi Window完美匹配

时间:2013-04-05 18:14:06

标签: forms delphi winapi dialog ownership

简短版本

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

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

我想知道的是 - 我如何获得这些表格和对话框以将我的OpenGL窗口视为其所有者?

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

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

VCL表单需要什么才能看到本机窗口是它的所有者?

长版 -

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

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

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

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

编辑 - 有关对话框的详细信息

我主要担心的是VCL表单的呈现,但是如果有任何用途,这里有一些关于Dialogs的更多细节。

我正在执行这样的对话:

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

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

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

图片

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

Preference Menu In Standalone Mode

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

Preference Menu In Host

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

1 个答案:

答案 0 :(得分:1)

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

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

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

关于表格渲染的主题奇怪,很难给出明确的建议。我的猜测是,奇怪的是由于主机应用程序没有启用主题。如果你控制主机修复它。否则,您需要使用激活上下文。我对这个问题的回答给出了示例代码:Possible to do runtime optional toggling of **runtime themes** by adding an application manifest at runtime?