上一节中鸡啄米主要讲的是画笔CPen的用法,前面也说了,GDI对象中最常用的就是画笔和画刷,本节就讲讲画刷CBrush。

鸡啄米依然是通过实例的方式来说明画刷的用法。此实例要实现的功能是,对话框上有一个按钮控件和一个图片控件,点击按钮弹出颜色对话框,然后在颜色对话框中选择颜色并点击“确定”后,图片控件中将显示选择的颜色。

其实此实例的功能,还可以通过重载对话框WM_CTLCOLOR消息的响应函数等方法来实现,但为讲解画刷的CBrush的使用,鸡啄米采用了下面代码中的方法。

以下是此实例的具体实施步骤:

1、创建一个基于对话框的MFC工程,名字设为“Example51”。

2、在自动生成的对话框模板IDD_EXAMPLE51_DIALOG中,删除“TODO: Place dialog controls here.”静态文本框,添加一个按钮控件和一个Picture控件,ID分别设为IDC_COLOR_SEL_BUTTON和IDC_COLOR_SHOW_STATIC,按钮控件的Caption属性设为“选择颜色”,此时对话框模板如下图所示:

3、为Picture控件IDC_COLOR_SHOW_STATIC添加CStatic变量,名称设为m_picColor。

4、在对话框模板中双击“选择颜色”按钮,为其添加点击消息的响应函数CExample51Dlg::OnBnClickedColorSelButton(),修改该函数的实现如下:

C++代码
  1. void CExample51Dlg::OnBnClickedColorSelButton()
  2. {
  3. // TODO: Add your control notification handler code here
  4. COLORREF color = RGB(255, 0, 0);    // 颜色对话框的初始颜色
  5. CColorDialog colorDlg(color);       // 构造颜色对话框,初始颜色为红色
  6. CRect rectPicture;       // 图片控件的矩形区域坐标
  7. CBrush newBrush;         // 创建的新画刷
  8. CBrush *pOldBrush;       // 旧画刷的指针
  9. CClientDC clientDC(this); // 构造客户区的设备上下文对象
  10. if (IDOK == colorDlg.DoModal())    // 显示颜色对话框
  11. {
  12. // 如果点击了颜色对话框的“确定”按钮,则执行以下操作
  13. // 获取颜色对话框中选择的颜色
  14. color = colorDlg.GetColor();
  15. // 用选择的颜色创建新画刷
  16. newBrush.CreateSolidBrush(color);
  17. // 获取图片控件矩形区域的屏幕坐标
  18. m_picColor.GetWindowRect(&rectPicture);
  19. // 将图片控件矩形区域的屏幕坐标转换为其父窗口即对话框的客户区坐标
  20. ScreenToClient(&rectPicture);
  21. // 选择新画刷,并保存旧画刷的指针到pOldBrush
  22. pOldBrush = clientDC.SelectObject(&newBrush);
  23. // 以新画刷为图片控件填充颜色
  24. clientDC.Rectangle(rectPicture);
  25. // 恢复旧画刷
  26. clientDC.SelectObject(pOldBrush);
  27. // 删除新画刷
  28. newBrush.DeleteObject();
  29. }
  30. }

代码中已经加了详细的注释,不过鸡啄米觉得有必要再简单介绍下CClientDC类。CClientDC类是CDC类的派生类,它生成的设备上下文对应于窗口的客户区,另一个类CWindowDC也是CDC类的派生类,它对应的则包括客户区和非客户区,也就是说,CClientDC只能在客户区绘图,而CWindowDC可在客户区和非客户区绘图。

讲到这里,有人会问,到底什么是客户区,什么是非客户区?非客户区包括窗口中的标题栏、菜单栏、状态栏、滚动条、边框等区域,客户区就是除去非客户区之外的区域。

5、编译运行程序,在结果对话框中,点击“选择颜色”按钮弹出颜色对话框,并选择颜色后,效果如下图:

本节教程除讲了画刷CBrush的使用外,还让大家简单温习了颜色对话框的用法。

鸡啄米提醒大家,如果有什么函数或类的用法不是很清楚,均可以查阅MSDN。最后祝大家学习工作顺利,有事没事多来鸡啄米逛逛,呵呵。

转自:http://www.jizhuomi.com/software/181.html

VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)的更多相关文章

  1. VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)

    上一节中鸡啄米讲了GDI对象之画刷CBrush,至此图形图像的入门知识就讲完了.从本节开始鸡啄米将为大家带来Ribbon界面开发的有关内容.本文先来说说如何创建Ribbon样式的应用程序框架. Rib ...

  2. VS2010/MFC编程入门之五(MFC消息映射机制概述)

    VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html 上一讲鸡啄米为大家简单分析了MFC应用 ...

  3. VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)

    上一节中鸡啄米讲了CDC类及其屏幕绘图函数,本节的主要内容是GDI对象之画笔CPen. GDI对象 在MFC中,CGdiObject类是GDI对象的基类,通过查阅MSDN我们可以看到,CGdiObje ...

  4. VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下)

    前面一节讲了树形控件Tree Control的简介.通知消息以及相关数据结构,本节继续讲下半部分,包括树形控件的创建.CTreeCtrl类的主要成员函数和应用实例. 树形控件的创建 MFC为树形控件提 ...

  5. VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口)

    上一节中鸡啄米讲了文档.视图和框架结构中各对象之间的关系,本节主要讲讲在MFC中如何分割窗口. 分割窗口概述       分割窗口,顾名思义,就是将一个窗口分割成多个窗格,在每个窗格中都包含有视图,或 ...

  6. VS2010-MFC(图形图像:GDI对象之画刷CBrush)

    转自:http://www.jizhuomi.com/software/248.html 上一节讲的是画笔CPen的用法,前面也说了,GDI对象中最常用的就是画笔和画刷,本节就讲讲画刷CBrush. ...

  7. VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)

    前面一节中鸡啄米为大家简单介绍了如何创建Ribbon样式的应用程序框架,本节教程就来初步讲讲怎样为Ribbon Bar添加Ribbon控件. VS2010为Ribbon界面开发提供了Ribbon De ...

  8. VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程)

    加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有些了解了,有个好的开始对于以后的学习大有裨益.趁热打铁,鸡啄米这一节讲讲什么是模态对话框和非模态对话框,以及模态对话框怎样弹出. 一.模态 ...

  9. VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)

    上一节中鸡啄米讲了为Ribbon Bar添加控件的方法.本节教程鸡啄米将继续完善前面的实例,讲解一些稍复杂的控件的添加方法,及如何为它们添加消息处理函数. 一.为Ribbon Bar添加更多Ribbo ...

随机推荐

  1. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十八:SDRAM模块① — 单字读写

    实验十八:SDRAM模块① — 单字读写 笔者与SDRAM有段不短的孽缘,它作为冤魂日夜不断纠缠笔者.笔者尝试过许多方法将其退散,不过屡试屡败的笔者,最终心情像橘子一样橙.<整合篇>之际, ...

  2. swiper监听左滑还是右滑动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  3. SSH教程从零打造在线网盘系统前言&目录

    本系列教程内容提要 本系列教程是一个学习教程,是关于Java工程师的SSH(Struts2+Spring+Hibernate)系列教程,本教程将会分为四个部分和大家一同打造一个在线网盘系统,由于教程是 ...

  4. 【vue】---项目接口管理---【巷子】

    一.前言 在vue开发中,会涉及到很多接口的处理,当项目足够大时,就需要定义规范统一的接口 假设后端的文档分成了以下几个模块 1.发现模块 2.个人信息模块 3.商品模块 4.评论模块 ...... ...

  5. ELK之在windows安装filebeat收集日志

    登录官方网站下载filebeat的windows客户端 https://www.elastic.co/downloads/beats 下载压缩包,无需解压 修改配置文件filebeat.yml 其余设 ...

  6. poj3728The merchant 【倍增】【LCA】

    There are N cities in a country, and there is one and only one simple path between each pair of citi ...

  7. Ubuntu16.04下安装配置numpy,scipy,matplotlibm,pandas 以及sklearn+深度学习tensorflow配置+Keras2.0.6(非Anaconda环境)

    1.ubuntu镜像源准备(防止下载过慢): 参考博文:http://www.cnblogs.com/top5/archive/2009/10/07/1578815.html 步骤如下: 首先,备份一 ...

  8. numpy的文件存储 .npy .npz 文件

    1)Numpy能够读写磁盘上的文本数据或二进制数据.将数组以二进制格式保存到磁盘np.load和np.save是读写磁盘数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 ...

  9. Mergeable Stack 直接list内置函数。(152 - The 18th Zhejiang University Programming Contest Sponsored by TuSimple)

    题意:模拟栈,正常pop,push,多一个merge A B 形象地说就是就是将栈B堆到栈A上. 题解:直接用list 的pop_back,push_back,splice 模拟, 坑:用splice ...

  10. 安装XP时BIOS的设置(ahci ide)

    和以前使用Windows XP一样,很多用户都在设法提高Windows 7的系统运行速速,比较常见的方法大多是对系统服务进行优化,去掉一些可有可无的系统服务,还有就是优化资源管理器菜单等.除此之外,还 ...