简短版本
我有一个使用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。当我执行它时,我的打开对话框显示在主机选项卡上。
图片
独立模式下的首选项菜单:
主机中的插件首选项菜单:
如果我可以简单地改变黑色文本的颜色,那就足够了,但我似乎无法做到。
答案 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?