2011-11-10 23 views
0

我有一個名爲GUIMain的類,它爲我的程序註冊,創建並顯示一個主窗口。在這個按鈕上,當用戶點擊它時,會顯示一個額外的窗口。用C++和WinApi顯示一個額外的無模式窗口

如果我是用C#寫這個,我想有兩個選擇:

AdditionalForm myForm = new AdditionalForm(); 
myForm.ShowDialog(this); // blocking. Returns when myForm is closed; 
someOtherFunction(); 

AdditionalForm myForm = new AdditionalForm(); 
myForm.Show(this); // non-blocking. 
someOtherFunction(); // runs while myForm is still visible 

,或者心裏很不舒服,甚至這會工作:

AdditionalForm myForm = new AdditionalForm(); 
new Thread(new ThreadStart(delegate() 
    { 
    myForm.ShowDialog(this); // blocks in a separate thread 
    })).Start(); 
someOtherFunction(); // runs while myForm is still visible 

但我用C++編寫而不是C#。

我有稱爲PreviewWindow一個附加的類具有公用成員函數Register()Create(),和Show()。最後一個函數包含一個消息循環,它基本上是一個阻塞調用 - 類似於C#的ShowDialog()

如何我可以重新寫PreviewWindow::Show(),使其不具有阻塞循環:

while (GetMessage(&msg, 0, 0, 0)) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 

或者,我怎麼能稱之爲一個單獨的線程?

我目前有:

previewWindow = new PreviewWindow(hInstance, hWnd); 

previewWindow->Register(); 
previewWindow->Create(); 
previewWindow->Show();   // blocks :(
previewWindow->DisplayImage(); // never runs. 

我試圖CreateThread但它不喜歡的是,第三個參數是一個成員函數。我試過使它成爲靜態成員函數,但它似乎並不喜歡這一點。這是說DWORD(__stdcall *)()與LPTHREAD_START_ROUTINE不兼容。

回答

2

你應該只有一個事件循環,它將處理除了模態窗口之外的所有窗口(運行它們自己的消息循環來阻止UI)。那麼你的PreviewWindow::Show只是ShowWindow(handle, SW_SHOW);。一般情況下,多線程應該保存在絕對必要的時候。

+0

好的!讓我試試:) – Ozzah

+0

它的工作原理!謝謝。 – Ozzah