我在网上找了一些资料,大多数支持对话框中WM_MOUSEMOVE |WM_MOUSELEAVE 消息响应,可是一个很大的问题就是,我的对话框是非模态的,且边框很小,有木有呢,主要被按钮占据,而且按钮是继承的CbuttonST类,当鼠标从边框移动到按钮上时,就不能在对话框的OnMouseMove函数中响应移动事件了,这个时候OnMouseLeave函数开始响应,我明明在对话框的按钮上,却会造成对话框的隐藏怎么办呢?
终于找到一个比较不错的方法,但是还是有待改进,希望可以发现更好的方法。下面是的我的代码:
void CMainDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or calldefault
if (!m_bTracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_LEAVE | TME_HOVER;//要触发的消息
tme.hwndTrack =this->m_hWnd;
//tme.dwHoverTime = 10;// 若不设此参数,则无法触发mouseHover
if (::_TrackMouseEvent(&tme)) //MOUSELEAVE|MOUSEHOVER消息由此函数触发
{
m_bTracking = true;
//return;
}
}
CPoint pntCursor;
if ( GetCursorPos(&pntCursor ))
{
int nScreenWidth, nScreenHeight;
CCommonFun::GetPCScreenInfo(nScreenWidth,nScreenHeight);
CRect rect;
GetWindowRect(&rect);
if ( /*this ==WindowFromPoint( pntCursor ) &&*/ (m_bIsHide== TRUE))
{
ShowDlg(rect,nScreenWidth,nScreenHeight); //show the mainoperation dlg
}
}
CDialog::OnMouseMove(nFlags, point);
}
void CMainDlg::OnMouseLeave()
{
// TODO: Add your message handler code here and/or calldefault
CPoint pntCursor;
if ( GetCursorPos(&pntCursor ))
{
int nScreenWidth, nScreenHeight;
CCommonFun::GetPCScreenInfo(nScreenWidth,nScreenHeight);
CRect rect;
GetWindowRect(&rect);
if (!rect.PtInRect(pntCursor))
{
HideDlg(rect,nScreenWidth,nScreenHeight); //hide the mainoperation dlg
}
else
{
ShowDlg(rect,nScreenWidth,nScreenHeight); //show themain operation dlg
}
}
m_bTracking = false;
CDialog::OnMouseLeave();
}
至于,怎样隐藏和显示你的对话框,自己写就可以了,亲。。。