10分钟教你VC编程个性化窗口界面设计
小职 2018-07-05 来源 : 阅读 2894 评论 0

摘要:本文主要向大家介绍了VC编程个性化窗口界面设计,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程个性化窗口界面设计,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

在VC下有时需要制作个性化的窗口界面,用界面库又比较繁琐,而且有些界面库还必须收费才能使用,这里我提供一个简单且有效的制作个性化界面的方法。 
  由AppWizard向导生成一个基于对话框的应用程序框架,把对话框模板的Border属性改为none,也就是没有边框和标题栏。从CDialog派生一个类,命名为CCustomDlg。首先我们要建立不规则窗口的界面,要用到以下函数, 

int SetWindowRgn( HRGN hRgn, BOOL bRedraw ); 

这个函数用来设置应用程序窗口的窗口区域,在本文的例子中我们使用CreateRoundRectRgn创建一个圆角矩形区域,然后再调用SetWindowRgn设置窗口区域。CreateRoundRectRgn的原型如下: 

BOOL CreateRoundRectRgn( int x1, int y1, int x2, int y2, int x3, int y3 ); 

具体代码如下: 

BOOL CCustomDlgDlg::OnInitDialog() 


       CDialog::OnInitDialog(); 
       ...... 
   

       //set valid region 

       CRgn rgn; 
       CRect rectFrame; 
       GetClientRect(&rectFrame); 
       rgn.CreateRoundRectRgn(rectFrame.left,rectFrame.top,rectFrame.right+1,rectFrame.bottom+1,30,30); 
       SetWindowRgn(rgn,TRUE); 
       // TODO: Add extra initialization here   

       return TRUE;  // return TRUE  unless you set the focus to a control 


因为对话框已经设置了none border属性,所以GetClientRect(&rectFrame)得到的就为对话框模板整个窗口大小,然后再创建圆角矩形,注意创建圆角矩形的时候要注意第三,第四个参数都要加1(后面会讲原因)。 

接下来,映射WM_ERASEBKGND消息来改变背景,需手工加入ON_WM_ERASEBKGND(),同时不要忘了在头文件中加入 

afx_msg  BOOL   OnEraseBkgnd(CDC *pDC); 

编辑处理函数: 

BOOL CCustomDlgDlg::OnEraseBkgnd(CDC *pDC) 

       CRect rect; 
       GetClientRect(&rect); 
       CBrush *pOldBrush = pDC->SelectObject(&m_brBrush); 
       pDC->RoundRect(&rect, CPoint(30,30)); 
       pDC->SelectObject(pOldBrush);   
       return TRUE; 


pDC->RoundRect(&rect, CPoint(30, 30)); 

默认是用黑笔画矩形,到这里应该知道上面的第三,第四个参数为什么要加1了,因为默认黑笔的宽度就为1个像素单位,RoundRect实际画出的矩形的长度和宽度都多1,大家可能会想,为什么不用rectFrame.left减1,和rectFrame.top减1这种方法呢?它也会使长度和宽度都多1啊,问题在于rectFrame.left, rectFrame.top都为0,减1就都为-1, 用CreateRoundRectRgn创建区域时值又会变为0,这样长度和宽度还是没有增加。 

再接下来,加入一CBrush类型的成员变量m_brBrush,在构造函数中加入 

m_brBrush.CreateSolidBrush(RGB(239,243,255)); 

用ClassWizard映射WM_CTLCOLOR消息,并编辑代码。作用是改变对话框中控件的颜色以使对话框背景相符,不过不能用此法改变按钮的颜色,按钮用自绘来改变颜色,这方面内容本文就不介绍了,网上有很多此类文章。 

HBRUSH CCustomDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 

       HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 
       if (CTLCOLOR_STATIC==nCtlColor || CTLCOLOR_DLG==nCtlColor) 
       { 
              pDC->SetBkMode(TRANSPARENT); 
              return       m_brBrush; 
       }     

       // TODO: Return a different brush if the default is not desired 
       return hbr; 




接着,映射WM_NCHITTEST消息,需手工加入,ON_WM_NCHITTEST(),同时不要忘了在头文件加入 

afx_msg UINT OnNcHitTest(CPoint point); 

编辑处理函数: 

UINT CCustomDlgDlg::OnNcHitTest(CPoint point) 


       UINT nHitTest = CDialog::OnNcHitTest (point); 
       if (nHitTest == HTCLIENT) 
              nHitTest = HTCAPTION; 
       return nHitTest; 


这样之后就可以用鼠标拖动对话框了。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言VC/MFC频道!

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程