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()中进行设置

  1. PreSubclassWindow
  2. void CSkinStatic::PreSubclassWindow()
  3. {
  4. // TODO: 在此添加专用代码和/或调用基类
  5. DWORD dwStyle = GetStyle();
  6. SetWindowLong(GetSafeHwnd(),GWL_STYLE,dwStyle | SS_OWNERDRAW  );
  7. CStatic::PreSubclassWindow();
  8. }

第三,就是重载DrawItem,然后在里面想怎么画就怎么画了。

  1. DrawItem
  2. void CSkinStatic::DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/)
  3. {
  4. CRect rcWnd;
  5. GetWindowRect(&rcWnd);
  6. ScreenToClient(&rcWnd);
  7. CString strText;
  8. GetWindowText(strText);
  9. CBitmap bmp;
  10. bmp.LoadBitmap(IDB_BITMAP1);
  11. BITMAP bmpInfo;
  12. bmp.GetBitmap(&bmpInfo);
  13. CDC *pdc = GetWindowDC();
  14. CDC dcMem;
  15. dcMem.CreateCompatibleDC(pdc);
  16. CBitmap bmpBg;
  17. bmpBg.CreateCompatibleBitmap(pdc,rcWnd.Width(),rcWnd.Height());
  18. dcMem.SelectObject(&bmpBg);
  19. CDC dcDraw;
  20. dcDraw.CreateCompatibleDC(pdc);
  21. dcDraw.SelectObject(&bmp);
  22. dcMem.StretchBlt(0,0,rcWnd.Width(),rcWnd.Height(),&dcDraw,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);
  23. CFont font;
  24. VERIFY(font.CreateFont(
  25. ,                        // nHeight
  26. ,                         // nWidth
  27. ,                         // nEscapement
  28. ,                         // nOrientation
  29. FW_NORMAL,                 // nWeight
  30. FALSE,                     // bItalic
  31. FALSE,                     // bUnderline
  32. ,                         // cStrikeOut
  33. ANSI_CHARSET,              // nCharSet
  34. OUT_DEFAULT_PRECIS,        // nOutPrecision
  35. CLIP_DEFAULT_PRECIS,       // nClipPrecision
  36. DEFAULT_QUALITY,           // nQuality
  37. DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
  38. "宋体"));                 // lpszFacename
  39. dcMem.SelectObject(&font);
  40. dcMem.SetBkMode(TRANSPARENT);
  41. dcMem.SetTextColor(RGB(255,0,0));
  42. dcMem.DrawText(strText,&rcWnd,DT_CENTER);
  43. pdc->BitBlt(0,0,rcWnd.Width(),rcWnd.Height(),&dcMem,0,0,SRCCOPY);
  44. bmp.DeleteObject();
  45. ReleaseDC(pdc);
  46. }

这个绘图稍有点麻烦,大致是这样的 先创建内存两个内存DC一个作为画布,另一个负责引入图片,再拉伸拷贝到画布DC上,最后画布DC全部拷贝到窗口DC上。这主要是防止贴图和写文字不同步,造成有图无字,也避免了一个内存DC造成的字体拉伸。运用了网上盛传的双缓冲。

经过我们自己的代码处理后,可以看看Static成什么样了

当然可以自己画个渐变色出来。不过个人觉得还是贴图方便。

Static控件的美化比较简单,没有什么多的消息要进行处理。不过要想设置个性的,也得需要几个状态变量,多个图片吧。

基本的东西都很好做,如果想做好点细腻点,总会有点麻烦的。

http://blog.csdn.net/witch_soya/article/details/7569773

