然后在构造函数初始化成员变量
m_isSizeChanged = FALSE;m_isSetTimer = FALSE;m_hsFinished = TRUE;
m_hiding = FALSE;m_oldWndHeight = MINCY;
m_taskBarHeight = ;
m_edgeHeight = ;
m_edgeWidth=;
m_hideMode = HM_NONE;
完成了一些初始的工作那么就开始进入关键的函数实现了首先是在OnCreate做些窗口的初始化和获得一些系统信息
代码一
int CQQHideWndDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == )
return ;
// TODO: Add your specialized creation code here
//获得任务栏高度
CWnd* p;
p = this>FindWindow(Shell_TrayWndNULL);
if(p != NULL)
{
CRect tRect;
p>GetWindowRect(tRect);
m_taskBarHeight = tRectHeight();
}
//修改风格使得他不在任务栏显示
ModifyStyleEx(WS_EX_APPWINDOW WS_EX_TOOLWINDOW);
//去掉关闭按键(如果想画个按键的话)
//ModifyStyle(WS_SYSMENUNULL);
//获得边缘高度和宽度
m_edgeHeight = GetSystemMetrics(SM_CYEDGE);
m_edgeWidth = GetSystemMetrics(SM_CXFRAME);
return ;
}
接着如何知道鼠标进入或移出窗口呢?在前面我已经证明了WM_MOUSEMOVE和WM_MOUSELEAVE不符合我们的要求于是我用了WM_ NCHITTEST这个消息你可以看到我在这个消息响应函数中用了两个SetTimer一个用于检测鼠标是否离开一个用于伸缩过程不管你喜欢不喜欢要达到第点和第点这个是必须的考虑的效率问题在不需要的时候关闭这些Timer就好了
代码二
UINT CQQHideWndDlg::OnNcHitTest(CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString str;
strFormat(Mouse (%d%d)pointxpointy);
GetDlgItem(IDC_CURSOR)>SetWindowText(str);
if(m_hideMode != HM_NONE && !m_isSetTimer &&
//防止鼠标超出屏幕右边时向右边收缩造成闪烁
pointx < GetSystemMetrics(SM_CXSCREEN) + INFALTE)
{ //鼠标进入时如果是从收缩状态到显示状态则开启Timer
SetTimer(CM_ELAPSENULL);
m_isSetTimer = TRUE;
m_hsFinished = FALSE;
m_hiding = FALSE;
SetTimer(HS_ELAPSENULL); //开启显示过程
}
return CDialog::OnNcHitTest(point);
}
然后在OnTimer中
代码三
void CQQHideWndDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent == )
{
POINT curPos;
GetCursorPos(&curPos);
CString str;
strFormat(Timer On(%d%d)curPosxcurPosy);
GetDlgItem(IDC_TIMER)>SetWindowText(str);
CRect tRect;
//获取此时窗口大小
GetWindowRect(tRect);
//膨胀tRect以达到鼠标离开窗口边沿一定距离才触发事件
tRectInflateRect(INFALTEINFALTE);
if(!tRectPtInRect(curPos)) //如果鼠标离开了这个区域
{
KillTimer(); //关闭检测鼠标Timer
m_isSetTimer = FALSE;
GetDlgItem(IDC_TIMER)>SetWindowText(Timer Off);
m_hsFinished = FALSE;
m_hiding = TRUE;
SetTimer(HS_ELAPSENULL); //开启收缩过程
}
}
if(nIDEvent == )
{
if(m_hsFinished) //如果收缩或显示过程完毕则关闭Timer
KillTimer();
else
m_hiding ? DoHide() : DoShow();
}
CDialog::OnTimer(nIDEvent);
}
暂时不管OnTimer中的DoHide(); DoShow();
先来看看核心的函数之一的 FixMoving该函数在OnMoving中被调用FixMoving通过检测鼠标位置和窗口位置来决定窗口的收缩模式并修正粘附边界时窗口的位置从而达到像移动QQ时出现的效果
[] [] [] []