c++创建对话框_窗体边框改为对话框样式

c++创建对话框_窗体边框改为对话框样式本例中涉及到对话框标题栏的自绘,双缓冲位图的显示以及位图按钮类的使用。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

      本例中将涉及到对话框标题栏的自绘,双缓冲位图的显示以及位图按钮类的使用。

1. 标题栏自绘

      在网上搜索了很多关于标题栏自绘的例子,但是大都存在很多的问题,多是没有自绘彻底,比如出现闪烁,会出现默认风格最大化等按钮的显示,不过其中有份代码处理的比较好,至于出于什么地方想不起来了,下面会一并给出源代码(源代码的下载地址在评论部分给出 ),本例是在这份源代码的基础上作的改进,主要有以下几个方面:
(1)标题栏添加了颜色渐变的效果,使之看上去有立体感,其实就是在绘制位图资源时填充渐变色而已;
(2)当我们点击最大化,最小化或关闭按钮的时候,只有当左键弹起时才能起效;
(3)当窗口失去焦点时,标题栏应有对应的反映,即改变标题文字和最大化等按钮的颜色;
(4)使用了CToolTipCtrl控件,实现了当我们将鼠标放到最大化等按钮上时,显示文字提示;
(5)可以设置对话框标题栏的左上角和右上角是以圆角显示还是以直角显示,调用SetTitleRectStyle方法即可实现;
(6)使用FrameRect函数绘制了对话框的边线;
(7)对原有的代码做了一些简化的处理;
(8)将对话类封装了一下,即CColorTitleDlg,要实现多个该风格的对话框,只需继承该对话框类即可。

2. 双缓冲显示位图

      双缓冲显示位图的原理网上介绍的比较多,主要思路如下:

CDC MemDC; //首先定义一个显示设备对象 
CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设备 MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地方画 //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小 
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //将位图选入到内存显示设备中 //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上 
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //先用背景色将位图清除干净,这里我用的是白色作为背景 
//你也可以用自己应该用的颜色 
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //绘图(如果是现成的位图,只要LoadBitmap一下资源就可以直接贴图了) 
MemDC.MoveTo(……);
 
MemDC.LineTo(……); //将内存中的图拷贝到屏幕上进行显示 
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); //绘图完成后的清理 MemBitmap.DeleteObject(); 
MemDC.DeleteDC();

本例中的CTestBitmapShowDlg主测试类中位图的显示,以及CColorTitleDlg标题栏重绘类中标题栏的贴图操作都是使用双缓冲来实现,以避免界面的闪烁。

3. 位图按钮类的使用

       本例中对CTestBitmapShowDlg主测试类中的按钮进行了美化处理,使用了CBitmapBtn按钮位图类,事先用photoshop为每个按钮绘制四种不同状态的位图,即正常状态,鼠标选中状态,按下鼠标状态和非使用状态,为了达到立体感的效果,需要使用到photoshop中的渐变色处理。CBitmapBtn按钮位图类的使用方法:首先将定义按钮对应的控件变量,然后将绘制的bitmap图片导入到工程中,调用CBitmapBtn按钮位图类的SetBitmap方法将按钮图片与按钮关联起来,如下所示:

//定义按钮类对象 CBitmapBtn m_btnNextStep; …… //在按钮的CTestBitmapShowDlg::OnInitDialog中添加关联位图的代码 BOOL CTestBitmapShowDlg::OnInitDialog() { …… m_btnNextStep.SetTransparentColor(RGB(250,250,250), RGB(250,250,250)); //贴图的时候将边界的多余颜色过滤掉 m_btnNextStep.SetBitmap(IDB_BITMAP_NEXTSTEP_NORMAL, IDB_BITMAP_NEXTSTEP_OVER, IDB_BITMAP_NEXTSTEP_DOWN, IDB_BITMAP_NEXTSTEP_DISABLE); //将按钮位图与按钮关联起来 …… }

4. 存在的不足

       当对话框比较大时,我们将鼠标移到标题栏按下左键拖动对话框,向下拖动标题栏不会闪烁,但向上拖动时标题栏会闪烁,这点尚需讨论和改进。

5. 结束语 

      正如上面所说,关于标题栏自绘的问题问的比较多,而网络上给出的例子大都存在问题,所以在此将我处理过的代码拿出来与大家分享一下,相互学习,希望大家批评指正!另外,这是本人第一次发博,希望大家支持一下!谢谢!

对话框标题栏自绘效果如下图所示: (下图是窗口失去焦点时的情况)

c++创建对话框_窗体边框改为对话框样式

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184331.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java中的scanner是什么_java中的Scanner类是什么?如何使用?「建议收藏」

    java中的scanner是什么_java中的Scanner类是什么?如何使用?「建议收藏」java中的Scanner类是什么?如何使用?发布时间:2020-05-2016:36:48来源:亿速云阅读:204作者:鸽子Scanner类介绍java.util.Scanner是Java5的新特征,可以通过Scanner类来获取用户的输入。创建Scanner对象的基本语法:Scanners=newScanner(System.in);实例:接下来我们演示一个最简单的数据…

    2022年7月8日
    23
  • php中的func_num_args、func_get_arg与func_get_args函数

    php中的func_num_args、func_get_arg与func_get_args函数

    2021年10月30日
    50
  • Centos7配置MySQL读写分离[通俗易懂]

    Centos7配置MySQL读写分离[通俗易懂]背景82和83两台Mysql已经实现了主从复制。即将使用mysql-proxy进行读写分离,配置192为proxy,写82读83。mysql-proxymysql-proxy是一个处于客户端和服务器之间的中间件,它可以检测,分析或改变它们的通信。简单说就是一个中间层代理,一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载…

    2022年5月30日
    53
  • 免费申请国外免费域名超详细教程

    免费申请国外免费域名超详细教程1.首先申请免费域名网站:https://my.freenom.com/domains.php2.填入域名,这里我们以xcflag为列(尽量选择复杂一点的或者五个字母以上的域名,因为简单的有些域名是需要收费的),点击检查可用性。3.可以看到很多免费的域名(用的谷歌翻译插件,翻译有时候不是很准确,free翻译过来应该是免费而不是自由,之后会写一些关于谷歌插件的笔记,详细讲解)4.我们选择xcflag.tk点击立即获取,稍等一会点击购物车查看绿色按钮5.默认三个月试用,这里下拉框我们选择十二个月

    2022年6月30日
    88
  • 用户日志管理「建议收藏」

    用户日志管理「建议收藏」摘要本发明涉及应用系统日志管理技术领域,提供了一种日志管理方法和系统,所述方法包括如下步骤:S1:初始化系统业务功能列表和业务功能方法列表;S2:将业务操作中的具体操作信息与系统日志表和历史数据日志表直接相关联;S4:根据业务操作自动记录日志信息。本发明从整体考虑整个应用系统的日志信息与业务操作挂接,用户在运行时可以根据当前的需要,选择某业务操作是否需要记录日志,并且在业务操作界面能即时将相关的日…

    2022年5月2日
    69
  • 什么是CICD

    什么是CICD什么是CICD一、简介二、持续集成(CI)三、持续交付(CD)四、持续部署(CD)五、下一步是什么?一、简介CI/CD的采用改变了开发人员和测试人员如何发布软件。最初是瀑布模型,后来是敏捷开发,现在是DevOps,这是现代开发人员构建出色的产品的技术路线。随着DevOps的兴起,出现了持续集成(ContinuousIntegration),**持续交付(ContinuousDeli…

    2022年4月26日
    61

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号