用VC编写具有动态换肤功能的应用程序

VC++为工具栏设置背景 带背景图像的工具栏制作实例源码,学习一下如何使用VC++为窗口的工具栏设置背景图像,这样做当然有好处,一是可美化工具栏与你的窗口风格一致,二是更加醒目,让窗体结构更明朗,有效提升用户界面设计的体验度,让用户对软件产生好的印象。通过源码你将学会为工具栏添加背景图像的方法和思路。 立即下载
 摘要: 本文介绍了一种为应用程序工具条添加及动态更换皮肤的程序设计方法。

  引言

  如果能在自己的程序中也具备动态更换皮肤的能力,将使软件平添几分亮点从而更易博得用户的青睐。具笔者了解,当前介绍这种技术的文章资料较少,与其流行程度很不协调,而且现有的少量资料也多是针对对话框进行的,无非是在对话框上覆盖一层图片,并通过更换图片来实现程序的动态换肤。虽然这也是动态换肤的一种,但由于技术过于简单,本文将着重介绍另外一种动态换肤技术--工具栏的动态换肤技术,这也是IE浏览器等软件所普遍采用的一种换肤技术。

  程序支持动态换肤

  由于换肤功能是对程序框架的扩展,所以相关处理代码理所当然地要在主框架类中进行。为了使程序能具备换肤的能力,必须首先使程序具备换肤的基本条件。首先可以明确的是:处理对象为普通的工具条,其基类为CToolBar。通过MSDN帮助可以了解到该类及其"近亲"的继承关系如图所示。通过对这几个相关类的查阅,可以发现CReBar类比较特殊,它本身并不用于显示,而主要用于包容其他的工具条,例如,可以通过其成员函数AddBar()将工具条(ToolBar)、对话条(DialogBar)等类型的工具条加入到复合条(ReBar),使工具栏中可以显示多个工具条。所以可以得出这样的设计思路:程序框架的工具栏不再直接以工具条来实现,而是以复合条为基础,并通过CReBar的AddBar()函数将原先的工具条加入其中。皮肤则可以通过设置与CReBar相关的REBARBANDINFO结构而平铺于复合条之上,由于有工具条覆于其上,因此必须在创建工具条时修改其风格(Style),使其背景为透明,这样才能透出位于下层的皮肤。

  由于在程序设计时使用了CReBar,在普通程序中实现起来比较麻烦,可以在创建工程时在第四步选中"Internet Explorer ReBars"选项,这样创建的工具栏将在复合条上添加一个工具条和一个对话条。只需从主框架类的头文件和实现文件的OnCreate()函数里将对话条 CDialogBar的实例对象m_wndDlgBar的声明部分和部分相关代码去除即可。

  接下来在工具条创建时需要特别指定TBSTYLE_TRANSPARENT等窗口风格来使其背景透明,并在创建完复合条后通过AddBar()函数将背景透明的工具条添加其中:

m_wndToolBar.CreateEx(this,
TBSTYLE_FLAT|TBSTYLE_TRANSPARENT,
WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP,
CRect(0,0,0,0),AFX_IDW_TOOLBAR)
……
m_wndReBar.AddBar(&m_wndToolBar,
NULL,NULL,
RBBS_GRIPPERALWAYS|RBBS_FIXEDBMP|RBBS_BREAK)

  经过上述几步处理对程序的主框架作了改造,使其基本具备了动态换肤的必要条件。

  皮肤的装载与动态更换

  皮肤一般是以外部资源的形式发布,在使用时再由程序动态装载。皮肤加载到工具栏的过程大致可分两步:先将皮肤从文件装载到内存,然后再由内存位图直接绘制到复合条上去。对于第一步,可用API函数LoadImage将外部文件back.bmp从文件按位图的格式装载到内存,返回的句柄可通过强制转换得到HBITMAP型的位图句柄m_bmpBack:

m_bmpBack=(HBITMAP)LoadImage(AfxGetInstanceHandle(), //应用程序实例句柄
"back.bmp",IMAGE_BITMAP,0,0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);

  皮肤装载到内存后,需要通过对REBARBANDINFO结构进行设置,才能实现皮肤位图在复合条中的平铺,该结构有二十多个成员变量,但在此只是用于设置背景位图的平铺,因此只需设置fMask为RBBIM_BACKGROUND以指定hbmBack有效,并将前面装载到内存的位图句柄 m_bmpBack传递给该成员变量就完成了对皮肤的装载与显示,下面就是这部分实现的详细代码:

