据书上说,CWnd,CDC,CMenu,CGdiObject及其派生类只能由生成该对象的线程来访问,在线程间传递的时候应该传递句柄,然后用FromHandle来生成自己的对象。
我自己编了个程序(vc6)试了一下,很奇怪并不是这样,清高手指教。我得程序是基于对话框的普通mfc程序,实现对话框的类是CTestThreadDlg,
对话框上我安了两个控件 ,一个编辑框(IDC_EDIT1),一个button(IDC_BUTTON1),
同时在对话框类(CTestThreadDlg)中添加了一个public访问的成员变量m_var,代码如下:
// TestThreadDlg.cpp
 ...
 UINT ThreadFunc(LPVOID p) // 线程函数,p将要接受CTestThreadDlg对象得指针
 {
         ASSERT(p != NULL);
         // ((CEdit *)p)->SetWindowText("lala");
         (CTestThreadDlg*)p)->SetDlgItemText(IDC_EDIT1, "HAHA"); // ---(1)
         ((CTestThreadDlg*)p)->m_var = 8; // --------------------------(2)
         return 0;
 }
 void CTestThreadDlg::OnButton1() // 单击button(IDC_BUTTON1)的响应函数
 {
         // TODO: Add your control notification handler code here
         AfxBeginThread(ThreadFunc, this);
         Sleep(100);
         int ret = m_var;
 }
 让我奇怪的是单击button后,编辑框(IDC_EDIT1)马上显示了“HAHA”,同时通过调试也发现了CTestThreadDlg::m_var值变成了8,也就是说,语句(1)、(2)有效,太奇怪了!(本来觉得(1)、(2)不会有效,因为在线程间传递的时候应该传递句柄)不知什么原因?