我想在MFC Dialog上打印文本

时间:2014-11-23 18:34:38

标签: mfc

我创建了一个线程来在Lobby Dialog上的EditBox上设置一些文本。以下是我的代码。 而MainLobby是Dialog Class。该项目是“基于对话的MFC项目”。

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。我很高兴一个好主意。

4 个答案:

答案 0 :(得分:0)

必须更新设备上下文 试试:

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

或者尝试使用IDC LOBBY CBOX的CString成员变量。

答案 1 :(得分:0)

从您的代码中可以清楚地看出,您没有正确使用MFC。基于Windows对话框的应用程序不需要程序员显式创建消息处理程序或接收器,这就是MFC框架本身正在为您做的事情。作为DoModal方法的一部分,在启动对话框消息循环之前没有理由调用beginthreadex。在从Dialog或DialogEX下载的任何类上调用DoModal时,将构造窗口,构造成员对象,并在显示对话框窗口之前将WM_INITDIALOG消息发送到对话框以进行任何其他初始化之前启动消息循环。显示窗口后,消息循环正在运行,当您正确发送文本时,文本将自动显示在编辑控件中。通常,可以使用visual studio中的类向导声明具有某个名称的CEdit对象,然后将MFC对象映射到对话框对象。我会参考这篇文章而不是输入所有细节:http://msdn.microsoft.com/en-us/library/6d1asasd.aspx

答案 2 :(得分:0)

在调用DoModal之前,尚未初始化对话框的HWND。所以你的线程没有收到正确的HWND。您可以访问正确的HWND值的第一个位置是对话框的OnInitDialog成员函数。

答案 3 :(得分:0)

我在你的代码中看到了两个问题。

首先,您在Lobby.GetSafeHwnd之前调用DoModal,因此在构建窗口之前。您应该将线程创建移动到MainLobby的WM_INITDIALOG处理程序以在那里创建线程。或者你可以创建一个无模式对话框。

其次,您在MFC代码中使用_beginthreadex。如果您正在启动使用MFC的线程,则需要使用AfxBeginThread启动该线程。如果您只使用CRT,则使用_beginthreadex。如果您不使用,请使用Windows CreateThread。原因是每层(CRT,MFC)需要对线程特定信息进行一些内务处理。只有在调用正确的线程创建函数时才能执行此操作。

第三,您可以考虑使用像CAsyncSocket这样的MFC套接字对象。如果套接字上有一些数据,则此对象可以将Windows消息发送到对话框。这非常适合您的场景,其中MFC对话框应该处理套接字数据。

另一件事,但你已经做对了:要访问MFC GUI对象,你需要在该GUI对象的线程中。因此,需要使用原始句柄hDlg调用Windows SetDlgItemText,这里不能调用MFC函数。

顺便说一句,你确定你的总体战略是对的吗?我不知道你如何处理对话的生命周期,插座的生命周期以及如何将它们放在一起。