CReBarCtrl& rc=m_wndReBar.GetReBarCtrl(); //获取复合条控件指针
REBARBANDINFO info;
memset(&info,0,sizeof(REBARBANDINFO)); //清零
info.cbSize=sizeof(info);
info.fMask=RBBIM_BACKGROUND; //指定hbmBack有效
//如果位图句柄不可用则仍为银灰色背景,否则以此位图作为复合条的背景
info.hbmBack=m_bmpBack!=INVALID_HANDLE_VALUE?m_bmpBack:NULL;
rc.SetBandInfo(0,&info); //进行设置
rc.UpdateWindow(); //更新窗口

  当皮肤已经显示到工具栏上而对其进行动态更换,则只需要简单的调用拷贝文件函数将新的皮肤插件以覆盖的形式复制到back.bmp,并再次调用上述两步对新的皮肤插件进行重新装载即可实现对程序的动态皮肤更换。拷贝文件函数一般用API函数CopyFile()来实现,该函数的前两个参数分别为源文件路径和目的文件路径。最后一个布尔型参数指定文件拷贝的方式,在此需要指定为FALSE,即如果目的文件已存在则对其覆盖,否则将无法实现对皮肤的更换。

  小结

  本文通过对复合条及CReBar类的使用实现了在VC下对应用程序的动态皮肤更换。CReBar类的功能非常丰富,本文限于篇幅未能做深入的介绍,关于该类的详细情况请参阅微软公司的MSDN帮助。本文所述程序在Windows 98下,由Microsoft Visual C++ 6.0编译通过。

三级等保网络拓扑图实战:从零搭建符合标准的医院安全架构 本文详细阐述了如何从零开始设计并搭建符合三级等保标准的医院网络安全架构。文章基于“一个中心,三重防护”的核心框架,深入解析了医院网络分区设计、安全域划分、关键安全设备选型与配置等实战要点,并提供了绘制专业网络拓扑图的技巧与等保测评准备指南,旨在帮助医院IT人员系统化地构建既合规又实用的纵深防御体系。 阅读详情

相关推荐

金蝶云星空应用开发初级考试题目汇总

摘要:本文为金蝶云星空应用开发初级考试题目汇总

2401_86113757的博客 3799

CReBar-VC制作动态真彩工具栏

源码下载 效果图: http://p.blog.youkuaiyun.com/images/p_blog_youkuaiyun.com/hunterpigtao/EntryImages/20080820/1077517285239.gif  步骤如下:   Step1:建一个单文档/多文档框架   Step2:在框架类CMainFrame中添加如下变

hunterpigtao的专栏 2627

海康安防平台接口调试指南:从签名生成到Vue项目集成

本文详细解析了海康安防平台接口认证规则,从签名生成到Vue项目集成的完整流程。通过核心机制解析、签名工具使用技巧及Vue项目中的优雅集成方案,帮助开发者高效完成接口调试,避免常见问题。特别适合需要将海康安防平台接口集成到Vue项目中的开发者参考。

weixin_42533120的博客 437

【VC编程技巧】动态链接库☞1.6设计应用程序界面换肤

引言(转载请说明作者和出处): 刚休完 十一长假,又加上最近公司事挺多的,十来天没更新了文章,打算后面补上。 今天讲利用动态链接库来实现应用程序的界面换肤。原理是在动态链接库中创建应用程序需要的位图资源文件,当应用程序需要界面换肤时去加载新的位图资源。下面我看一个例子,这个例子同第一讲“【VC编程技巧】动态链接库☞1.1调用Dll中的一个图标”差不多。 效果图: 1〉创建MFCRe

老骥伏枥,志在千里 2428

别再凭感觉选电容了!手把手教你计算电机控制器里的母线电容(附Excel计算工具)

本文详细解析了电机控制器中母线电容的选型方法,从理论计算到工程实践,帮助工程师避免常见误区。通过精确计算纹波电压、电容容量等关键参数,并结合薄膜电容与电解电容的性能对比,提供实用的选型建议。附带的Excel计算工具可快速完成参数计算,适用于工业伺服驱动和电动车电机控制器设计。

