OICQ以及东方快车一些软件可以由用户设置隐藏到屏幕上端,鼠标划过时显示
实现起来十分简单,窗口滑动利用MoveWindow( RECT* rc, BOOL bReDraw);
检测鼠标是否划过窗口上方有三种方法
一,利用_TrackMouseEvent
具体实现:
//填加消息映射
//.......
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
//.......
//消息映射结束
void CSpDlg::OnMouseMove(UINT nFlags, CPoint point)
{
TRACKMOUSEEVENT stTRACKMOUSEEVENT;
stTRACKMOUSEEVENT.cbSize = sizeof(stTRACKMOUSEEVENT);
stTRACKMOUSEEVENT.hwndTrack=m_hWnd;
stTRACKMOUSEEVENT.dwFlags=TME_LEAVE;
_TrackMouseEvent(&stTRACKMOUSEEVENT);
CDialog::OnMouseMove(nFlags, point);
}
LRESULT CSpDlg::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
/*这里检查鼠标位置
是为了避免鼠标滑过控件时候产生的WM_MOUSELEAVE干扰正常应用*/
POINT pt;
RECT rcWindow;
GetWindowRect( &rcWindow );
GetCursorPos( &pt );
if(pt.x > rcWindow.right ¦¦ pt.x < rcWindow.left
¦¦ pt.y < rcWindow.top ¦¦ pt.y > rcWindow.bottom)/*当鼠标移动到窗口矩形外*/
MessageBox("鼠标离开了对话框",NULL,MB_OK);
return 0;
}
二,SetCapture();函数,参见MSDN,我们详细说下面的方法
三,利用WM_TIMER随时检查鼠标位置,判断是否在窗口上方。
void CAutoHideDlg::OnTimer(UINT nIDEvent)
{
POINT pt;
RECT rcWindow;
GetWindowRect( &rcWindow );
GetCursorPos( &pt );
if(pt.x > rcWindow.right || pt.x < rcWindow.left
|| pt.y < rcWindow.top || pt.y > rcWindow.bottom)
{
/*鼠标在窗口外*/
}
else
{
/*在窗口内*/
}
CDialog::OnTimer(nIDEvent);
}
算了,不说了,这部分实现起来实在是太简单,没什么好说的,想琢磨看代码吧
http://263.csdn.net/FileBBS/files/2001_6/T_150_1.zip
上面是旧的版本
下面是新的,不过都存在一个问题,详看http://www.csdn.net/expert/TopicView.asp?id=161974
http://263.csdn.net/FileBBS/files/2001_6/T_171_1.zip
本文地址:http://com.8s8s.com/it/it3374.htm