代码六void CQQHideWndDlg::DoShow()
{
if(m_hideMode == HM_NONE)
return;
CRect tRect;
GetWindowRect(tRect);
INT height = tRectHeight();
INT width = tRectWidth();
INT steps = ;
switch(m_hideMode)
{
case HM_TOP:
steps = height/HS_STEPS;
tRecttop += steps;
if(tRecttop >= m_edgeHeight)
{ //你可以把下面一句替换上面的 +=|=steps 达到取消抽屉效果
//更好的办法是添加个BOOL值来控制其他case同样
tRecttop = m_edgeHeight;
m_hsFinished = TRUE; //完成显示过程
}
tRectbottom = tRecttop + height;
break;
case HM_BOTTOM:
steps = height/HS_STEPS;
tRecttop = steps;
if(tRecttop <= (GetSystemMetrics(SM_CYSCREEN) height))
{
tRecttop = GetSystemMetrics(SM_CYSCREEN) height;
m_hsFinished = TRUE;
}
tRectbottom = tRecttop + height;
break;
case HM_LEFT:
steps = width/HS_STEPS;
tRectright += steps;
if(tRectright >= width)
{
tRectright = width;
m_hsFinished = TRUE;
}
tRectleft = tRectright width;
tRecttop = m_edgeHeight;
tRectbottom = GetSystemMetrics(SM_CYSCREEN) m_taskBarHeight;
break;
case HM_RIGHT:
steps = width/HS_STEPS;
tRectleft = steps;
if(tRectleft <= (GetSystemMetrics(SM_CXSCREEN) width))
{
tRectleft = GetSystemMetrics(SM_CXSCREEN) width;
m_hsFinished = TRUE;
}
tRectright = tRectleft + width;
tRecttop = m_edgeHeight;
tRectbottom = GetSystemMetrics(SM_CYSCREEN) m_taskBarHeight;
break;
default:
break;
}
SetWindowPos(&wndTopMosttRect);
}
BOOL CQQHideWndDlg::SetWindowPos(const CWnd* pWndInsertAfter
LPCRECT pCRect UINT nFlags)
{
return CDialog::SetWindowPos(pWndInsertAfterpCRect>left pCRect>top
pCRect>right pCRect>left pCRect>bottom pCRect>top nFlags);
}
到此程序终于完成了在我的源代码中还有对WM_SIZING的处理和定义了与之相关的宏这些主要是控制窗口在调整大小时不能超过最小的宽度和高度与QQ的自动伸缩无关所以不在这里提及了
三结束语
虽然还不能算是完美的模仿但效果已经非常非常的接近了也许有人会奇怪为什么要用Tool Window风格这是因为这样在任务栏中不会显示窗口从QQ的标题栏高度也可以判断出他也是这种风格但这样一来就不能拥有最小化最大化按键了实际上QQ的最大化最小化和关闭按键都是用DC画上去的如何在Caption上增加按键外国一些开源网站有源代码我下载并看了一下发现里面有个知识点很有趣那就是更改消息路由有兴趣的可以去下载来学习一下
QQ的成功很大部分在于他的界面比较人性化(用了MSN后深有感受)而这些界面实现起来原理也许很简单难的是观察东西心要细设计东西心要密开发东西心要异
[] [] [] []