我定义了一个线程函数:
static DWORD WINAPI SplitThread(LPVOID lpparam);
有一个文本框,ID为: IDC_INFODWORD WINAPI CSplitDlg::SplitThread(LPVOID lpparam)
{
    CString Str="要输出的结果.";    //我要在这个线程函数里把Str的值赋给文件框 IDC_INFO ,我要怎样实现呀.我用了GetDlgItem(IDC_INFO)->GetWindowText(Str,100);或者SetDlgItemText(IDC_INFO,Str);或者 UpdateData(False);这些方法,都出错.请问有什么办法解决这个问题?}

解决方案 »

  1.   

    可以在线程函数里 使用POSTMESSAGE发送一个自定义消息到窗口类,注意,你要设置的字符串作为消息的参数传送过去。然后在那个自定义消息的映射函数里设计就不会出现问题了
      

  2.   

    你用SetDlgItemText的错误是什么?一般应该有效的!文本框的窗口类是操作系统提供的,你不用管,可以向其直接发送 WM_SETTEXT 消息,它自己会处理!
      

  3.   

    关键是你的线程是怎么创建的,如果是mfc的程序请使用afxbeginthread来建立线程,否则使用mfc类时会出错。因为工作线程下mfc的线程状态不对。
      

  4.   

    SetDlgItemText的错误是,如下:
    error C2352: 'CWnd::SetDlgItemTextA' : illegal call of non-static member function
            d:\program files\microsoft visual studio\vc98\mfc\include\afxwin.h(2156) : see declaration of 'SetDlgItemTextA'
    它说非法的非静态函数调用.因为线程函数是对话框的成员函数,所以设置成static类型的.
      

  5.   

    线程是用API函数CreateThread()创建的.
      

  6.   

    to lz:
    如果,线程是用API函数CreateThread()创建的.那么使用CWnd里的方法非常容易出错,M$也建议你使用AfxBeginThread,记住:AfxBeginThread不仅仅是CreateThread函数的简单封装,还做了不少工作和mfc的库做了配合,其中包括mfc有好多内部全局对象的,
      

  7.   

    static DWORD WINAPI SplitThread(LPVOID lpparam);其中的参数lpparam传进去dlg的实例。
    使用CDlgXXX *pDlg = (CDlgXXX *)lpparam; pDlg->GetDlgItem(IDC_INFO)->SetWindowText(Str);
      

  8.   

    如果您看过候杰翻译的书,您就会知道万无一失的方法是用SendMessage();PostMessage不行,因为PostMessage()相当于是异步,非阻塞的,调用SendMessage相当于执行了上下文切换
      

  9.   

    个人认为自定义一个消息,
    再SendMessage
      

  10.   

    最简单的办法:为文本框添加一个Control类变量medit;CString Str="要输出的结果.";然后直接调用成员函数medit.SetWindowTextW(Str);就OK了!