【问题标题】:How to make a floating DirectX Child Window with Delphi?如何使用 Delphi 制作浮动 DirectX 子窗口?
【发布时间】:2009-10-18 13:54:53
【问题描述】:

我有一个 Delphi 项目,主窗体是另一个应用程序的子窗口。父应用程序(用 C++ 编写的 3D 游戏)有两种窗口状态,windowedfull screen。在窗口模式下,Delphi 表单完美地漂浮在父应用程序之上。可以点击、拖拽,没问题(在我主窗体的CreateParams过程中使用params.Style := WS_POPUP;):

procedure TMyForm.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);

  HandleToTheOtherApp := FindWindow('THE_OTHER_APP', nil);

  if HandleToTheOtherApp = 0 then
  begin
    ShowMessage('The parent app was not found');
    exit;
  end;

  params.Style := WS_POPUP;
  params.WndParent := HandleToTheOtherApp;
  params.WinClassName := 'MyAppClassName';
end;

但是,如果将父应用程序置于 全屏 模式(它使用 DirectX 9/10),我的 Delphi 表单将从视图中隐藏。它似乎仍然在屏幕上,我可以看到是否偶尔闪烁,但没有被重绘。

如果我单击窗口(或它看起来所在的位置),它会重新出现一秒钟,然后将游戏从全屏模式转储到窗口模式。显然,它不喜欢这种形式。该表格使用出现在该游戏的先前版本中,但可能是由于 DirectX 版本的更改(我的猜测)它不再出现。

该表单不会显示任何复杂的 3D 图形,仅显示按钮和列表框等基本控件。我尝试了各种 Window 样式并将其设置为 Doublebuffered,但均无济于事。也许有人已经成功地让一个窗口在这些情况下使用特定的功能、窗口样式或标题显示?

有没有办法让 Delphi 表单在 DirectX 环境中正确显示?

【问题讨论】:

  • 我不知道有任何全屏游戏能够与窗口应用程序共存。即使我在一台显示器上全屏运行并单击另一台显示器上的窗口应用程序,它也会在失去焦点时将游戏转出全屏。我认为这是 Windows 的限制。

标签: delphi


【解决方案1】:

我不认为这是可以做到的。

当 DirectX 视频窗口变为全屏时,DirectX 会接管整个屏幕绘制(类似于当您将 Windows Media Player 全屏时:所有其他应用程序都会消失,有时甚至分辨率会发生变化)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 2010-10-17
    • 1970-01-01
    • 2015-05-26
    • 2011-04-02
    相关资源
    最近更新 更多