程序里建立了几个线程
又建立了个Dialog并给该Dialog建立了个类CMYDialog
现在想在程序的子线程里发信息(字符)给这个CMYDialog
此时这个CMYDialog已经被我非模态打开
我知道两中线程发送消息的方法
1,这个我只会得GetMainWnd(),不知道怎样应用与自己新建立的类(CMYDialog)???
 CXXDlg *dlg=(CXXDlg*)AfxGetApp()->GetMainWnd();
 dlg->m_treectrl.........
2,使用PostMessage,这个用起来麻烦,没有第一个爽,而且我也
 CMyFileDlg *dlg;
 dlg->PostMessage(WM_MYTREECTRLADD,0,(LPARAM)str);我现在就是
怎样把第一个方法用于自己的新建立的类??
或则有其他更简单的方法???

解决方案 »

  1.   

    第一种、第二种都有同一个问题,如何在线程中得到对话框类对象指针,所以都不用,用API:PostMessage,注意这个不同于第二种,不过它要对话框窗口句柄
      

  2.   

    是啊,窗口句柄怎么来啊???
    我在CMYDialog非模态打开,用个全局变量或则结构体来保存它的窗口句柄
    总觉得很麻烦(我比较懒)
      

  3.   

    第一种是错的,绕过了Windows的synchronization, 不见得次次出事情,但是用顺手了,全按这个方式来,会摔得很惨,比如你直接调用CMyDialog的一个Method,从另外一个线程,里面如果有个UpdateData(),这个比较常见的语句,DDX会Crash掉.PostMessage是唯一安全的方法,你在创建子线程的时候,可以把你需要的一些数据作为Context传过去就好了.
      

  4.   

    我感觉还是第二种好,
    第一个,有可能将线程转变成UI线程,而且变量全局的或是static的,你就不感觉麻烦了?
    第二个,postmessage交给主线程不是很好吗?
      

  5.   

    问题来了啊,经过wltg2001(红猪)指点,我用API:PostMessage
    现在就是要窗口句柄
    我原先以为
    1,用全局HWND hwnd; (CXXDLg 头文件中)
    2,用结构体
    typedef struct
    {
    HWND hwnd;
    }MYSTRUCT;
    MYSTRUCT mm;
    然后在CMYDialog类建立后在其构造函数里
    hwnd=m_hWnd;或则 mm.hwnd=m_hWnd;
    这样就可以得到窗口句柄了
    可都提示: ...undeclared identifier怎么解决啊
    大家帮忙啊
      

  6.   

    xuxingok(HPMAX) 
    我不是要把消息交给主线程啊
    我是要把消息教给自己一个新建立的类 CMYDialog啊
      

  7.   

    晕,FindWindow都上来了,这次我是偷懒没希望了
    郁闷,原先以为挺简单的,没想到这么麻烦
      

  8.   

    晕,FindWindow都上来了,这次我是偷懒没希望了
    郁闷,原先以为挺简单的,没想到这么麻烦
    ===========================================
    用FindWindow应该是获取窗口句柄最好、也是最简单的做法,而且也最安全,因为只有对话框存在时才能取到。另外用它根本不麻烦:FindWindow(NULL,"对话框的标题")