我想在MFC对话框上打印文本

我想在MFC对话框上打印文本,mfc,Mfc,我制作了一个线程,在大厅对话框的编辑框上设置一些文本。下面是我的代码。 MainLobble是Dialog类。该项目是“基于对话框的MFC项目” UpdateData(true); SetDlgItemText(hDlg, IDC_LOBBY_CBOX, msg); UpdateData(false); 但它不起作用。哪里错了?我努力想了想,但找不到答案。 我试着不是lobb.GetSafeHwnd()而是lobb.m_hwnd unsigned WINAPI ReceiveMessage(v

我制作了一个线程,在大厅对话框的编辑框上设置一些文本。下面是我的代码。 MainLobble是Dialog类。该项目是“基于对话框的MFC项目”

UpdateData(true);
SetDlgItemText(hDlg, IDC_LOBBY_CBOX, msg);
UpdateData(false);
但它不起作用。哪里错了?我努力想了想,但找不到答案。 我试着不是lobb.GetSafeHwnd()而是lobb.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);
    }
}
UpdateData(true);
SetDlgItemText(hDlg, IDC_LOBBY_CBOX, msg);
UpdateData(false);

我现在正在使用MFC。我很高兴有个好主意。

必须更新设备上下文。
UpdateData(true);
SetDlgItemText(hDlg, IDC_LOBBY_CBOX, msg);
UpdateData(false);
尝试:

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

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

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

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

我发现您的代码中有两个问题

UpdateData(true);
SetDlgItemText(hDlg, IDC_LOBBY_CBOX, msg);
UpdateData(false);
首先在
DoModal
之前调用
lobb.GetSafeHwnd
,因此在构建窗口之前。您应该将线程创建移动到mainLobble的
WM_INITDIALOG
处理程序,以便在那里创建线程。或者您可以创建一个无模式对话框

UpdateData(true);
SetDlgItemText(hDlg, IDC_LOBBY_CBOX, msg);
UpdateData(false);
其次,您正在MFC代码中使用
\u beginthreadex
。如果要启动使用MFC的线程,则需要使用
AfxBeginThread
启动该线程。如果只使用CRT,则使用
\u beginthreadex
。如果两者都不使用,则使用Windows
CreateThread
。这是因为每个层(CRT、MFC)都需要对特定于线程的信息进行管理。只有在调用适当的线程创建函数时才能执行此操作

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

第三,您可以考虑使用MFC套接字对象,例如“代码> CasyCocket < /Cord>”。如果套接字上有可用数据,此对象可以向对话框发送windows消息。这非常适合使用MFC对话框处理套接字数据的场景

UpdateData(true);
SetDlgItemText(hDlg, IDC_LOBBY_CBOX, msg);
UpdateData(false);
另一件事,但您已经做到了:要访问MFC GUI对象,您需要在该GUI对象的线程中。因此,需要使用原始句柄hDlg调用Windows
SetDlgItemText
,不能在此处调用MFC函数

UpdateData(true);
SetDlgItemText(hDlg, IDC_LOBBY_CBOX, msg);
UpdateData(false);
顺便问一下,你确定你的总体战略是正确的吗?我看不出你是如何处理对话生命周期、套接字生命周期以及如何将两者结合在一起的

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