0

ショートバージョン -

WinApi 呼び出しを使用して作成された OpenGL ウィンドウがあります。OpenGL を VCL フォームにラップするのではなく、この方法を維持したいと思います。

いくつかの設定メニューとファイル ダイアログを提供するために、VCL フォームと一般的なダイアログ (TOpenDialog、TSaveDialog) を使用することにしました。

私が疑問に思っているのは、これらのフォームとダイアログを取得して、OpenGL ウィンドウを所有者として表示するにはどうすればよいですか?

ウィンドウ ハンドルをフォームに渡そうとしましたが、効果がないため、これが不適切であると確信しています。

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

ネイティブ ウィンドウを所有者として表示するために、VCL フォームに必要なものは何ですか?

ロングバージョン -

私のアプリケーションには 2 つのモードがあります。スタンドアロン モード。単独で実行されます。次に、ホスト アプリケーションのプロセス空間で実行されるプラグイン モードがあります。

スタンドアロン モードでは、VCL フォームとダイアログに問題はありません。それらの所有権は不明ですが、ユーザビリティにはまったく影響しません。

プラグイン モードの場合、ホスト アプリケーションがVCL フォームと [開く] および [保存] ダイアログを制御します。

そのため、ホストのプロセス空間で実行すると、VCL フォームが非常に奇妙にレンダリングされます。手動で修復しようとしましたが、スタイルの変更に反応しません。

編集 - ダイアログの詳細

私の主な関心事は、VCL フォームのレンダリングですが、ダイアログの詳細を以下に示します。

私は次のようなダイアログを実行しています:

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

そして、それは効果がありません。ダイアログは、ハンドルを渡さなかった場合と同じように動作します。私は Delphi 2006 を使用しており、このバージョンの Delphi は、Windows XP で導入された古いファイル ダイアログをまだ使用していることに注意してください。

最後に、プラグインとして実行すると、[開く/保存] ダイアログがタスクバーのホスト アプリケーションに属しているかのように表示されます。そのため、ホストにはタスクバー タブがあります。私のアプリケーションには独自のタブもあります。開くダイアログを実行すると、ホストのタブに添付されて表示されます。

画像

スタンドアロン モードの設定メニュー:

スタンドアロン モードの設定メニュー

ホストのプラグインとしての設定メニュー:

ホストの設定メニュー

黒い文字の色を変えるだけでいいのですが、できないようです。

4

1 に答える 1

2

VCL フォームの場合、CreateParams をオーバーライドし、Params.WndParent を所有ウィンドウに設定する必要があります。私が理解しているように、それはあなたのOpenGLウィンドウになります。

procedure TMyForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := MyOpenGLWindow;
end;

共通ダイアログ クラスには、ウィンドウ ハンドルを受け取る Execute オーバーロードがあります。OpenGL ウィンドウのハンドルを渡すと、その OpenGL ウィンドウがダイアログのオーナー ウィンドウになります。

フォームが奇妙にレンダリングされる件に関して、決定的なアドバイスを与えることは困難です。私の推測では、ホスト アプリがテーマを有効にしていないことが原因であると思われます。ホストを制御している場合は、そこで修正してください。それ以外の場合は、アクティベーション コンテキストを使用する必要があります。この質問に対する私の回答は、サンプル コードを示しています。

于 2013-04-05T18:26:34.920 に答える