【问题标题】:Making VCL Forms and Dialogs play nicely with WinApi Window使用 WinApi Window 使 VCL 窗体和对话框很好地发挥作用
【发布时间】:2013-04-05 18:14:06
【问题描述】:

简短版 -

我有一个使用 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 中引入的。

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

图片

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

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

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

【问题讨论】:

    标签: forms delphi winapi dialog ownership


    【解决方案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?

    【讨论】:

    • 我在原始问题中添加了一些细节。但我目前正在这样做,但无济于事。
    • 这不是回答关于窗口所有者的问题吗?你似乎很安静。
    • 对不起,我正在吃午饭!我会试试这个。
    • 试过了,在表单创建时调用了被覆盖的过程。仍然 - 不寻常的渲染行为没有变化。 OpenGL Window 的消息循环中是否可能缺少某些内容?是否有我需要回应的消息被忽略?这是一个自定义循环。
    • 另外——关于运行时主题的编辑是一个有趣的可能性。我会尝试使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多