你用Spy++查一下OICQ的消息,会发现OICQ有一个很密集的WM_TIMER,这个Timer就是用来检测鼠标位置的。有一阵子无聊,把这个功能实现了一下。贴出写代码来看一下就明白了。
//实现类似于OICQ靠边功能的程序#define IDT_ANIMATE 1
#define IDT_CHECK 2CTempDlg::CTempDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTempDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTempDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_bIsHide=false;
m_nSpeed=3;
m_bHasCapture=false;
m_nShowX=0;
}
//Init()在OnInitDialog中调用
void CTempDlg::Init()
{
int nPixesOK,nPixesCancel,nScreenHeight,nBorder;
POINT point;
CRect rectDlg,rectBtn;
nBorder=GetSystemMetrics(SM_CYBORDER);
nScreenHeight=GetSystemMetrics(SM_CYSCREEN);
GetWindowRect(rectDlg);
m_btnCancel.GetWindowRect(rectBtn);
nPixesCancel=rectDlg.bottom-rectBtn.top;
m_btnOK.GetWindowRect(rectBtn);
nPixesOK=rectDlg.bottom-rectBtn.top;
SetWindowPos(&wndTopMost,0,0,rectDlg.Width(),nScreenHeight,0);
GetWindowRect(rectDlg);
m_btnOK.MoveWindow(rectBtn.left,rectDlg.bottom-nPixesOK-20,rectBtn.Width(),rectBtn.Height());
m_btnCancel.MoveWindow(rectBtn.left,rectDlg.bottom-nPixesCancel-20,rectBtn.Width(),rectBtn.Height());
m_nHideX=2-rectDlg.Width();
SetTimer(IDT_CHECK,10,NULL);
}
void CTempDlg::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
CRect rect;
GetWindowRect(rect);
if(nIDEvent==IDT_ANIMATE)
{
if(m_bIsHide)
{
rect.OffsetRect(m_nSpeed,0);
if(rect.left>=m_nShowX)
{
rect.OffsetRect(m_nShowX-rect.left,0);
m_bIsHide=false;
KillTimer(IDT_ANIMATE);
}
MoveWindow(rect);
}
else
{
rect.OffsetRect(-m_nSpeed,0);
if(rect.left<=m_nHideX)
{
rect.OffsetRect(m_nHideX-rect.left,0);
m_bIsHide=true;
KillTimer(IDT_ANIMATE);
}
MoveWindow(rect);
}
}
if(nIDEvent==IDT_CHECK)
{
POINT point;
GetCursorPos(&point);
if(rect.PtInRect(point)==TRUE && m_bIsHide==true)
{
m_bIsHide=false;
AnimateShow();
}
else if(rect.PtInRect(point)==FALSE && m_bIsHide==false)
{
m_bIsHide=true;
AnimateHide();
}
}
CDialog::OnTimer(nIDEvent);
}void CTempDlg::AnimateHide()
{
m_bIsHide=false;
SetTimer(IDT_ANIMATE,5,NULL);
}void CTempDlg::AnimateShow()
{
m_bIsHide=true;
SetTimer(IDT_ANIMATE,5,NULL);
}