subclasswindow函数:
 1.我们对该窗体实例调用成员函数将会直接改变相关窗体句柄对应的窗体(Attach)   
 2.系统传给相关窗体句柄的消息会先经过该窗体实例的消息映射(SetWindowLong)。  但是学习的一个sample中 我把m_sBar.SubclassWindow(m_hWndStatusBar);替换成m_sBar.Attach(m_hWndStatusBar);
 替换之后m_sBar.SetText(1, " Distorted icon. ");便无法显示 
 想问下什么情况下用subclasswindow 什么情况下用attach   

解决方案 »

  1.   

    SubclassWindow完成了两项功能:   
        
    我们对该窗体实例调用成员函数将会直接改变相关窗体句柄对应的窗体(Attach)   
    系统传给相关窗体句柄的消息会先经过该窗体实例的消息映射(SetWindowLong)。   
      

  2.   

    看一下SubClassWindow函数的定义就知道了
    BOOL CWnd::SubclassWindow(HWND hWnd)
    {
    if (!Attach(hWnd))  //注意这里调用了Attach
    return FALSE; // allow any other subclassing to occur
    PreSubclassWindow(); // now hook into the AFX WndProc
    WNDPROC* lplpfn = GetSuperWndProcAddr();
    WNDPROC oldWndProc = (WNDPROC)::SetWindowLong(hWnd, GWL_WNDPROC,
    (DWORD)AfxGetAfxWndProc());  //设置重新设置窗口的窗口函数
    ASSERT(oldWndProc != (WNDPROC)AfxGetAfxWndProc());  if (*lplpfn == NULL)
    *lplpfn = oldWndProc;   // the first control of that type created return TRUE;
    }
      

  3.   

    大哥 说点我没说的吧 我想知道到底什么时候应该用Attch 什么时候用subclasswindow
      

  4.   

    简单来说呢,
    subclasswindow实现了Attach,
    且替换原来窗口的WndProc 函数.
    subclasswindow相当与调用了Attach,
    再调用SetWindowLong
      

  5.   

    可以这么说吗:这么区分 只是改变窗体显示的用Attach 需要覆盖在上面并且自己接收处理消息的 用subclasswindow
      

  6.   

    不需要设置窗体的时候,直接Attach即可。
      

  7.   

      Attach()就是将WINDOWS窗口句柄与CWnd对象相连接  
      通常用在已存在内存实例对象与CWnd对象相连接  
      只样的意思是实例对象已被创建,但没有相对应的抽象类给以操作,用CWnd连接后就以CWnd对象来替代实例对象操作.
      Attach不会对你的窗口产生任何的影响
      

  8.   

    你可以这么理解。看Attach这个名字就能猜到什么意思了
      

  9.   

    回复七楼
    subclasswindow更多的是代表依附 这样去理解可以不
      

  10.   

    attach是为了操作窗口 subclasswindow更多是为了依附在那个窗体上 做自身类想要的动作
      

  11.   

    ls各位大大都已经讲的很清楚了。简单点来说,就是subclasswindow可以接收到消息,Attach不可以。