2011-06-28 43 views
1

我正在開發MFC應用程序並將其導出到dll中。該應用程序只有一個窗口,我希望該窗口無模式。裏面的InitInstance(),如果我希望它是模式的,我只需要做到這一點:具有主窗口作爲非模態對話框的MFC應用程序

AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
CUIWelcomeDlg dlg; 
m_pMainWnd = &dlg; 
INT_PTR nResponse = dlg.DoModal(); 
if (nResponse == IDOK) 
{ 
    // TODO: Place code here to handle when the dialog is 
    // dismissed with OK 
} 
else if (nResponse == IDCANCEL) 
{ 
    // TODO: Place code here to handle when the dialog is 
    // dismissed with Cancel 
} 
return false; 

它工作得很好,作爲一個模式。這是無模式的代碼:

AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
CUIWelcomeDlg * dlg; 
dlg=new CUIWelcomeDlg(); 
m_pMainWnd=dlg; 
if(dlg!=NULL) { 
    dlg->Create(IDD_UIWELCOME_DIALOG,NULL); 
    dlg->ShowWindow(SW_SHOW); 
} 
return true; 

我試圖調試它。直到它迴歸真實,這是好的;之後,對話窗口凍結並且沒有響應。有誰知道如何解決這一問題?

+0

出於好奇,僅:基於模式的基於對話框的應用程序有什麼意義?什麼情況下有必要? – MikMik

回答

0

嘗試刪除以下行:
m_pMainWnd = dlg;

(如果dlg是一個指針,你應該把它稱爲pdlg)。

0

你需要實現你自己的無限循環。當然,你不想停止UI線程的響應,所以你需要在這個循環中捕獲和發送消息。嘗試在ShowWindow之後添加此代碼:

MSG msg; 

// Handle dialog messages 
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
{ 
    if(!IsDialogMessage(&msg)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 
+0

嗯,其實我不是很明白,但是不是這個無限循環?那麼如果我在ShowWindow之後(InitInstance內部)執行此操作,InitInstance將永遠不會返回? – user654894

+0

是的,沒有。它是無限循環,但是您正在處理該循環內的消息,因此它將處理關閉窗口消息,並且應用程序將結束。我會試一試......但當然取決於你。 –

相關問題