如题:基于对话框的程序,主进程创建一个线程后,在线程执行的过程中,需要修改对话框上面的CEdit控件的显示内容,怎样实现???
有人说在线程中发消息给窗口,可是怎样发呀,我是菜鸟,谁有这方面的示例给我看一下!!!!!

解决方案 »

  1.   

    直接用SendMessage或是PostMessage都可以啊
      

  2.   

    代码自己写吧,你先得对话框HWND,可以用全局变量保存,也可以用FindWindow去找。然后用SetDlgItemText改变上面控件的显示内容更方便一点。
      

  3.   

    void YCThreadFunc(void *pDlg)
    {CDataTransferDlg * m_pDlg = (CDataTransferDlg *) pDlg;CByteArray YCDarraySend; 
    CString YCStrTemp,YCStrSend;
    DataRelay ThreadDataRelayObj;ThreadDataRelayObj.YCPackNum=0;
    ThreadDataRelayObj.AnalogInfoRelay();      HWND hh;
    hh=GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_EDIT_List);//这里出错,报异常
    SetWindowText(hh,"");
    hh=GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_EDIT_List);
    SetWindowText(hh,m_pDlg->DataRelayObj.Str_data);
    hh=GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_STATIC_YCDX);
    SetWindowText(hh,m_pDlg->DataRelayObj.Str_YCDXCount); if (ThreadDataRelayObj.YCPackNum==0)
    return;//对象数为零则返回 
      unsigned char ycdata[64];
    int Current;
    Current=0; 
    for (int i=0;i<ThreadDataRelayObj.YCPackNum;i++)
    {
    if (ThreadDataRelayObj.YCdata[Current]=='!')
    {
    memset(ycdata,0,64);
    for (int j=0;j<64;j++)//单帧

    ycdata[j]=ThreadDataRelayObj.YCdata[Current+j];
    YCStrTemp.Format("%d ",ThreadDataRelayObj.YCdata[Current+j]);
    YCStrSend+=YCStrTemp;

    ThreadDataRelayObj.SendDataToComm(ycdata,64);
    YCStrSend+="\r\n\r\n";   
    Write_Log("YCSendLog",YCStrSend);//这里报异常提示要中断程序
    YCStrSend.Empty();
    YCStrTemp.Empty();
    Current+=64;
    }Sleep(47);}}
    void CDataTransferDlg::OnTimer(UINT nIDEvent)
    {
      switch(nIDEvent)
    {
    case ID_TIMER1: //每15s
    hThreadYC=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)YCThreadFunc,NULL,0,NULL);break;}
    CDialog::OnTimer(nIDEvent);
    }
    void Write_Log(CString LogName , CString LogStr)
    {
    SYSTEMTIME sysname;  
    GetLocalTime( &sysname );  
    CString LogTxt;
    LogTxt.Format("%4d_%02d_%02d",sysname.wYear,sysname.wMonth,sysname.wDay);  
    LogTxt+=".txt";
    CString Log_Name;
    Log_Name=LogName;
    Log_Name+=LogTxt;//得到日志文件名SYSTEMTIME sys;  
    GetLocalTime( &sys );
    CString LogTime;
    LogTime.Format("%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d\r\n",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek);  
    CFile filelog;  
      filelog.Open(Log_Name, CFile::modeReadWrite|CFile::modeCreate|CFile::modeNoTruncate,0);
    filelog.SeekToEnd();
    filelog.Write(LogTime,LogTime.GetLength());   
    filelog.Write(LogStr,LogStr.GetLength());
    filelog.Flush();
    filelog.Close();
    }
      

  4.   

    你上面的代码里有SendMessage?
      

  5.   

    hh=GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_EDIT_List);//这里出错,报异常
    =============
    你的代码好像是将对话框指针传进了线程函数中去了,但是你后面又没有用到这个指针,直接改成m_pDlg->SetDlgItemText(....)不是更好。
    另外,传送对话框指针给线程函数的做法应该是不安全的,建议用FindWindow去找主窗口,通过API进行处理。
      

  6.   

    又发一贴啊,lz的上一贴已经回复过了http://topic.csdn.net/u/20100510/21/2231c257-86ff-41cd-8e9f-c91cf1eb8d24.html?81230
      

  7.   

    自己定义消息 
    #define WM_MYMESSAGE (WM_USER+100)
    在处理消息的类类中加入
    afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);
    添加消息处理宏BEGIN_MESSAGE_MAP(CMFcTestDlg, CDialog)
    ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
    END_MESSAGE_MAP()消息处理函数
    LRESULT CMFcTestDlg::OnMyMessage(WPARAM wParam,LPARAM lParam)

       m_edit.SetWindowText(reinterpret_cast<LPCTSTR>(lParam));
       return 0;
    }线程
    DWORD WINAPI MyThread( LPVOID lpParam ) 
    {
    HWND h = (HWND)lpParam;
    ::PostMessage(h, WM_MYMESSAGE, NULL, LONG(_T("Test")));
    return 0;
    }void CMFcTestDlg::OnBnClickedButton2()
    {
    DWORD ThreadId;
    ::CloseHandle(::CreateThread(NULL, 0, &MyThread, LPVOID(GetSafeHwnd()), 0, &ThreadId));
    // TODO: 在此添加控件通知处理程序代码
    }
      

  8.   

    API函数  postmessage  或者是  sendmessage;  来发送消息,创建线程的时候,通过参数将  窗口句柄传递进来
      

  9.   

    使用sendmessage;在头文件中自定义消息就可以了
      

  10.   

    window程序设计和MFC技术内幕都可以看
      

  11.   


    除了这个,我通常还会做一个全局指针指向m_pMainWnd 传递消息..
    不知道这样感觉哪个好
      

  12.   

    如果你是改变某个CEdit控件的内容,可以这样发消息 SendMessage(cedit_hwnd,WM_SETTEXT,"AAAAAAAA",0);
    sendmessage会等消息 处理 完生才返回
    postmessage只管发,不管是否处理都直接返回
      

  13.   

    SendMessage(hWnd, message, param, param)