界面美化.CStatic控件的美化(好多系列文章)
http://www.cnblogs.com/20090802/archive/2010/09/17/1829283.html
静态控件也是比较常用的控件,在VS开发环境中用的应该挺频繁的吧。
其实mfc中实现对窗口美化,主要依赖于重绘。static控件也是个窗口,windows为其留有自绘的权利,可以设置其样式为SS_OWNERDRAW,Windows就会把其绘制权利交给我们的代码,怎么绘制就看我们的代码了。mfc中更好的一种方式就是消息反射,省的自己来做这一步操作了,我们重载CStatic中的DrawItem方法,进行自绘,基本就可以了。其实如果自己在OnPaint里画也是可以的(对于任何控件窗口都可以的,只是麻烦或者有其他的问题)。
我们可以给CStatic中加入背景图片,画成按钮样式,等等,可以模拟出其他的控件(像CButton),如果CStatic要响应事件我们可以加上SS_NOTIFY样式,这样父窗口就会把消息传递到CStatic里面来,要怎么处理就看我们了。
下面看下具体怎么做:
第一要设置继承CStatic类,我们自己写一个Static类,我给他起了CSkinStatic的名字。
第二,设置其样式为SS_OWNERDRAW,设置样式可以在Static控件创建前后都可以,但要在其显示前,我这里在CSkinStatic::PreSubclassWindow()中进行设置
- PreSubclassWindow
- void CSkinStatic::PreSubclassWindow()
- {
- // TODO: 在此添加专用代码和/或调用基类
- DWORD dwStyle = GetStyle();
- SetWindowLong(GetSafeHwnd(),GWL_STYLE,dwStyle | SS_OWNERDRAW );
- CStatic::PreSubclassWindow();
- }
第三,就是重载DrawItem,然后在里面想怎么画就怎么画了。
- DrawItem
- void CSkinStatic::DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/)
- {
- CRect rcWnd;
- GetWindowRect(&rcWnd);
- ScreenToClient(&rcWnd);
- CString strText;
- GetWindowText(strText);
- CBitmap bmp;
- bmp.LoadBitmap(IDB_BITMAP1);
- BITMAP bmpInfo;
- bmp.GetBitmap(&bmpInfo);
- CDC *pdc = GetWindowDC();
- CDC dcMem;
- dcMem.CreateCompatibleDC(pdc);
- CBitmap bmpBg;
- bmpBg.CreateCompatibleBitmap(pdc,rcWnd.Width(),rcWnd.Height());
- dcMem.SelectObject(&bmpBg);
- CDC dcDraw;
- dcDraw.CreateCompatibleDC(pdc);
- dcDraw.SelectObject(&bmp);
- dcMem.StretchBlt(0,0,rcWnd.Width(),rcWnd.Height(),&dcDraw,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);
- CFont font;
- VERIFY(font.CreateFont(
- , // nHeight
- , // nWidth
- , // nEscapement
- , // nOrientation
- FW_NORMAL, // nWeight
- FALSE, // bItalic
- FALSE, // bUnderline
- , // cStrikeOut
- ANSI_CHARSET, // nCharSet
- OUT_DEFAULT_PRECIS, // nOutPrecision
- CLIP_DEFAULT_PRECIS, // nClipPrecision
- DEFAULT_QUALITY, // nQuality
- DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
- "宋体")); // lpszFacename
- dcMem.SelectObject(&font);
- dcMem.SetBkMode(TRANSPARENT);
- dcMem.SetTextColor(RGB(255,0,0));
- dcMem.DrawText(strText,&rcWnd,DT_CENTER);
- pdc->BitBlt(0,0,rcWnd.Width(),rcWnd.Height(),&dcMem,0,0,SRCCOPY);
- bmp.DeleteObject();
- ReleaseDC(pdc);
- }
这个绘图稍有点麻烦,大致是这样的 先创建内存两个内存DC一个作为画布,另一个负责引入图片,再拉伸拷贝到画布DC上,最后画布DC全部拷贝到窗口DC上。这主要是防止贴图和写文字不同步,造成有图无字,也避免了一个内存DC造成的字体拉伸。运用了网上盛传的双缓冲。
经过我们自己的代码处理后,可以看看Static成什么样了
当然可以自己画个渐变色出来。不过个人觉得还是贴图方便。
Static控件的美化比较简单,没有什么多的消息要进行处理。不过要想设置个性的,也得需要几个状态变量,多个图片吧。
基本的东西都很好做,如果想做好点细腻点,总会有点麻烦的。
http://blog.csdn.net/witch_soya/article/details/7569773
界面美化.CStatic控件的美化(好多系列文章)的更多相关文章
- CSS3美化表单控件
表单的默认控件在不同的浏览器中的样式不同,用户体验很差.用CSS3可以实现表单控件的美化,可以提供更好的用户体验.不足之处就是浏览器的兼容性问题. 一.下拉控件 效果图: 下拉控件的布局结构: < ...
- 编辑框等控件边框美化(继承CEdit,然后覆盖OnMouseLeave, OnSetFocus, OnPaint函数即可。原来的CEdit虽然代码不可见,但它也是有句柄的,照样随便画)
源码说明:美化能获取焦点控件的边框颜色,获取焦点后颜色不同(类似彗星小助手.QQ等软件),支持自定义颜色,支持单独设置各个控件颜色.实现方法:子类化,在WM_NCPAINT.WM_PAINT等消息自己 ...
- css input checkbox复选框控件 样式美化的多种方案
checkbox复选框可能是网站中常用的html元素,但大多数人并不满意它的默认样式,这篇文章就讲讲如何实现input checkbox复选框控件 样式美化效果. 资源网站大全 https://55w ...
- VC++ CStatic控件背景透明且改变其文本时,文字重叠解决方法
最近在项目中将CStatic控件设置为背景透明且在一个定时器函数改变其文本,结果CStatic的文字重叠了.解决该问题的方案是:从CStatic类派生自己的静态文本控件. 其实设置背景透明,也就是在C ...
- WinForm界面开发之布局控件"WeifenLuo.WinFormsUI.Docking"的使用
WinForm界面开发之布局控件"WeifenLuo.WinFormsUI.Docking"的使用 转自:http://www.cnblogs.com/wuhuacong/arch ...
- Qt 界面使用自己定义控件 "提升为"
1.效果图 我做了一个很easy的样例,一个能够显示颜色的QLabel,边上有个button,点击,跳出颜色选取的Dialog,然后选择一个颜色.这个QLabel会变成什么颜色. 2.ColorLab ...
- cesium编程入门(四)界面介绍及小控件隐藏
感性认识 界面介绍,viewer Geocoder : 查找位置工具,查找到之后会将镜头对准找到的地址,默认使用bing地图 Home Button :视角返回初始位置. Scene Mode Pic ...
- CStatic控件SS_NOTIFY属性
SS_NOTIFY Sends the parent window STN_CLICKED, STN_DBLCLK, STN_DISABLE, and STN_ENABLE notification ...
- cesium编程入门(四)界面介绍及小控件隐藏
感性认识 界面介绍,viewer Geocoder : 查找位置工具,查找到之后会将镜头对准找到的地址,默认使用bing地图 Home Button :视角返回初始位置. Scene Mode Pic ...
随机推荐
- 征服OA 飞鱼工作流程的在线培训课程(两)HTML形成基于
表HTML的重要作用,等效混凝土框架建筑的行,于div在此之前流行.是否所有形式的世界.在角色表页面主要是针对页面布局和定位.通过整合人才规划表设计出合理的页面布局. 当然.更重要的是,存在是表示数据 ...
- 基于webRTC技术 音频和视频,IM解
由于原来的文章 http://blog.csdn.net/voipmaker 转载注明出处. 基于WebRTC技术可实现点对点音视频.即时通信.视频会议.最新的系统组件包含: TeleICE NAT ...
- 添加cordova-plugin-file-opener2后,打包出错
原文:添加cordova-plugin-file-opener2后,打包出错 报错如下: * What went wrong: Execution failed for task ':app:proc ...
- Android Studio如何删除module
当你想在Android Studio中删除某个module时,大家习惯性的做法都是选中要删除的module,右键去找delete.但是 在Android Studio中你选中module,右键会发现没 ...
- sublime Package Control 设备
sublime 插件的官方网站 https://sublime.wbond.net/ 点击Installation watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5u ...
- 《大规模Web服务开发技术》
Web 服务开发的心灵鸡汤 周末去上海陪妹子的两天在路途上看完了这本<大规模 Web 服务开发技术>. <大规模 Web 服务开发技术>是日本的 Hetena 团队以夏天举办的 ...
- webpack优化经验1(持续)
1 不知道该优化哪里 先开启gzip压缩,这样可以很直接的减少请求包的体积,效果显著,不过需要在服务器端作相应的配置才能生效 2拆分vendor包, 减少单体包的体积,并行加载 通过配置,将不同的公用 ...
- Swift 分类 结构体
感谢原作者:http://www.cocoachina.com/newbie/basic/2014/0612/8780.html 类和结构体是人们构建代码所用的一种通用且灵活的构造体.为了在类和结构体 ...
- mysql升级到5.7时间戳(timestamp)默认值报错
原文:mysql升级到5.7时间戳报错 往数据库里创建新表的时候报错: [Err] 1067 - Invalid default value for 'updateTime' DROP TABLE I ...
- 3.RabbitMQ相关概念的杂谈
1.vhost,为什么我要有这个vhost呢? 这是因为可能有很多组使用RabbitMQ,有产品组,用户组,vhost,虚拟主机的意思,可以避免命名冲突. 2.Exchange,交换机 有四种交换机 ...