weixin_28720573的博客 512

《大明王朝1566》中,朝廷财政危机无法解决的根源分析

财政困局中的财富最终流向三重黑洞:​皇室挥霍​(如嘉靖炼丹修殿)、特权阶层贪腐​(严党年入百万两盐税)、制度性损耗​(宗室供养、低效官僚)。更深层的“钱”其实是被禁锢在道德化治理的牢笼中——当国家用“黄河长江皆可为用”的权术思维替代制度性改革时,财政危机便成为帝制王朝无法逃脱的宿命。

为了小家奋斗 1968

CReBar的使用

 需求:1.在工具栏中添加出按钮以外的控件;2.当工具栏的宽度小于按钮宽度总和时,隐藏部分按钮,并在工具栏的最右侧显示向右的箭头,当点击这个箭头时,弹出一个菜单,菜单由没有显示出来的按钮组成;3.工具栏按钮显示tip。 实现:MFC提供了一个类CReBar,这是一个容器类,可以向这个类中添加工具栏,编辑框,下拉列表等等。1.//创建工具栏对象CToolBar* m_pToolBar

馋嘴猪没胃口 1万+

精密装配机器人系列编程:ABB IRB 120_(20).编程项目设计与实施

在精密装配机器人系列编程中,项目的成功设计与实施涉及多个关键步骤。从项目需求分析到最终调试,每一个环节都需要细致的考虑和专业的技术。选择合适的编程语言、设计良好的程序结构、掌握调试技巧以及解决常见问题,都是确保机器人高效、稳定运行的重要因素。通过不断优化和改进,可以提高生产效率和产品质量,满足不断变化的生产需求。

zhubeibei168的博客 1242

用vc编写具有动态换肤功能的应用程序

 引言  如果能在自己的程序中也具备动态更换皮肤的能力,将使软件平添几分亮点从而更易博得用户的青睐。 具笔者了解,当前介绍这种技术的文章资料较少,与其流行程度很不协调,而且现有的少量资料也多是针对对话框进行的,无非是在对话框上覆盖一层图片,并通过更换图片来实现程序的动态换肤。虽然这也是动态换肤的一种,但由于技术过于简单,本文将着重介绍另外一种动态换肤技术--工具栏的动态换肤技术,这也是ie浏览器等

Johnny的专栏 771

GlobalBuildingAtlas 建筑物白模数据下载

GlobalBuildingAtlas基于OSM开源数据构建全球建筑物3D白模,提供在线浏览和下载服务。官方资源包括GitHub项目地址和TUM数据库链接,支持行政区划检索建筑物数据。

一醉千秋的专栏 540

三相五柱式消弧线圈自动测控装置设计与实现

本文设计了一种基于STM32的三相五柱式消弧线圈自动测控装置。该装置采用信号注入法检测系统对地电容电流,通过PID自适应算法调节消弧线圈电感值,实现单相接地故障时的快速补偿。硬件系统包含信号采集、注入、控制执行等模块,软件采用Goertzel算法提取特征频率信号,结合增量式PID实现精确控制。实验结果表明,装置电容检测误差小于2%,调谐响应时间小于50ms,满足配电网对消弧线圈自动调谐的技术要求。

AI的内部世界的博客 237

vc中使用免费界面换肤软件 USkin

一、介绍   我们都知道,Skin以前是一项比较难的技术。但至从WindowsXP推出以来,Skin或者说Theme变得很普遍。虽然WindowsXP可以支持Theme,但当我们改变WindowsXP的风格时,所有支持WindowsXP风格的应用程序都变成一样的风格,如何让我们的软件不仅具备Skin,而且要靓丽更吸引人更有个性更加与重不同呢。这里我给大家推荐一款换肤软件USkin。 为

SIASJIE的专栏 1196

RK3399外设驱动之MIPI

RK3399外设驱动之MIPI 文章目录RK3399外设驱动之MIPIMIPI命令解析入口代码mipi显示配置实例rk3399mipi驱动rk mipi驱动注册过程rk32_mipi_dsi.c解析 内核版本 Linux4.4 平台 rk3399 作者 nineyole MIPI命令解析入口代码 MIPI的入口代码如下:kernel\drivers\video\rockchip\screen\lcd_mipi.c static int __init rk_mipi_screen_in

学无止境 2227

