MFC中重绘非客户区 NcPaint

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;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值