2014-11-23 57 views
0

我在Lobby對話框的EditBox上設置了一個線程來設置一些文本。以下是我的代碼。 MainLobby是對話框類。該項目是「基於對話框的MFC項目」。我想在MFC Dialog上打印文本

MainLobby Lobby; 
_beginthreadex(NULL, 0, ReceiveMessage, (void *)Lobby.GetSafeHwnd(), 0, NULL); 
Lobby.DoModal(); 

但它不起作用。哪裏錯了?我很努力,但我找不到答案。 我試過Lobby.GetSafeHwnd(),但Lobby.m_hwnd

unsigned WINAPI ReceiveMessage(void *arg) 
{ 
    HWND hDlg = (HWND)arg; 

    char msg[BUF_SIZE]; 
    int msgLen; 

    while((msgLen = recv(CClientApp::hSocket, msg, BUF_SIZE, 0)) != 0) 
    { 
     SetDlgItemText(hDlg, IDC_LOBBY_CBOX, msg); 
    } 
} 

我現在用MFC。我會很高興一個好主意。

回答

0

設備上下文必須更新。
嘗試:

UpdateData(true); 
SetDlgItemText(hDlg, IDC_LOBBY_CBOX, msg); 
UpdateData(false); 

或者與IDC大堂CBOX CString成員變量嘗試。

0

從代碼中可以清楚地看到,您沒有正確使用MFC。基於Windows對話框的應用程序不需要程序員明確地創建消息處理程序或接收器,這就是MFC框架本身爲您做的。在作爲DoModal方法的一部分啓動對話框消息循環之前,沒有理由調用beginthreadex。當你在任何一個從對話框或對話框後退的類上調用DoModal時,窗口被構造,構造成員對象,並且在WM_INITDIALOG消息被髮送到對話框之前啓動消息循環,以便在對話窗口顯示之前進行任何其他初始化。一旦窗口顯示,消息循環正在運行,並且文本將在您正確發送時自動顯示在編輯控件中。通常,在Visual Studio中使用類嚮導聲明一個名爲CEdit的對象,然後將MFC對象映射到對話對象。我不會列出所有的細節,我會參考這篇文章:http://msdn.microsoft.com/en-us/library/6d1asasd.aspx

0

在調用DoModal之前,對話框的HWND尚未初始化。所以你的線程沒有收到正確的HWND。您可以訪問正確的HWND值的第一個位置位於對話框的OnInitDialog成員函數內部。

0

我在代碼中看到兩個問題。

首先,您在DoModal之前撥打Lobby.GetSafeHwnd,以便在構建窗口之前。您應該將線程創建移動到MainLobby的WM_INITDIALOG處理程序以在那裏創建線程。或者你可以創建一個無模式的對話框。

其次,您在MFC代碼中使用_beginthreadex。如果您正在啓動使用MFC的線程,則需要使用AfxBeginThread啓動該線程。如果你只使用CRT,那麼你使用_beginthreadex。如果您不使用,則使用Windows CreateThread。原因是每個圖層(CRT,MFC)需要對線程特定的信息進行一些管理。這隻能在您調用正確的線程創建函數時完成。

第三,你可能會考慮使用MFC套接字對象,如CAsyncSocket。如果套接字上有一些數據可用,該對象可以將Windows消息發送到對話框。這完全適合您的方案與應該處理套接字數據的MFC對話框。

另一件事,但你已經明白了:要訪問一個MFC GUI對象,你需要在該GUI對象的線程中。因此,使用原始句柄hDlg調用Windows SetDlgItemText需要完成,因此您無法在此處調用MFC函數。

順便說一句,你確定你的整體策略是正確的嗎?我沒有看到你如何處理對話生命時間,套接字的生命週期以及你如何把它們放在一起。