资源描述:
《《自绘边框窗口》word版》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、自绘边框窗口自绘窗口需要响应如下的几个消息:1、WM_NCCALCSIZE这个是用来返回NC区域的。windows系统根据这个消息的返回,决定矩形区域中,NC区域在哪里。如下的代码是我的一个实现:voidCSIPanel::OnNcCalcSize(BOOLbCalcValidRects,NCCALCSIZE_PARAMSFAR*lpncsp){RECTr;//TODO:Addyourmessagehandlercodehereand/orcalldefaultif(m_psi){if(m_psi->m_bCustomWin
2、dow){memcpy(&r,&lpncsp->rgrc[0],sizeof(RECT));r.top=r.top+m_psi->m_NcRect.top;r.bottom=r.bottom-m_psi->m_NcRect.bottom;r.left=r.left+m_psi->m_NcRect.left;r.right=r.right-m_psi->m_NcRect.right;memcpy(&lpncsp->rgrc[0],&r,sizeof(RECT));return;}}CWnd::OnNcCalcSize(bCal
3、cValidRects,lpncsp);}在这个代码中,m_psi->m_bCustomWindow是用来标志是否是自绘窗口的。如果不是自绘窗口,才需要调整大小。至于bCalcValidRects这个参数,说老实话我也不知道它的用处。我查过很多的代码,都没有使用这个参数(比如BCGPRO的代码等),而实际情况下也是不使用也没有问题的。完全只需要更改lpncsp->rgrc[0]就可以了。2、需要响应NCPAINT消息。(如果在窗口非active的情况下,并不绘制ncpaint或者调用原来的ncpaint,那么系统就会画出以前
4、的难看的窗口边框和标题)很简单,这个是我的代码:voidCSIPanel::OnNcPaint(){CWindowDCdc(this);if(m_psi==NULL)return;if(m_psi->m_bCustomWindow==FALSE)return;p_PaintCorners(&dc);p_PaintIcons(&dc);p_PaintPushedIcons(&dc);p_PaintTitleLine(&dc);}3、还需要响应CREATE消息为何响应Create消息?因为我的窗口是不规则的(不是直角矩形而是园角
5、矩形的)intCSIPanel::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CWnd::OnCreate(lpCreateStruct)==-1)return-1;//TODO:AddyourspecializedcreationcodehereResetWindowRgn();SetWindowPos(NULL,0,0,0,0,SWP_FRAMECHANGED
6、SWP_NOOWNERZORDER
7、SWP_NOMOVE
8、SWP_NOSIZE);return0;}SetWindowPo
9、s是强制让Window重新计算大小(NCCALCSIZE)和绘制。///////////////////////////////////////////////////////////////////////////////CSIPanelmessagehandlersvoidCSIPanel::ResetWindowRgn(){intiRet;BOOLbRet;CRgnm_rgn1,m_rgn2,m_rgn3;RECTr;GetWindowRect(&r);OffsetRect(&r,-r.left,-r.top);bRe
10、t=m_rgn1.CreateRoundRectRgn(r.left,r.top,r.right+1,r.top+45,12,12);m_rgn2.CreateRoundRectRgn(r.left,r.top+18,r.right+1,r.bottom+2,12,12);iRet=m_rgn2.CombineRgn(&m_rgn1,&m_rgn2,RGN_OR);iRet=SetWindowRgn(m_rgn2,TRUE);}4、还需要响应WM_SIZEvoidCSIPanel::OnSize(UINTnType,intc
11、x,intcy){CWnd::OnSize(nType,cx,cy);//TODO:AddyourmessagehandlercodehereResetWindowRgn();Invalidate();}5、响应ACTIVE用于绘制不同情况下的标题。voidCSIPanel::OnActi