2015-04-29 52 views
1

我想在MFC中創建一個對話框,一旦出現它,它就不會失去焦點。 這是爲了阻止用戶在處理數據時訪問主SDI窗口。該流程類似於:MFC創建不失焦點的無模式對話框

  1. 用戶觸發過程
  2. 應用程序顯示的對話框
  3. 應用程序啓動過程中的作用

我不能跟一個模態對話框做到這一點,因爲DoModal()函數直到對話框關閉纔會返回,所以這將永遠不會觸發第3步。

這怎麼辦?

編輯

這些是用於通知任務的開始和任務結束的功能:

void CmodguiApp::_notify_task_start() { 
    _processing_dialog->DoModal(); 
} 

void CmodguiApp::_notify_task_end() { 
    _processing_dialog->EndDialog(1); 
} 

這是觸發任務過程的代碼:

void trigger_task(std::function<void()> f) { 
    CmodguiApp::_notify_task_start(); 
    f(); 
    CmodguiApp::_notify_task_end(); 
} 
+0

啓動一個線程並在那裏進行處理。 –

+0

在一個線程中運行你的任務。您可以在'WM_INITDIALOG'處理程序中啓動線程,以確保當線程完成並且您想關閉對話框時,對話句柄將可用。 –

+0

@MichaelWalz我的處理是在一個單獨的線程內完成的,但是CmodguiApp :: _ notify_task_start();和CmodguiApp :: _ notify_task_end();必須在該線程中調用 – manatttta

回答

1

嘗試使用以下方法:

  1. 調用

    _processing_dialog->DoModal();

  2. 在進程對話框類做酌情:

    AfxGetApp()->GetMainWnd()->SendMessage(WM_YOUR_USER_MESSAGE)

  3. 在主窗口類的消息映射添加

    ON_MESSAGE(WM_YOUR_USER_MESSAGE, YourUserMessageHandlerFunction)

  4. 執行YourUserMessageHandlerFunction()。現在,您已重新在主窗口處進行處理。

相關問題