CWnd派生一个新的类,在该类定义了一个 CButton m_btnTest 在OnCreate 中:m_btnTest.Create("test",WS_CHILDWINDOW|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,CRect(10,60,50,80),this,WM_USER+1102);  但是为什么该按钮不响应任何事件?

解决方案 »

  1.   

    WM_USER+1102的响应函数有么?弄这么大干什么1102
      

  2.   

    WM_USER+1102  这个是按钮的ID你把响应写到哪里了?Message 是发给父窗口的,就是你的   CWnd派生一个新的类
      

  3.   

    问题与WM_USER+1102大小无关。ON_BN_CLICKED(WM_USER+1102, OnButtonTest)afx_msg void OnButtonTest();void CMyCWnd::OnButtonTest() 
    {
    AfxMessageBox("a");
    }
      

  4.   

    基本原因已经找到,void CMyCWnd::CMyCWnd(){
      SetCapture();//就是这个东东造成的。
    }虽然去掉它,可以解决控件响应的问题;但是出现了其它问题,比如:在new CMyCWnd();(窗体)之外的鼠标事件,它就捕获不到的。因为要求鼠标点击该窗体之外的地方,就要将其销毁。新问题
      

  5.   

    我说呢,看着代码没什么问题,勿敢妄加评论。
    但还是不对呀,
    void   CMyCWnd::CMyCWnd(){ 
        SetCapture();//就是这个东东造成的。 
    }//在构造函数里调用SetCapture();,此时窗口还没创建,不会报错??
    如果在OnCreate   中调用SetCapture();,也不会影响控件响应啊!!
      

  6.   

    贴出来的代码省掉了很多,其实我的构造函数里是调用了下面这个自定义函数BOOL CMyCWnd::Create(CPoint p, CWnd *pParentWnd, COLORREF crColour)
    {
    ASSERT(pParentWnd && ::IsWindow(pParentWnd->GetSafeHwnd())); m_pParent=pParentWnd;

    CString szClassName=AfxRegisterWndClass(CS_CLASSDC|CS_SAVEBITS|CS_HREDRAW|CS_VREDRAW,
    0,
    (HBRUSH)(COLOR_BTNFACE+1),
    0
    );
    if(!CWnd::CreateEx(0,szClassName,_T(""),WS_VISIBLE|WS_POPUP,
    p.x,p.y,115,120,
    pParentWnd->GetSafeHwnd(),0,NULL
    ))
    return FALSE;

    m_btnTest.Create("test",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(10,60,50,80),this,123);
    SetCapture(); //在这里
    return TRUE;
    }
    另外我在CMyCWnd 的MouseMove里
    加了如下代码,   DWORD pos = GetMessagePos();
        point = CPoint(LOWORD(pos), HIWORD(pos));
    CRect m_btnRect;
    m_btnTest.GetWindowRect(m_btnRect);
      if(m_btnRect.PtInRect(point)){
      ReleaseCapture();
      m_btnTest.SetCapture();
      }else{
      SetCapture();
      }
    基本符合我的要求了,不过发现有内存泄漏,问题不大了,再仔细检测应该可以搞定了。
    多谢几位参与讨论。
      

  7.   

    内存泄漏问题也解决,不是由于上面的问题引起的。void CColorPanel::OnNcDestroy() 
    {
    CWnd::OnNcDestroy();

    // TODO: Add your message handler code here
    delete this; 
    }