第020讲:窗口绘画:画笔
知识点回顾:1. 当前画笔
无论是画线段、折线,还是画矩形、椭圆、弧等,都有一个共同的特点,它们都是使用一个叫“当前画笔”的对象进行绘制的。也就是说,这个“当前画笔”决定了线条的宽度、样式还有颜色。
2. Windows 提供的预设画笔
为了方便程序猿的使用,Windows 提供了一些预设的画笔供大家直接调用。我们可以使用 GetStockObject 函数获得这些画笔的句柄。
事实上 Windows 预设的画笔并不多,只有:BLACK_PEN、WHITE_PEN、NULL_PEN 和 DC_PEN,它们分别表示黑色画笔,白色画笔,空画笔(不绘制任何图形),还有纯色画笔(DC_PEN 需要调用 SetDCPenColor 函数先设置画笔颜色)。
3. 将制定画笔选入设备环境
获得画笔的句柄之后,你还需要将画笔选入设备环境中,新的画笔才能生效。
这里有两点需要注意的:
[*]设备环境一次只能选择和使用一个画笔,想要使用多个画笔的话,你可以重复的选入。
[*]SelectObject 函数调用成功后会返回设备环境中被替换下来的画笔句柄,这个值最好保留着,因为在新画笔完成绘画后,好的习惯是把替换下来的画笔还回去。这就跟你借人家东西你用完了就得还的道理一样。
4. 创建自定义画笔
如果你觉得 Windows 预设的画笔并不足以描绘你想要的狂野奔放的画面,那么你可以用 CreatePen 或 CreatePenIndirect 函数自己创建画笔。
CreatePen 函数的第一个参数指定画笔的样式,可以是 PS_SOLID(实线),PS_DASH(虚线),PS_DOT(点线),PS_DASHDOT(点划线),PS_DASHDOTDOT(点点划线),PS_NULL(空画笔)和 PS_INSIDEFRAME(实现,但画笔宽度向内扩展)。
其中,虚线、点线、点划线、点点划线,这些要求画笔的宽度不能大于 1,你可以填 1 或者 0 ,或者 0.几,它都是按照一个像素的宽度来画。
PS_NULL 样式和刚才 GetStockObject 函数的 NULL_PEN 是一样的,都是空画笔,不画任何东西。
最后一个 PS_INSIDEFRAME 样式是用于在 GDI 函数绘图中实现,绘制椭圆、矩形、圆角矩形、饼图以及弦等生成的封闭对象框时,画笔宽度向内扩展。
CreatePen 函数比较简单,直接调用就可以创建新画笔。CreatePenIndirect 函数跟它的英文含义一样,需要通过一个 LOGPEN 结构间接地创建画笔。也就是说,在调用 CreatePenIndirect 函数之前,要先建立一个类型为 LOGPEN 的结构。
如果你的程序在初始化时需要创建很多不同的画笔,这时候你是不是可以直接把这些画笔的样式依次存放在一个 LOGPEN 结构的数组中,然后用一个循环调用 CreatePenIndirect 函数就可以了。你的代码这么写,非常的优美。这时候如果使用 CreatePen 函数,你就不得不重复写好多次不同参数的 CreatePen 函数!
4. 删除画笔
当一个新画笔不再需要用到的时候,你要调用 DeleteObject 函数来删除它。
一般我们把 DeleteObject 函数部署在 WM_DESTROY 消息中,因为窗口都销毁了,肯定就不需要画笔了。当然你也可以在 WM_PAINT 中删除画笔,但要注意的是,当画笔对象被被选入当前设备环境中时,不能删除该对象。另外,Windows 预设的画笔是不能删除的,只能删除你自己创建的画笔。
5. 获取画笔句柄和画笔信息
如果需要获得当前被选入设备环境的画笔句柄,则可以调用 GetCurrentObject 函数。如果你手上有一个画笔的句柄,那么通过调用 GetObject 函数可以该画笔的信息存储到一个 LOGPEN 结构中。
6. 扩展阅读:抖动色在像素游戏中的应用
WinSDK
页:
[1]