1.首先处理自动停靠. 1).建立一个对话框类CDlg. 2). ///dlg.h class CDlg { private: bool m_isAutoHide; //窗口是否可以自动隐藏 bool m_isWinHide; // 窗口是否隐藏 ........... }
///dlg.cpp ..... void CDlg::OnMove(int x, int y) { CDialog::OnMove(x, y); ///窗口从显示到隐藏时,不做其它操作 if(m_isWinHide) { return; } CRect tRect; GetWindowRect(tRect); if(tRect.top<10) {///如果窗口移动后的位置和到屏幕上方的距离小于10 ///就使窗口停靠到屏幕上方.
tRect.bottom-= tRect.top; tRect.top= 0; MoveWindow(tRect); ///窗口停靠后就可以自动隐藏 m_isAutoHide= true; } else { ///如窗口没有停靠就不可以自动隐藏 m_isAutoHide= false; } }
void CDlg::OnMoving(UINT fwSide, LPRECT pRect) { if((pRect->top < 10) && (!m_isAutoHide) ) {///如果窗口移动到的位置和到屏幕上方的距离小于10 ///就使窗口停靠到屏幕上方.
pRect->bottom-= pRect->top; pRect->top= 0; m_isAutoHide= true; }
CDialog::OnMoving(fwSide, pRect); } 2.处理自动收缩 //dlg.h class CDlg { ..... LRESULT OnMouseLeave( HWND hwnd, UINT msg, WPARAM wParam,LPARAM lParam ); }
//dlg.cpp BEGIN_MESSAGE_MAP(CDlg, CDialog) ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave) END_MESSAGE_MAP() .......
LRESULT CDlg::OnMouseLeave(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { if(m_isAutoHide) { CPoint tPoint; GetCursorPos(&tPoint); CRect tRect; GetWindowRect(&tRect); if(!(tRect.PtInRect(tPoint))) { m_isWinHide=true; tRect.top= tRect.top - tRect.bottom +5; tRect.bottom= 5; MoveWindow(tRect);
::SetWindowPos( ::GetDesktopWindow() ,HWND_TOPMOST,tRect.left,tRect.top ,tRect.Width(),tRect.Height () ,SWP_SHOWWINDOW); } } return TRUE; }
void CDlg::OnMouseMove(UINT nFlags, CPoint point) { if(m_isWinHide) { CRect tRect; GetWindowRect(&tRect); tRect.bottom+= (tRect.bottom-tRect.top-5); tRect.top=0; MoveWindow(tRect); m_isWinHide= false; }
TRACKMOUSEEVENT EventTrack; EventTrack.cbSize= sizeof(TRACKMOUSEEVENT); EventTrack.dwFlags= TME_LEAVE; EventTrack.hwndTrack= this->m_hWnd; _TrackMouseEvent(&EventTrack);
CDialog::OnMouseMove(nFlags, point);
}
<完成> 
|