短版——
我有一个使用 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 中引入的。
最后 - 当作为插件运行时,我的打开/保存对话框将出现,就好像它们属于任务栏上的主机应用程序一样。因此,主机有一个任务栏选项卡。我的应用程序也有它自己的选项卡。当我执行它时,我的打开对话框会附加到主机的选项卡上。
图片
独立模式下的首选项菜单:
首选项菜单作为主机中的插件:
如果我可以简单地更改黑色文本的颜色,那就足够了,但我似乎做不到。