SkinLoad程序界面换肤工具

SkinLoad程序界面换肤工具作者:耿海增下载本文示例工程 版本更新SkinLoad v0.3本文在VC知识库链接说明:SkinLoad是一个给程序换肤的工具,通过几个简单的函数调用就可以给你的应用程序加上漂亮的皮肤,包括所有的系统对话框。通过SkinLoadMaker皮肤编辑工具,可以自己定制皮肤。界面效果图如下: 如何在程序中实现换肤:一、静态链接动态库需要三个文件:"SkinLoadLib

Glacier的专栏 1762

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VC MFC 换肤 SkinSharp

【VC皮肤】SkinSharp 1.0.6.6的使用 https://blog.youkuaiyun.com/ypist/article/details/8536873 SkinSharp又称Skin#,是Windows环境下一款强大的换肤组件。 SkinSharp作为换肤控件,只需要在您的程序中添加一行代码,就能让您的界面焕然一新,并拥有多种主题风格和色调的动态切换功能以及Vista透明边框特效。 网站地址:http://www.skinsharp.com/ 个人测试:Windows 7系统、Visual Stud

abc 2518

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

利用SkinMagic美化VC程序详解

       利用SkinMagic美化VC程序详解    这两天在网上看到给VC程序换肤的文章,自己也试了一下,因为版本的问题,忙了整整一天,才算搞出点头绪。废话不说了,下面我们一步步地来实现这个功能!(1)下载SkinMagic的开发包,我用的开发包需要下面几样东西:SkinMagicLib.lib,DETOURS.lib两个库文件;.smf文件(皮肤文件);还有个SKinMagicL

2118

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

VC6.0完美界面换肤解决方案

完美界面换肤解决方案-、简介VC里边界面换肤是比较头痛的问题,网上有不少介绍,但是大多数仅仅提供Dll或者Lib,有代码的又有很多问题,效果很差。这几日突然想到一个解决方案,有源码,皮肤有一百多个,就是采用Delphi里边成熟的界面组件vclskin,将它做成Dll来用,效果相当不错,赶紧介绍给大家。二、效果预览实例中的效果如下图: 效果预览三、Dll制作首先启

【拥抱变化 -- 知识改变命运】 9765

使用免费界面换肤软件 USkin

使用免费界面换肤软件 USkin(VC知识库在线杂志第48期)作者:thirdwolf一、介绍   我们都知道,Skin以前是一项比较难的技术。但至从WindowsXP推出以来,Skin或者说Theme变得很普遍。虽然WindowsXP可以支持Theme,但当我们改变WindowsXP的风格时,所有支持WindowsXP风格的应用程序都变成一样的风格,如何让我们的软件不仅具备Skin,而且要靓

ytmfdx的专栏 907

各种流行的界面换肤控件库比较

<br />用VC做程序的时候,如果对界面样式不满意怎么办?自己从各种控件基类继承,然后自绘么?对高手来说,这虽然不能算是难题,但是仍旧比较麻烦,对新手来说,连看什么书都不好说。那就没有更好的方法么?当然有!这就要用到一类称作“界面换肤”的工具包了。<br /><br />且看这些工具包有什么作用。当你使用一个界面换肤工具包的后,在不改变代码的基础上(除了使用库函数),你的程序将变成另外一个样子,当然这个样子可以很cool,也可以很poor。下面我们来看看当今有什么好的换肤工具包可以使用。<br /><br

Huichao_Zhi的专栏 1094

软件换肤

我一般给软件加上换肤功能,都是采用上海勇进公司的SKIN产品,调用比较简单,可以实习任意的换肤。现在直接来写。。 由于换肤功能是对程序框架的扩展,所以相关处理代码理所当然地要在主框架类中进行。为了使程序能具备换肤的能力,必须首先使程序具备换肤的基本条件。首先可以明确的是:处理对象为普通的工具条,其基类为CToolBar。通过MSDN帮助可以了解到该类及其"近亲"的继承关系如图所示...

weixin_30677617的博客 222

如何对 BCGControlBarPro 进行换肤

2007-11-19 14:14:39 如何对 BCGControlBarPro 进行换肤  

xiaoguizhu的专栏 1126
上一篇: 控制台窗口界面控制设计
下一篇: Visual C++编程控制输入法
xmlscript
博客等级 码龄25年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值