直接用CWnd* b=(CWnd *)m_hWnd; 是不是有问题。但是我又不能用FromHandle()等函数,因为
static CWnd* PASCAL FromHandle( HWND hWnd );
我现在根本没有任何一个CWnd*类型的东西,只有一个HWND,
所以用不了FromHandle.
有什么其他的方法比如用全局函数可以做到吗?

解决方案 »

  1.   

    CWnd *b = CWnd::FromHandle(hWnd);
      

  2.   

    你知道你的现在的m_hWnd是指向什么类型窗口的句柄吗?知道就好办了,新建一个相同类型的实例,直接把句柄粘上去就行了!
      

  3.   

    ft 
     CWnd *wnd=::FromHandle(hWnd);
      

  4.   

    to flycatmei(小梅)没有看懂你的意思,可以稍微说清楚点吗?我的HWND是一个ATL模板做出来的控件的dialog资源的句柄。就是现在在这个控件的代码里面要传CWnd*出去,但是在这个控件里面只有HWND
    即控件里的句柄。
      

  5.   

    to  DDsoft163() :
    ::FromHandle(hWnd)这个东西可以吗?编译通不过!
      

  6.   

    HWND hWnd = CyourClass::GetSafeHwnd();
    CWnd* pWnd = CyourParentClass::GetSafeOwner(CyourParentClass::GetOwner(), &hWnd);
      

  7.   

    CDialog dlg;
    dlg.m_hWnd = 你的句柄;大概就可以用了,我手头没有VC,不能帮你调试
      

  8.   

    GetSafeOwner  GetSafeHwnd  等等统统不能用,因为这些东西都是CWnd的。
    而我没有CWnd的东西,
    ----------------------------------------------
    ASSERT(::IsWindow(m_hWnd));    //ok!   m_hWnd是HWND类型,就是我的控件的句柄(控件dialog资源的句柄吧)
    CWnd* b=(CWnd *)m_hWnd;        //no errorASSERT(::IsWindow(b->m_hWnd )); //Error!
      

  9.   

    我做控件,用了一个dialog资源,那么这个dialog得句柄(CWnd*类型)可以取到吗?(这个dialog资源相当于formView的一个dialog资源)
    反正直接用m_hWnd是可以的,但是是HWND类型的。现在偏偏要传去CWnd*类型的出去
      

  10.   

    GetSafeOwner  GetSafeHwnd  等等统统不能用,因为这些东西都是CWnd的。
    而我没有CWnd的东西,
    ----------------------------------------------
    ASSERT(::IsWindow(m_hWnd));    //ok!   m_hWnd是HWND类型,就是我的控件的句柄(控件dialog资源的句柄吧)
    CWnd* b=(CWnd *)m_hWnd;        //no errorASSERT(::IsWindow(b->m_hWnd )); //Error!==================================================================================HWND hWnd = CyourClass::GetSafeHwnd();
    CWnd* pWnd = CyourParentClass::GetSafeOwner(CyourParentClass::GetOwner(), &hWnd);
    .
    .
    举个例子:
    HWND hWnd = CAboutDialog::GetSafeHwnd();
    CWnd* pWnd = CDialog::GetSafeOwner(CDialog::GetOwner(), &hWnd);
    我只保证你能正确获取CWnd,其它我不管.
      

  11.   

    我只是用这一句:
    CWnd* pWnd = CDialog::GetSafeOwner(CDialog::GetOwner(), &m_hWnd);
    因为m_hWnd大概是父类的成员,类型  HWND CWindow::m_hWnd.
    而且我用spy++看了,这个m_hWnd和控件的地址(就是抓的是那个对话框资源)是一个东西但是:
    error C2352: 'CWnd::GetOwner' : illegal call of non-static member function
      

  12.   

    HWND和CWnd* 到底是什么关系,如果转换成功的话,是不是debug看到的两个值都是一样的。
    其实我看到的HWND确实是正确的,和用spy++看到的是一个东西,比如都是000E0580, class:#32770 dialog.只是直接用CWnd* b=(CWnd *)m_hWnd;    结果b->m_hWnd是没有值的。
      

  13.   

    楼主 CWnd* b=(CWnd *)m_hWnd;
    的意图看书,你是想通过一个句柄来获得一个指向窗口的指针,那么
    CWnd* hwnd = CWnd::FromHandle (m_hWnd);
    应该是可以用的.看MSDN:
    Returns a pointer to a CWnd object when given a handle to a window. If a CWnd object is not attached to the handle, a temporary CWnd object is created and attached. 上面就是说如果没有窗口跟该句柄联系在一起,那么会创建一个临时的窗口对象,并跟该句柄联系在一起.