使用现有画笔:
画笔的默认设备环境是 BLACK_PEN。该画笔会绘制一条实心的宽度为 1 像素的黑色线条。
Windows 提供三种“备用画笔”:BLACK_PEN, WHITE_PEN, NULL_PEN。
画笔句柄的类型为 HPEN。可用这个类型定义一个变量(例如 hPen): HPEN hpen ;
调用 GetStockObject() 可以获取备用画笔的句柄。
例如:hPen = GetStockObject(WHITE_PEN);
如果想使用该画笔的话必须将该画笔句柄选入设备环境:
SelectObject(hdc, hPen) ; 或者 SelectObject(hdc,GetStockObject(WHITE_PEN)) ;
现在绘制所有的线条都将使用 WHITE_PEN, 直到另一种设备选入设备环境或者你释放了设备环境句柄。
GetStockObject() 介绍:
功能:该函数检索预定义的备用笔、刷子、字体或者调色板的句柄。
函数原型是 HGDIOBJ GetStockObject(int fnObject) ;
参数: fnObject 指定对象的类型。
SelectObject() 介绍:
功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。
函数原型:HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj)
参数:
hdc:设备上下文环境的句柄。
hgdiobj:被选择的对象的句柄,该指定对象必须由如下的函数创建。
注释:该函数返回先前指定类型的选择对象,一个应用程序在它使用新对象进行绘制完成之后,
应该用原始的缺省的对象替换新对象。
例: SelectObject(hdc, GetStockObject(WHITE_PEN));
hPen = SelectObject(hdc, GetStockObject(WHITE_PEN));
此时,设备环境中的当前句柄自然是 WHITE_PEN,而变量 hPen 将是 BLACK_PEN 画笔的句柄。
创建,选择和删除画笔:
创建画笔的一般过程:调用 CreatePen 或者 CreatePenIndirect 函数创建一个“逻辑画笔”。
这些函数会返回一个逻辑画笔的句柄。然后调用 SelectObject() 将画笔选入设备环境。
接着就可以用该新画笔来绘制线条了。一次只能有一支画笔被选入设备环境。
释放设备环境之后(或者将其他画笔选入设备环境之后),需要调用 DelectObject() 删除创建的画笔。
逻辑画笔是一个“GDI对象”,一个程序可以创建 6 种 GDI 对象:
逻辑画笔,画刷,位图,区域,字体,调色板。
除了调色板之外,所有这些对象都通过 SelectObject() 选入设备环境。
控制 GDI 对象时牢记下面三条规则:
- 最终应当删除你所创建的所有 GDI 对象。
- 当 GDI 对象被选入一个有效的设备环境时,不要删除它。
- 不要删除备用对象。
CreatePen() 介绍:
功能:指定的样式、宽度和颜色创建画笔。
函数原型:HPEN CreatePen(int iStyle, int cWidth, COLORREF Color);
参数:
iStyle:指定画笔样式。
cWidth:以逻辑单位表示的画笔的宽度。
Color:画笔的RGB颜色。
返回值:如函数执行成功,就返回指向新画笔的一个句柄,否则返回零。
关于 nPenStyle 的值:
PS_SOLID:画笔画出的是实线
PS_DASH:画笔画出的是虚线(nWidth必须不大于1)
PS_DOT:画笔画出的是点线(nWidth必须不大于1)
PS_DASHDOT:画笔画出的是点划线(nWidth必须不大于1)
PS_DASHDOTDOT:画笔画出的是点-点-划线(nWidth必须不大于1)
PS_NULL:画笔不能画图。
PS_INSIDEFRAME:由椭圆、矩形、圆角矩形、饼图以及弦等生成的封闭对象框时,画线宽度向内扩展。
如指定的准确RGB颜色不存在,就进行抖动处理。
LOGPEN 结构体介绍:(结构体成员和上面的参数意思一样).
typedef struct tagLOGPEN {
UINT lopnStyle;
POINT lopnWidth; //Windows 仅使用该结构的 x 字段来设置宽度,y 字段会被忽略。
COLORREF lopnColor;
} LOGPEN, *PLOGPEN, *NPLOGPEN, *LPLOGPEN;
CreatePenIndirect() 介绍:
功能:根据指定的LOGPEN结构创建,逻辑画笔结构。
函数原型:HPEN CreatePenIndirect( CONST LOGPEN *logpen);
logpen: LOGPEN结构体变量。
例:LOGPEN logpen; hPen = CreatePenIndirect(&logpen);
返回值:如执行成功,返回指向新画笔的一个句柄;否则返回零。
DelectObject() 介绍:
功能:该函数删除一个逻辑笔、画笔、字体、位图、区域或者调色板。
释放所有与该对象有关的系统资源,在对象被删除之后,指定的句柄也就失效了。
函数原型:BOOL DeleteObject(HGDIOBJ hgdiObject);
hgdiObject:逻辑笔、画笔、字体、位图、区域或者调色板的句柄。
返回值:成功,返回非零值;如果指定的句柄无效或者它已被选入设备上下文环境,则返回值为零。
注释:当一个绘画对象(如笔或画笔)当前被选入一个设备上下文环境时不要删除该对象。
当一个调色板画笔被删除时,与该画笔相关的位图并不被删除,该图必须单独地删除。
GetObject() 介绍:
功能:函数得到指定图形对象的信息,根据图形对象,函数把
填满的结构或表项(用于逻辑调色板)数目放入一个指定的缓冲区。
函数原型:int GetObject(HANDLE handle, int cbBuffer, LPVOID lpvObject);
参数:
handle:指向感兴趣的图形对象的句柄,它可以是这样的一个句柄:
逻辑位图、刷子、字体、调色板、笔。
cbBuffer:指定将要写到缓冲区的信息的字节数目。
lpvObject:指向一个缓冲区的指针,该缓冲区将要检索指定图形对象的信息。
返回值:如果函数调用成功,且 lpvObject 为一个有效指针,则返回值为贮存到缓冲区的字节数目;
如果函数调用成功,且 lpvObject 为Null,则返回值为需要容纳的贮存到缓冲区的信息字节数目;
如果函数调用失败,则返回值为0。
GetCurrentObject() 介绍:
功能:该函数得到一个从特定类型中选定目标的设备对象句柄。
函数原型:HGDIOBJ GetCurrentObject(HDC hdc,UINT uType);
参数:
hdc:设备上下文环境句柄。
uType:指定要查询的对象类型,该参数可取如下一值:
OBJ_PEN:笔;OBJ_BRUSH:返回当前选择的画笔;OBJ_PAL:返回当前选择的调色板;
OBJ_FONT:返回当前选择的字体;OBJ_BMAP:返回当前选择的位图。
返回值:如果成功,返回指定对象的句柄;如果失败,则返回NULL。