1.需要响应WM_NCCALSIZE消息
2.需要响应NCPAINT消息
3.还需要响应WM_SIZE
void 类名::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
ResetWindowRgn();
Invalidate();
}
4.响应Active
用于绘制不同情况下的标题
void 类名::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CWnd::OnActivate(nState, pWndOther, bMinimized);
if (nState == WA_INACTIVE)
{
if (m_bTraceFlag)
{
ReleaseCapture();
m_bTraceFlag = FALSE;
}
m_bActive = FALSE;
}
else
m_bActive = TRUE;
SetWindowPos(NULL,0,0,0,0,SWP_FRAMECHANGED|SWP_NOOWNERZORDER|
SWP_NOMOVE|SWP_NOSIZE);
}
1.准备工作
(1)得到绘画的句柄
(2)关于非客户区的消息:
ON_WM_NCPAINT()//绘非客户区时。
ON_WM_NCACTIVATE()//非客户区有焦点和失去焦点时。
ON_WM_NCCALCSIZE()//计算窗体尺寸时。
(3)改变标题栏尺寸
/* 改变标题栏的尺寸 */
void CDialogEx::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
lpncsp->rgrc[0].top+=nTitleHeight-GetSystemMetrics(SM_CYCAPTION) -GetSystemMetrics(SM_CYSIZEFRAME) ;
lpncsp->rgrc[0].left+=nFrameBorerL -GetSystemMetrics(SM_CXFRAME);
lpncsp->rgrc[0].right-=nFrameBorerR -GetSystemMetrics(SM_CXSIZEFRAME);
lpncsp->rgrc[0].bottom-=nFrameBorerB-GetSystemMetrics(SM_CYSIZEFRAME);
CDialog::OnNcCalcSize(bCalcValidRects, lpncsp);
}
(4)非客户区的鼠标动作:
相关消息:
ON_WM_NCLBUTTONDOWN()//鼠标下。
ON_WM_NCLBUTTONUP()//鼠标上。
ON_WM_NCMOUSEMOVE()//鼠标悬停。
(5)屏蔽最大最小关闭消息:
在WindowProc中:
LRESULT CMYSkinDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_NCHITTEST)
{
LRESULT lRet = CDialog::WindowProc(message, wParam, lParam);
//屏蔽最大最小关闭消息.
if (lRet==HTZOOM || lRet == HTMINBUTTON || lRet == HTCLOSE)
return HTCAPTION;//视为标题栏动作。
else
return lRet;
}
}