2014-06-20 76 views
0

嘗試運行簡單的MFC應用程序,但由於程序終止而關閉,假設我需要在單獨的線程中運行對話框,但無法解決問題。啓動時關閉的MFC應用程序

這裏是到目前爲止的代碼:

CWinApp theApp; 

using namespace std; 

int main(int argc, TCHAR* argv[], TCHAR* envp[]) 
{ 
    int nRetCode = 0; 

    HMODULE hModule = ::GetModuleHandle(NULL); 

    theApp.InitApplication(); 
    theApp.InitInstance(); 
    theApp.Run(); 

    AfxWinTerm(); 

    if (hModule != NULL) 
    { 
     // initialize MFC and print and error on failure 
     if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0)) 
     { 
      // TODO: change error code to suit your needs 
      _tprintf(_T("Fatal Error: MFC initialization failed\n")); 
      nRetCode = 1; 

     } 
     else 
     { 
      MyDialog *mdlg = new MyDialog(); 
      mdlg->Create(IDD_MDLG, theApp.m_pMainWnd); 
      mdlg->ShowWindow(true); 

     } 
    } 
    else 
    { 
     // TODO: change error code to suit your needs 
     _tprintf(_T("Fatal Error: GetModuleHandle failed\n")); 
     nRetCode = 1; 
    } 

    return nRetCode; 
} 

必須有簡單的東西,我可以做從終止保持程序,只是不知道如何?

回答

2

,不再撥打電話:

mdlg->ShowWindow(true); 

你應該做的:

mdlg->DoModal(); 

另外,我不認爲你需要Create。如果你想留在無模式對話框中,那麼你應該在從main返回之前創建消息循環 - 像這樣的東西http://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows

+0

看着這一點,但我的班(從一個CDialog繼承)沒有成員「DoModel」? – user3047190

+0

如果這是MFC CDialog,那麼它肯定確實有DoModal(通過繼承):http://msdn.microsoft.com/pl-pl/library/619z63f5.aspx – marcinj

+0

是的我是一個白癡,我得到一個調試斷言失敗: //無法在已構建爲無模式的對話框上調用DoModal \t ASSERT(m_hWnd == NULL); – user3047190

1

據我看到你創建了一個Win32控制檯應用程序並嘗試添加一個GUI到它?如果你真的需要控制檯,你應該這樣做。如果沒有,那麼最好創建一個新項目,選擇MFC應用程序模板並選擇基於對話框的應用程序。該向導將創建您所需的全部內容。

順便說一句,你

MyDialog *mdlg = new MyDialog(); 
mdlg->Create(IDD_MDLG, theApp.m_pMainWnd); 
mdlg->ShowWindow(true); 

應該更好過:

MyDialog mdlg; 
mdlg.DoModal(); 

無需針對你的情況new,所以只分配在堆棧上的對象。並DoModal做你想做的。

在我支持MFC的Win32控制檯應用程序中,我能夠顯示一個對話框。但在我的嚮導生成的代碼行不存在,那麼也許你應該將其刪除:

theApp.InitApplication(); 
theApp.InitInstance(); 
theApp.Run(); 

AfxWinTerm(); 
+0

是的,這就是我想要的,爲什麼會出現這個問題: TRACE(traceAppMsg,0,「Error:CWinThread :: PumpMessage when not permitted。\ n」); ASSERT(FALSE); ? – user3047190

+0

@ user3047190該消息何時到來?您是否重新創建了該項目,還是仍然是控制檯應用程序?錯誤何時發生? –

+0

謝謝,在接受的答案中使用維基鏈接解決了它,我知道問題與消息抽取有關,所以維基鏈接允許我創建一個消息循環來在對話按鈕和程序之間傳遞消息 - 並通過擴展保持程序打開 – user3047190

相關問題