启动线程后,接受到一个对话框传过来的this指针。通过this指针引用这个对话框中的变量和函数,在这个对话框类中定义了一个CListCtrl控件。我想在线程中创建这个CListCtrl控件,但创建不成功。谁知道这种情况,如何在线程中创建CListCtrl控件,
主要是获取不到CListCtrl::Create()的*pParentWnd.希望各位高手帮忙,谢谢

解决方案 »

  1.   

    pParentWnd就是线程接受的this阿
      

  2.   

    LPVOID param为线程接收到的对话框参数
    (CDlg *)p = (Cdlg*)param;
    p->list.Create(style,CRect,p,0,1);
    执行后出错,请告之
      

  3.   

    察看msdn
    CListCtrl Create方法,下面有例子
      

  4.   

    UINT ThreadForStatusMonitor(LPVOID param)
    {
    ((CPinDlg*)param)->ls.Create(   WS_VISIBLE | WS_BORDER|LVS_REPORT   ,
       CRect(0,0,400,200), (CPinDlg*)param, 1144);
    ((CPinDlg*)param)->ls.ShowWindow(SW_SHOWNORMAL);
    //((CPinDlg*)param)->ls.RedrawItems(0,1);
    //((CPinDlg*)param)->ls.UpdateWindow();
    //AfxMessageBox("a");
    //((CPinDlg*)param)->ls.DestroyWindow();
    return 0;
    }
    void CPinDlg::OnButton4() 
    {
    // TODO: Add your control notification handler code here
    ::AfxBeginThread(ThreadForStatusMonitor,this,THREAD_PRIORITY_NORMAL,0,NULL);
    }
    ls为CPinDlg的CListCtrl成员变量
    搞笑的事,创建成功了,但是显示不出来
    如果再线程里加上这句AfxMessageBox("a");
    就可以显示出来,点击确定,再次消失
    期待搞人解答
      

  5.   

    任何窗口都必须从属于一个特定的线程,这样对它发的消息才能有个去处。
    窗口所属线程,由调用CreateWindowsEx的线程决定,哪个线程创建的窗
    口,哪个线程就拥有该窗口。
    在一个线程里创建子窗口,而主窗口从属于另一个线程,你想想这会是多大
    的混乱?据我所知,没有哪个函数可以修改窗口与线程的从属关系。不过,
    GetWindowThreadProcessId、AttachThreadInput和
    GetCurrentThreadID这几个函数或许能解决你的问题(还要注意,即使这
    样做,你的后台线程必须拥有自己的消息循环,否则这个CListCtrl无法接
    收消息)。我对AttachThreadInput这个函数也只有很少的使用经验,所以不是很有
    把握。不过,就我尝试的情况看,它似乎异常强大,连跨进程都可以。但因
    为文档太少,不了解它的局限和特性,而且它的功能也太奇怪,所以并不推
    荐你为了这么点困难而动用它,最好还是改为在主线程里创建所需的控件。