BngThea 发表于 2017-7-24 16:25:27

《Windows SDK》020 窗口绘画:画笔1

一 核心知识点
* 当前画笔
每次绘画,除绘制点SetPixel函数外,其他绘制曲线函数都需要使用画笔,默认都是使用“当前画笔”,而“当前画笔”默认为BLACK_PEN

* Windows预设的画笔
通过GetStockObject(WHITE_PEN)可以直接调用Windows预设的画笔,有以下选择——
1 BLACK_PEN 黑色画笔
2 WHITE_PEN 白色画笔
3 NULL_PEN透明画笔
4 DC_PEN    纯色画笔,使用该画笔需要提前调用SetDCPenColor来设置其颜色

* 选定画笔
获得画笔之后,还需要将通过SelectObject函数将该画笔选中,才能使用
每次只能选中一种画笔
该函数会返回之前的画笔,一般进行保留,并在绘制完成后将其复原

* 创建与删除画笔
使用CreatePen或CreatePenIndirect来创建一个自定义的画笔
使用DeleteObject来删除自己创建的画笔

* 获得当前画笔的信息
通过GetCurrentObject可以直接获得“当前画笔”的句柄
通过GetObject可以获得“当前画笔”的LOGPEN结构

二 新API函数 和 结构
* SetDCPenColor(hdc, RGB(255, 0, 0)) 和 SetDCBrushColor(hdc, RGB(255, 0, 0))
这两个函数设置当前环境中的 DC_PEN 或 DC_BRUSH 的颜色
配合GetStockObject使用可以设置和使用 DC_Pen 或 DC_BRUSH

* hOldPen = SelectObject(hdc, hPen)
该函数用于选择一个对象到当前环境中,同时返回之前的同类型对象

第一个参数: 当前环境句柄
第二个参数: 需要选中的类型的对象

第二个参数可以是画笔,画刷,字体等等
返回的类型必须和第二个参数的类型一致
利用该函数完成绘制操作后,一般再次调用该函数将第二个参数设置为之前的对象: SelectObject(hdc, hOldPen)

* CreatePen(PS_SOLID, 100, RGB(255, 0, 0))
该函数创建一个用户自定义的画笔

第一个参数:画笔的类型,可以选择的类型有:
1 PS_SOLID      实体画笔
2 PS_DASH       虚线
3 PS_DOT      点线
4 PS_DASHDOT    点划线
5 PS_DASHDOTDOT 点点划线
6 PS_NULL       透明画笔
7 PS_INSIDEFRAME 特定实线画笔:在绘制封闭曲线时将想内部拓宽画笔

第二个参数: 画笔的宽度
当第一个参数不是 PS_SOLID 或 PS_INSIDEFRAME时其值必须小于等于1
若该值为0,则默认宽度为1个单位

第三个参数: 画笔的颜色,通过RGB宏进行设定

* CreatePenIndirect(plgpen)
该函数同CreatePen,只是将画笔的属性都放在一个LOGPEN结构中
该函数的优势在于如果要生成多个画笔,可以先设置好各个画笔的结构成员,然后循环调用,从而省去反复书写CreatePen函数

* LOGPEN 结构
该结构的成员数目及含义同CreatePen的形参完全一致

* DeleteObject(hPen)
该函数删去一个类型对象,同时释放其占用的系统资源
该函数可以删去的类型包括画笔,画刷,字体等等
该函数一般用来删除用户自定义的类型对象,而不能使用该函数去删除系统预设的类型对象,如画笔WHITE_PEN
该函数一般搁置在WM_DESTORY消息处理代码中

* hPen = GetCurrentObject(hdc, OBJ_PEN)
该函数可以获得当前环境中的指定的类型对象的句柄

第一个参数: 当前环境句柄
第二个参数: 指定的类型对象,可以是以下几种——
1 OBJ_BITMAP       位图
2 OBJ_BRUSH      画刷
3 OBJ_COLORSPACE   色彩空间
4 OBJ_PONT         字体
5 OBJ_PAL          调色板
6 OBJ_PEN          画笔

* GetObject(hPen, cbBuffer, pvObject)
该函数获得指定类型对象的信息

第一个参数:指定的类型对象的句柄,可以是画笔,画刷,字体等等
第二个参数:指定将要写入缓冲区的字节数
第三个参数:指向缓冲区的指针,用于存放类型对象的信息
页: [1]
查看完整版本: 《Windows SDK》020 窗口绘画:画笔1