之前发过类似的帖子,这次想把问题说的简单明了一点,方便大家帮我找出问题的所在,谢谢!!!在对话框上动态创建一个按钮,然后判断鼠标是否移动到按钮上,如果移动到的话,在对话框上做一些事情
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?但竟然会在离开按钮的时候会弹出见鬼了!!!
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?但竟然会在离开按钮的时候会弹出见鬼了!!!
{
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);
}
{
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消息到你要处理消息的不就好了?
{
// 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";
}
肯定没反应了.
你在按钮上捕获了 OnMouseMove,只是改变了一个bool值,没做其它的,而你在窗体的OnMouseMove里面才有反应.
你应该把弹出消息框写在按钮的OnMouseMove里面(不过最好是判断一下,只弹一次就好)
void CButtonEx::OnMouseMove(UINT nFlags, CPoint point)
{
MessageBox( "在按钮上了!" ); CButton::OnMouseMove(nFlags, point);
}
以下这个函数就不要了
void Ctest2Dlg::OnMouseMove(UINT nFlags, CPoint point)
鼠标移动到Button上以前,它肯定不弹对吧!
鼠标移动到Button上以后,按说它应该弹,但是,但是鼠标已经在另一个窗口(button)上了,那是button的事,没dialog什么事了,所以它没有动作。
鼠标离开到Button,回到dialog上时。这又是dialog的业务了。跟button没关系了,所以它又可以弹了。楼主的明白?
就用第二个嘛!!在第二个里面判断处理就行了。