ショートバージョン -
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 で導入された古いファイル ダイアログをまだ使用していることに注意してください。
最後に、プラグインとして実行すると、[開く/保存] ダイアログがタスクバーのホスト アプリケーションに属しているかのように表示されます。そのため、ホストにはタスクバー タブがあります。私のアプリケーションには独自のタブもあります。開くダイアログを実行すると、ホストのタブに添付されて表示されます。
画像
スタンドアロン モードの設定メニュー:
ホストのプラグインとしての設定メニュー:
黒い文字の色を変えるだけでいいのですが、できないようです。