界面美化.CStatic控件的美化(好多系列文章)的更多相关文章

  1. CSS3美化表单控件

    表单的默认控件在不同的浏览器中的样式不同,用户体验很差.用CSS3可以实现表单控件的美化,可以提供更好的用户体验.不足之处就是浏览器的兼容性问题. 一.下拉控件 效果图: 下拉控件的布局结构: < ...

  2. 编辑框等控件边框美化(继承CEdit,然后覆盖OnMouseLeave, OnSetFocus, OnPaint函数即可。原来的CEdit虽然代码不可见,但它也是有句柄的,照样随便画)

    源码说明:美化能获取焦点控件的边框颜色,获取焦点后颜色不同(类似彗星小助手.QQ等软件),支持自定义颜色,支持单独设置各个控件颜色.实现方法:子类化,在WM_NCPAINT.WM_PAINT等消息自己 ...

  3. css input checkbox复选框控件 样式美化的多种方案

    checkbox复选框可能是网站中常用的html元素,但大多数人并不满意它的默认样式,这篇文章就讲讲如何实现input checkbox复选框控件 样式美化效果. 资源网站大全 https://55w ...

  4. VC++ CStatic控件背景透明且改变其文本时,文字重叠解决方法

    最近在项目中将CStatic控件设置为背景透明且在一个定时器函数改变其文本,结果CStatic的文字重叠了.解决该问题的方案是:从CStatic类派生自己的静态文本控件. 其实设置背景透明,也就是在C ...

  5. WinForm界面开发之布局控件"WeifenLuo.WinFormsUI.Docking"的使用

    WinForm界面开发之布局控件"WeifenLuo.WinFormsUI.Docking"的使用 转自:http://www.cnblogs.com/wuhuacong/arch ...

  6. Qt 界面使用自己定义控件 &quot;提升为&quot;

    1.效果图 我做了一个很easy的样例,一个能够显示颜色的QLabel,边上有个button,点击,跳出颜色选取的Dialog,然后选择一个颜色.这个QLabel会变成什么颜色. 2.ColorLab ...

  7. cesium编程入门(四)界面介绍及小控件隐藏

    感性认识 界面介绍,viewer Geocoder : 查找位置工具,查找到之后会将镜头对准找到的地址,默认使用bing地图 Home Button :视角返回初始位置. Scene Mode Pic ...

  8. CStatic控件SS_NOTIFY属性

    SS_NOTIFY Sends the parent window STN_CLICKED, STN_DBLCLK, STN_DISABLE, and STN_ENABLE notification ...

  9. cesium编程入门(四)界面介绍及小控件隐藏

    感性认识 界面介绍,viewer Geocoder : 查找位置工具,查找到之后会将镜头对准找到的地址,默认使用bing地图 Home Button :视角返回初始位置. Scene Mode Pic ...

随机推荐

  1. hadoop 3.x 配置日志聚集功能

    打开$HADOOP_HOME/etc/hadoop/yarn-site.xml,增加以下配置(在此配置文件中尽量不要使用中文注释) <!--logs--> <property> ...

  2. Android Studio入门(安装-->开发调试)

    写在前面的话:本文来源:http://blog.csdn.net/yanbober/article/details/45306483 目标:Android Studio新手–>下载安装配置–&g ...

  3. Struts2——(8)struts2中文件的上传

    通过2种方式模拟单个文件上传,效果如下所示 开发步骤如下: 1.新建一个web工程,导入struts2上传文件所需jar,如下图 目录结构              2.新建Action  第一种方式 ...

  4. FZU Problem 2062 Suneast &amp; Yayamao

    http://acm.fzu.edu.cn/problem.php?pid=2062 标题效果: 给你一个数n,要求求出用多少个数字能够表示1~n的全部数. 思路: 分解为二进制. 对于一个数n.看它 ...

  5. sql获取数据库的所有表以及名称字段

    获取数据库中所有的表 SELECT SysObjects.name AS Tablename FROM sysobjects WHERE xtype = 'U' 获取数据库中所有表的列名 SELECT ...

  6. jQuery迭代器

    http://www.imooc.com/code/3417 迭代器 迭代器是一个框架的重要设计.我们经常需要提供一种方法顺序用来处理聚合对象中各个元素,而又不暴露该对象的内部,这也是设计模式中的迭代 ...

  7. 拦截和跟踪HTTP请求的主要方法及实现

    一.HTTP 请求的拦截技术可以广泛地应用在反向代理.拦截 Ajax 通信.网页的在线翻译.网站改版重构等方面.而拦截根据位置可以分为服务器端和客户端两大类,客户端拦截借助 JavaScript 脚本 ...

  8. 矿Spring入门Demo

    第一步:输入Spring jar 包裹 Spring核心包(4个)  日志包(2个)  jdbc模板支持(1个)  spring-jdbc-3.2.0.RELEASE.jar  模板相关事务处理包(1 ...

  9. QT之二级菜单(二级菜单的箭头可以使用QSS设置图片)

    QT之二级菜单 QT之二级菜单 开场白 效果图 上代码 可参考文章 下代码 结尾 开场白 今天我们一起来了解下,在我们QT中,二级菜单是如何实现的,在上篇我们学习了QT之系统托盘,QT之自定义菜单,  ...

  10. 简单IO,将一段字符串存入一个记事本

    using System; using System.IO; using System.Text; namespace 字符串存入记事本 { class Program { static void M ...