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);
}
<完成>