要在程序中用線程技術打開一個非模態對話框,但結果對話框總是一閃而過。查了一些資料,找到了這一篇文章 :線程中啓動非模態對話框。根據裏面所寫敲代碼結果還是不行。再做了部分更改後,終於成功了。如下:
顯示對話框代碼:
void ChargeByCoinAcceptorForm::show()
{
Sleep(2000);
HANDLE hPrompThread=StartPromptThread();
//Sleep(0);
WaitForSingleObject(hPrompThread,INFINITE);
}
在StartPromptThread中創建線程:
HANDLE ChargeByCoinAcceptorForm::StartPromptThread(){
return CreateThread(0,0,(LPTHREAD_START_ROUTINE)RunPromptDialog,this,0,0);
}
在RunPromptDialog中利用Create方法創建非態對話框,並在末尾添加消息循環代碼(這很重要):
void RunPromptDialog(LPVOID Param)
{
ChargeByCoinAcceptorForm* chargeForm = (ChargeByCoinAcceptorForm*)Param;
chargeForm->Create(IDD_DIALOG1,NULL);
chargeForm->UpdateData();
chargeForm->ShowWindow(SW_SHOW);
while (TRUE)
{
MSG msg;
::GetMessage( &msg, chargeForm->m_hWnd, NULL, NULL );
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
}
在這樣的處理之後,便可以在子線程中彈出一個非模態對話框了。不過原理是什麼,爲什麼要在Create之後再加一個消息循環代碼,還望大神解釋。