代码之家  ›  专栏  ›  技术社区  ›  AudioGL

使用WinApi窗口使VCL窗体和对话框发挥良好作用

  •  0
  • AudioGL  · 技术社区  · 11 年前

    简短的版本-

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

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

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

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

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

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

    长期版本-

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

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

    当处于插件模式时,我发现主机应用程序将 取得控制权 我的VCL表格,以及Open&保存对话框。

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

    编辑-对话框详细信息

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

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

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

    而且没有效果。对话框的作用与我没有传递句柄的情况相同。请记住,我使用的是Delphi 2006,而这个版本的Delphi仍然使用Windows XP中引入的旧文件对话框。

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

    图像

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

    Preference Menu In Standalone Mode

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

    Preference Menu In Host

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

    1 回复  |  直到 11 年前
        1
  •  2
  •   Community CDub    7 年前

    对于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?