尽管使用备用对象中的画笔非常方便,但只能使用实心的黑色画笔、实心的白色画笔

或者没有画笔三种情况。如果想获得更丰富的效果,则必须创建自己的画笔。
这里是创建画笔的一-般过程:调用CreatePen或者CreatePenIndirect 函数创建-一个“逻
辑画笔”,它只是说明你想得到一个什么样的画笔。这些函数会返回-一个逻辑画笔的句柄。
然后需要调用SelectObject函数将画笔选入设备环境中。接着,就可以使用这个新的画笔来
绘制线条。一次只能有一支画笔被选入设备环境。释放设备环境之后(或者将其他画笔选入
设备环境之后)。需要调用DeleteObject函数来删除你创建的逻辑画笔。此后,画笔的句柄
不再有效。
逻辑画笔是.一个“GDI对象”,一个程序可以创建6种GDI对象,它是其中之一,其他5种分别是画刷、位图、区域、字体和调色板。除了调色板之外,所有这些对象都通过
SelectObject函数选入设备环境。
下面三条规则控制画笔等GDI对象的使用:
◆最终应当删除你所创建的所有GDI对象。
◆当GDI对象被选入一个有效的设备环境时,不要删除它。
不要删除备用对象。
这些规则都是有道理的,但是有时候会有点棘手。下面我们将通过例子来帮助理解这些
规则。
CreatePen函数的一- 般语法如下:
hPen = CreatePen (iPenStyle. iwidth, crCo1or);
其中,参数iPenStyle决定画笔绘制的是实线或者虚线或点线。这个参数可以使用定义在
WINGDIH头文件中的下列标识符。图5-18显示了每种样式产生的线条。
PS. SouD
PS_ DASH
PS. ,DOT
PS DASHDOT
PS_ DASHDOTDOT
PS
NULL
PS. JINSIDEFRAME
图5-18 7 种画笔的样式
对于PS_ SOLID. PS_ NULL和PS_ INSIDEFRAME 样式,参数iWidth表示画笔的宽度。
当iWidth值为0时,Windows 把西笔的宽度设定为1个像素。备用画笔总是1个像素宽。
如果指定使用虚线或点线样式,同时把画笔宽度设定为大于1个像素,那么Windows会使
用实心的画笔来代替。
CreatePen的参数crColor是一个COLORREF值,它用来指定画笔的颜色。对所有的除
了PS_ INSIDEFRAME之外的画笔样式,当将画笔选入到设备环境时,Windows 将该颜色
转换为设备所能表示的最近的纯色。PS_ INSIDEFRAME 画笔样式是唯- -能够使用抖动色的
画笔样式,并且只有当画笔宽度大于1时才如此。
PS_ INSIDEFRAME西笔样式用于填充区域的函数时有另外-一个奇特之处。当使用非
PS
INSIDEFRAME样式的画笔样式时,如果用于绘制轮廓的画笔宽度大于1个像索,那么
画笔的中心会处于边界之上,这样画出的轮廓线部分将会在边框之外。但是对于
PS_ INSIDEFRAME 画笔样式,整个轮廓线都会在边框内。
也可以通过建立一一个类型为LOGPEN(“逻辑画笔”)的结构,并调用CreatePenIndirect
函数来建立-一个画笔。如果你的程序在初始化时需要创建很多不同的画笔,这种方法会很
有效。
为了使用CreatePenIndirect函数,首先要定义一个类型为LOGPEN的结构:
LOGPEN logpen;
这个结构有三个字段: lopnStyle(无符 号整型,或UINT)表示画笔样式,lopnWidh(一 个
POINT结构)是以逻辑单位表示的画笔宽度,还有lopnColor(COLORREF)表示画笔的颜色。
Windows仅使用lopnWidth结构中的x字段来设置画笔的宽度,y字段会被忽略。
可以通过将该结构的地址传递到CreatePenIndirect函数来建立画笔:
hPen = CreatePenIndirect (&logpen) ;
注意: CreatePen 和CreatePenIndirect函数不需要设备环境句柄。在调用SelectObject之前,
这些函數创建的逻辑画笔和设备环境没有任何联系。可以为几种不同的设备,例如
屏幕和打印机,使用相同的逻辑画笔。
这里给出创建、选择和删除画笔的一种方法。假定程序使用三种画笔(宽度为1的黑色
画笔、宽度为3的红色画笔和黑色的点线画笔)。可以首先定义存储这些画笔的句柄的静态
变量:
static HPEN hPenl, hPen2, hPen3;
在处理WM CREATE消息时,可以创建这三种画笔:
hPen1 = CreatePenIPs
SOLID, 1,0>;
hPen2 = CreatePen(PS_ SOLID,
RGB(255,0, 0));
hPen3■CreatePen(PS DOT, 0 ,01;
在处理WM_PAINT消息时(或者在任何拥有有效的设备环境句柄时),可以将其中任何-支
画笔选入到设备环境,并且使用它来绘制线条:
Selectobject (hdc, hPen2);
↑1 ine -drawing funct ions
Selectobject (hde, hPen1) ↑
l1ine -drawing functions]
在处理WM_ DESTROY消息时,可以删除这三种画笔:
Delet eobject (hPenl);
Delete0bj ect (hPen2) ; .
DeleteObject (hPen3) I
这是用于创建、选择和删除画笔最直接的方法。但是很显然,程序必须知道需要使用什么
样的画笔。因此可能需要在每个WM_ PAINT 消息处理时创建画笔,并在调用EndPaint函
数后删除它们。(也可以在调用EndPaint函数前刑除它们,但是需要小心,不要删除已被选
入设备环境的当前画笔。)
可以随时创建画笔,还可以将CreatePen和SelectObject调用组合到一条语句中:
Selectobject (hde, CreatePen (PS_ DASH,0,RGB (255, 0,0)));
现在,在绘制直线时,将使用一个红色的虚线画笔。红色虚线绘制完成后,可以删除画笔。
槽糕,你没有保存画笔句柄,怎么才能删除画笔呢?前面介绍过,SelectObject 函数将返回
先前被选入设备环境的画笔句柄。也就是说,可以通过将备用的BLACK_ PEN选入到设备
环境中来得到需要被删除的画笔句柄,然后删除它:
DeleteObject (Selectobject (Ihde. Get stockobject (BLACK. .PEN)1);
下面给出另一种方法。当将一支画笔选入到一个新创建的设备环境时,保存
SelectObject返回的画笔句柄:
hPen。Selectobject (hde, CreatePen (PS_ ,DASH, 0, RGB (255, 0。0)1);
hPen究竟是什么呢?如果这是在获得设备环境后第一次调用 SelectObject函数,hPen 就是
BLACK_ PEN的句柄。现在可以在同一条语句中选择该画笔到设备环境,并且删除自己创
建的画笔(第二次SelectObject调用返回你创建的画笔的句柄):
DeleteObject (Selectobject (hdc, hPen));
如果有一个画笔的句柄,LOGPEN结构中各个字段成员的值就可以通过调用GetObject
函数获得:
Getobject (hPen, sizeot (LOGPEN), (LPVOID) &logpen);
如果需要获得当前被选入设备环境的画笔句柄,则调用:
hPen。GetCurrentobject (hdc, OBJ_ PEN) ;

window程序设计(创建、选择和删除画笔)相关推荐

  1. window程序设计学会_是时候我们学会设计合适的饼图了

    window程序设计学会 Pie charts are common in data science - next to the 饼形图在数据科学中很常见- bar chart and the lin ...

  2. MySQL中如何创建表与删除表

    创建表与删除表 一.创建表 通过DDL语句创建表 例 创建一个employees表包括雇员ID,雇员名字,雇员薪水: 首先要转换到需求的库: use 库名:Create table employee ...

  3. 可编辑选择、删除条目的ListView

    今天,我是第一次在掘金写作,写一篇技术文章,是我自己在Android开发中总结提炼出的一个自定义控件EditListView,下面主要对其功能及其使用做简单介绍. 首先,我们来看一下效果演示图: 接下 ...

  4. 五、C语言创建桌面程序:画笔和画刷

    一.画笔画刷的概念 画笔和画刷都用来在画布上绘图.画布就是用来绘画的一块背景,可以有颜色,也可以没有,也可以有图案(比如条纹.网格等):画布可以理解为我们平时作图时使用的纸. 画笔用来画线,可以是封闭 ...

  5. Github创建分支并删除文件

    Github创建分支并删除文件 1. $ git init 2. $ git remote add origin https://github.com/binbinErices/Car_CRM_Sys ...

  6. SAP生产订单创建、工序删除/增加、组件删除/增加、生产订单下达、采购订单创建

    2021年的时候在深圳光明区某企业做了一个项目:委外生产订单创建.因为委外的生产订单和当前企业的工序以及组件并不相同,所以需要对创建的生产订单的工序进行删除和增加,对组件进行删除和增加. 当时的业务程 ...

  7. R操作MySQL数据库创建表、删除表、增删改查(CRUD)

    R操作MySQL数据库创建表.删除表.增删改查(CRUD) 关系数据中的数据是按照一定范式去存储的.当我们需要非常高级和复杂的Sql查询就可以使用关系数据库的数据资产.不光java和python可以容 ...

  8. 深入理解WMS(一):Window的创建过程

    8.3 Window的创建过程 View是Android中的视图的呈现方式,但是View不能单独存在,它必须附着在Window这个抽象的概念上面,因此有视图的地方就有Window.Android中可以 ...

  9. C#xml创建修改读取删除帮助类XmlHelper.cs

    <strong><span style="color:#ff0000;">[XML帮助类]C#xml创建修改读取删除帮助类XmlHelper.cs < ...

最新文章

  1. 3.Java集合-HashSet实现原理及源码分析
  2. T-SQL 控制流语句
  3. OC字符串转C语言字符串
  4. vs 无法解析变量$_C语言新手常见错误(Vs使用,语法...),绝对直击痛点
  5. 三国志战略版360区S4服务器合并信息,三国志战略版pk赛季怎么转区?s4转区规则[多图]...
  6. Altium Designer20 PCB板子绘制
  7. 通配符在DNS系统中的应用
  8. 使用客户端行为来丰富 ASP.NET 的 DataGrid
  9. java 的数据类型转换_java数据类型转换汇总
  10. NHibernate Antlr.Runtime.NoViableAltException报错
  11. 禁止拖放对象文本被选择的方法
  12. scala中的集合框架
  13. 量子力学 or 线性代数(六——动量、能量)
  14. vue中img本地图片地址的具体使用
  15. 重磅资源!PyTorch的福音,用PyTorch 1.0进行教学的免费深度学习课程,来自idiap和瑞士洛桑联邦理工学院...
  16. python输入一个自然数n如果n为奇数_日本数学家谷角静夫在研究自然数时发现了一个奇怪现象(“谷角猜想”):对于任意一个自然数...
  17. Web前端学习笔记——JavaScript之面向对象游戏案例:贪吃蛇
  18. 生命的轨迹会沿着期望的方向走去
  19. linux drm 架构 基础
  20. 云业务贡献40.5%增长:亚马逊2022年财报亮点解读

热门文章

  1. 外码,参照关系和被参照关系
  2. arnold函数 matlab_接再厉,发个Arnold置乱变换的matlab代码
  3. 教你如何辨清常见的五种红木
  4. 如何用Camtasia给视频添加字幕?
  5. Java二叉树前序遍历:递归+非递归实现,非递归详解
  6. 互联网摸鱼日报(2022-12-16)
  7. C++虚函数继承与虚继承
  8. 【Linux 内核 内存管理】memblock 分配器编程接口 ⑤ ( memblock_free 函数 | memblock_remove_range 函数 )
  9. 使用Python自动化Microsoft Excel和Word
  10. vue 后台 xlsx 表格