2013-04-05 74 views
0

短版發揮很好 -製作VCL窗體和對話框與WINAPI窗口

我有使用WINAPI調用創建一個OpenGL窗口。我寧願保持這種方式,而不是將OpenGL包裝到VCL表單中。

爲了提供一些首選項菜單和文件對話框,我使用了VCL窗體和典型的對話框(TOpenDialog,TSaveDialog)。

我想知道的是 - 我如何獲得這些窗體和對話框來查看我的OpenGL窗口作爲它的所有者?

我試圖將窗口句柄傳遞給窗體,但我確信我正在做不正確的操作,因爲它沒有任何作用。

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

什麼是VCL窗體需要爲了看到本機窗口作爲它的所有者?

長版本 -

我的應用程序有兩種模式。獨立模式,它獨立運行。其次,在主機應用程序的進程空間中運行的插件模式爲

當處於獨立模式時,我對VCL窗體和對話框沒有任何問題。即使他們的所有權是不確定的,但它不會以任何方式影響可用性。

當處於插件模式時,我發現主機應用程序將控制我的VCL Forms的,並打開&保存對話框。

因此,當在主機的進程空間中運行時,我的VCL表單呈現出非常奇怪的狀態。我試圖手動修復它們,但它們不會響應樣式更改。

編輯 - 在對話框

我主要關注的細節是VCL形式呈現,但這裏有在對話框一些細節,如果它有什麼用途。

我執行的對話是這樣的:

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

而且它沒有任何效果。對話框的行爲與我沒有通過它的句柄相同。請記住,我使用的是Delphi 2006,此版本的Delphi仍在使用Windows XP中引入的舊文件對話框。

最後 - 作爲插件運行時,我的打開/保存對話框將出現,就好像它們屬於任務欄上的主機應用程序一樣。所以,主持人有一個任務欄選項卡。我的應用程序也有它自己的Tab。當我執行它時,我的打開對話框出現在主機的選項卡上。

圖片

偏好菜單在單機模式:

Preference Menu In Standalone Mode

偏好菜單的插件在主持人:

Preference Menu In Host

如果我可以簡單地改變顏色黑色的文字,這將是很好的恩ough,但我似乎無法做到。

回答

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?

+0

我在原始問題中增加了一些細節。但我現在正在這樣做,無濟於事。 – AudioGL 2013-04-05 18:35:04

+0

這不是回答關於窗戶所有者的問題嗎?你似乎很安靜。 – 2013-04-05 20:29:29

+0

對不起,我正在吃午飯!我會試試這個。 – AudioGL 2013-04-05 20:30:34