之前发过类似的帖子,这次想把问题说的简单明了一点,方便大家帮我找出问题的所在,谢谢!!!在对话框上动态创建一个按钮,然后判断鼠标是否移动到按钮上,如果移动到的话,在对话框上做一些事情
PS:不想单独在按钮的派生类中做这件事!!!具体代码如下:
void CButtonEx::OnMouseMove(UINT nFlags, CPoint point)
{
ClientToScreen( &point ); CRect rectBtn;
GetWindowRect( &rectBtn );
if ( rectBtn.PtInRect( point ) )
{
m_bInBn = true;
}
else
{
m_bInBn = false;
} CButton::OnMouseMove(nFlags, point);
}void Ctest2Dlg::OnMouseMove(UINT nFlags, CPoint point)
{
if ( NULL != m_pBn )
{
if ( m_pBn->m_bInBn )
{
MessageBox( "在按钮上了!" ); 
}
} CDialog::OnMouseMove(nFlags, point);
}问题:当m_bInBn为true的时候,没有弹出MessageBox?但竟然会在离开按钮的时候会弹出见鬼了!!!

解决方案 »

  1.   

    你在派生CButton类中处理WM_MOUSEMOVE消息,来判断是不是鼠标移动到它自己上面?鼠标移开按钮呢?你有怎么判断呢?鼠标离开的话,又进不了CButtonEx的OnMouseMove函数
      

  2.   

    void CButtonEx::OnMouseMove(UINT nFlags, CPoint point)
    {
        ClientToScreen( &point );//有点好奇啊,为什么要取屏幕坐标呢?    CRect rectBtn;
        GetWindowRect( &rectBtn );
        if ( rectBtn.PtInRect( point ) )
        {
            m_bInBn = true;
        }
        else
        {
            m_bInBn = false;
        }    CButton::OnMouseMove(nFlags, point);
    }void Ctest2Dlg::OnMouseMove(UINT nFlags, CPoint point)
    {
        if ( NULL != m_pBn )
        {
            if ( m_pBn->m_bInBn )
            {
                MessageBox( "在按钮上了!" ); 
            }
        }    CDialog::OnMouseMove(nFlags, point);
    }
      

  3.   

    void CButtonEx::OnMouseMove(UINT nFlags, CPoint point)
    {
        ClientToScreen( &point );    CRect rectBtn;
        GetWindowRect( &rectBtn );
        if ( rectBtn.PtInRect( point ) )
        {
            m_bInBn = true;
        }
        else
        {
            m_bInBn = false;
        }    CButton::OnMouseMove(nFlags, point);
    }
    CButtonEx::OnMouseMove这个本来就是按钮中的移动消息吧, 干嘛还要转换坐标??
    来到这个消息里就是在按钮区域了, 没来到这个消息说明鼠标离开了按钮,
    在这个消息里postmessage或sendmessage消息到你要处理消息的不就好了?
      

  4.   

    BOOL CxxxxDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if(pMsg->message==WM_MOUSEMOVE)
    {
    CRect rc;
    CButton *pBt=(CButton *)GetDlgItem(IDC_BUTTON1);
    pBt->GetWindowRect(&rc);
    if(rc.PtInRect(pMsg->pt))//不要用AfxMessageBox()!
    afxDump << "In Button1\n";
    else
    afxDump << "Out of Button1\n";
    }
      

  5.   

    当m_bInBn为true的时候响应CButtonEx::OnMouseMove,而Ctest2Dlg::OnMouseMove是不会响应的
      

  6.   

    原因是, 你鼠标滑动到Button后 , 当然是先响应Button的mousemove, 此时标志位被置为true, 但此时dlg并没有捕获到mousemove, 因为mousemove被button捕获了, 然后你移出button,这时dlg捕获到了mousemove,而你的标志位也刚被置为true了, 就弹出messagebox。
      

  7.   


    肯定没反应了.
    你在按钮上捕获了 OnMouseMove,只是改变了一个bool值,没做其它的,而你在窗体的OnMouseMove里面才有反应.
    你应该把弹出消息框写在按钮的OnMouseMove里面(不过最好是判断一下,只弹一次就好)
      

  8.   

    改为
    void CButtonEx::OnMouseMove(UINT nFlags, CPoint point)
    {
        MessageBox( "在按钮上了!" );     CButton::OnMouseMove(nFlags, point);
    }
    以下这个函数就不要了
    void Ctest2Dlg::OnMouseMove(UINT nFlags, CPoint point)
      

  9.   

    每个窗口(button也是窗口)都会接受MouseMove消息,当鼠标移到button上后,就会调用按钮的MouseMove函数,不会调用对话框的MouseMove,你的情况在鼠标移开button那个问题就是以上原因导致的
      

  10.   

    主任说的楼主好像总是不理解首先,Button和dialog是两个独立的窗口,虽然有父子关系。
    鼠标移动到Button上以前,它肯定不弹对吧!
    鼠标移动到Button上以后,按说它应该弹,但是,但是鼠标已经在另一个窗口(button)上了,那是button的事,没dialog什么事了,所以它没有动作。
    鼠标离开到Button,回到dialog上时。这又是dialog的业务了。跟button没关系了,所以它又可以弹了。楼主的明白?
      

  11.   

    需要这么多mousemove么??只要一个就行了!!
    就用第二个嘛!!在第二个里面判断处理就行了。
      

  12.   

    zhaoxueqian1988 说的对的了解运行原理就好办了