我用的CButtonST类,想捕获该类的WM_LBUTTONDOWN消息,怎么在父窗口中捕获按钮的WM_LBUTTONDOWN消息?我对CButtonST进行继承,生成的新类中对WM_LBUTTONDOWN进行处理,把消息转发到父窗口,但是这样导致按钮上按下鼠标左键后,按钮外观没有改变,正常应该是按钮陷下去,请问如何解决?void CButtonSTEx::OnLButtonDown(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
CButtonST::OnLButtonDown(nFlags, point);
CPoint pt(point);
ClientToScreen(&pt);
    GetParent()->ScreenToClient(&pt);
GetParent()->PostMessage(WM_LBUTTONDOWN , nFlags, MAKELONG(pt.x , pt.y)); 
}
谢谢!

解决方案 »

  1.   

    如果是这样,你使用::PostMessage(hWnd,WM_LBUTTONDOWN , nFlags, MAKELONG(pt.x , pt.y));试试,Hwnd是对话框的Hwnd,可以使用GetSafeHwnd()获得,然后传入 CButtonSTEx就可以了
      

  2.   

    你最好还是在使用的地方直接映射WM_LBUTTONDOWN 消息。在对话框程序中,拖放一个Button控件,然后在Classwizard中定义一个Button变量,在头文件中找到将CButton改为CButtonSTEx就应该可以了!
      

  3.   

    为什么还要把WM_LBUTTONDOWN发给父窗口??
      

  4.   

    WM_LBUTTONDOWN不能发送给父窗口吧,只有WM_COMMAND消息才能发送给其他类响应(好像是吧).
      

  5.   

    你大概理解错了继承类和子窗口的概念了。你既然继承了CButton类,也就是说,你通过新类创建了一个Button窗口,此窗口的父窗口应该是对话框之类的。这样的话,你为什么还要传递WM_LBUTTONDOWN给父窗口呢。
    如果我没有理解错误的话,你需要的是WM_LBUTTONDOWN操作后所发生的操作,直接在刚才那个函数中定义即可了。如果需要告诉父窗口,此Button被按下了(记住,父窗口需要的是一个过程,不是一个状态),你可以在函数中保留CButtonST::OnLButtonDown(nFlags, point),或者在别的函数中通过
    GetParent()->SendMessage(WM_COMMAND, GetDlgCtrlID(), NULL)也可。
      

  6.   

    void CButtonSTEx::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    CButtonST::OnLButtonDown(nFlags, point);//这里去掉试试
    CPoint pt(point);
    ClientToScreen(&pt);
        GetParent()->ScreenToClient(&pt);
    GetParent()->PostMessage(WM_LBUTTONDOWN , nFlags, MAKELONG(pt.x , pt.y)); 
    }
    有点不明白你的代码,你在这个函数开始的时候,已经调用了基类的OnLButtonDown()函数了,为什么你后来又要用PostMessage继续传一个鼠标左键按下的消息呢?你先把我注释那行去掉试试看。
      

  7.   

    westwind999(书山云) ,我没有理解错继承和子窗口的概念,我是想在对话框中知道按钮按下的消息,做相应的处理。在对话框中直接用WM_LBUTTONDOWN消息的映射是不行的,因为只有点到对话框的空白地区才会向对话框发送WM_LBUTTONDOWN消息。