windows编程之画笔
GetStockObject
GetStockObject 函数用于获得 Windows 预设的画笔、画刷、字体或者调色板的句柄。
- API 函数原型:
HGDIOBJ GetStockObject(
_In_ int fnObject
);
参数解析:
参数 | 含义 |
---|---|
fnObject | 指定待获取对象的类型,具体参考下边。 |
fnObject 可取如下值之一:
值 | 含义 |
---|---|
BLACK_BRUSH | 黑色画刷 |
DKGRAY_BRUSH | 暗灰色画刷 |
DC_BRUSH | 1. 纯色画刷,默认颜色是白色的 2. 调用 SetDCBrushColor 函数可以修改该值的颜色 |
GRAY_BRUSH | 灰色画刷 |
HOLLOW_BRUSH | 空画刷(相当于 NULL_BRUSH) |
LTGRAY_BRUSH | 浅灰色画刷 |
NULL_BRUSH | 空画刷(相当于 HOLLOW_BRUSH) |
WHITE_BRUSH | 白色画刷 |
BLACK_PEN | 黑色画笔 |
DC_PEN | 1. 纯色画笔,默认颜色是白色的 2. 调用 SetDCPenColor 函数可以修改该值的颜色 |
NULL_PEN | 空画笔(空画笔不绘制任何东西) |
WHITE_PEN | 白色画笔 |
ANSI_FIXED_FONT | Windows 中的固定间距(等宽)系统字体 |
ANSI_VAR_FONT | Windows 中的可变间距(比例间距)系统字体 |
DEVICE_DEFAULT_FONT | 设备相关字体 |
DEFAULT_GUI_FONT | 1. 用户界面对象(如菜单、对话框)的默认字体 2. 不推荐使用 DEFAULT_GUI_FONT 或 SYSTEM_FONT 获得对话框或系统的字体 3. 该字体默认是 Tahoma |
OEM_FIXED_FONT | 原始设备制造商(OEM)相关固定间距(等宽)字体 |
SYSTEM_FONT | 1. 系统字体 2. 默认情况下,Windows 使用系统字体绘制菜单,对话框和文本 3. 不推荐使用 DEFAULT_GUI_FONT 或 SYSTEM_FONT 获得对话框或系统的字体 4. 该字体默认是 Tahoma |
SYSTEM_FIXED_FONT | 1. 固定间距(等宽)系统字体 2. 该对象仅为兼容 16 位 Windows 版本提供 |
DEFAULT_PALETTE | 默认调色板(该调色板由系统调色板中的静态色彩组成) |
返回值:
-
如果函数调用成功,返回值是所申请的逻辑对象的句柄;
-
如果函数调用失败,返回值是 NULL。
备注:
-
不建议您使用该函数获得对话框和窗口的当前字体。应该使用
SystemParametersInfo
函数(SPI_GETNONCLIENTMETRICS 参数)来获得当前字体,因为 SystemParametersInfo 函数将考虑到当前主题,并提供了标题栏,菜单和消息对话框的字体信息。 -
仅在窗口风格为
CS_HREDRAW
和CS_VREDRAW
中,才能使用 DKGRAY_BRUSH、GRAY_BRUSH 和 LTGRAY_BRUSH 对象。如果在其他风格的窗口中使灰色画刷,可能导致在窗口移动或改变大小之后出现画刷模式错位现象,原始画刷不能被调整。 -
HOLLOW_BRUSH 和 NULL_BRUSH 对象是一样的。
-
不必要通过调用[DeleteObject 函数来删除 Windows 预设的对象。
-
DC_BRUSH 和 DC_PEN 都能与其他对象如 BLACK_BRUSH 和 BLACK_PEN 相互交换。具体请参考 GetDCBrushColor 函数、SetDCBrushColor 函数、GetDCPenColor 函数和 SetDCPenColor 函数。
SelectObject
SelectObject 函数用于选择一对象到指定的设备环境中,该新对象将替换先前的相同类型的对象。
- API 函数原型:
HGDIOBJ SelectObject(
_In_ HDC hdc,
_In_ HGDIOBJ hgdiobj
);
参数解析:
参数 | 含义 |
---|---|
hdc | 指定设备环境句柄 |
hgdiobj | 1. 被选择的对象的句柄 2. 该指定对象必须由以下的函数创建 |
hgdiobj 参数的对象必需由以下的函数创建:
对象 | 函数 |
---|---|
位图 | CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDIBitmap, CreateDIBSection (只有内存设备环境可选择位图,并且在同一时刻只能一个设备环境选择位图) |
画刷 | CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush |
字体 | CreateFont, CreateFontIndirect |
画笔 | CreatePen, CreatePenIndirect |
区域 | CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect |
返回值:
-
如果选择对象不是区域并且函数调用成功,那么返回值是被取代的对象的句柄;
-
如果选择对象是区域并且函数执行成功,返回以下值之一:
值 | 含义 |
---|---|
SIMPLEREGION | 区域由单个矩形组成 |
COMPLEXREGION | 区域由多个矩形组成 |
NULLREGION | 区域为空 |
- 如果发生错误并且选择对象不是一个区域,那么返回值为 NULL,否则返回 HGDI_ERROR。
备注:
-
该函数返回先前指定类型的选择对象。
-
一个应用程序在它使用新对象进行绘制完成之后,应该用原始的默认对象替换新对象。
-
应用程序不能同时选择一个位图到多个设备环境中。
-
ICM:如果被选择的对象是画笔或笔,那么就执行颜色管理。
CreatePen
CreatePen 函数用指定的样式、宽度和颜色创建一个逻辑画笔。
创建的画笔随后可以被选择到设备环境中,并用于绘制直线和曲线。
- API 函数原型:
HPEN CreatePen(
_In_ int fnPenStyle,
_In_ int nWidth,
_In_ COLORREF crColor
);
参数解析:
参数 | 含义 |
---|---|
fnPenStyle | 指定画笔样式,详细内容请看下边 |
nWidth | 1. 指定画笔的宽度 2. 如果该值为 0,则画笔为一个像素宽度,不管当前的映射模式 |
crColor | 1. 指定画笔的 RGB 颜色 2. RGB 颜色使用 RGB 宏 生成 COLORREF 结构 |
fnPenStyle 参数指定画笔样式为如下值之一:
值 | 含义 |
---|---|
PS_SOLID | 实线 |
PS_DASH | 虚线(nWidth 参数的值必须 <= 1) |
PS_DOT | 点线(nWidth 参数的值必须 <= 1) |
PS_DASHDOT | 点划线(nWidth 参数的值必须 <= 1) |
PS_DASHDOTDOT | 点点划线(nWidth 参数的值必须 <= 1) |
PS_NULL | 该画笔看不见 |
PS_INSIDEFRAME | 该画笔用于在 GDI 函数绘图中实现,绘制椭圆、矩形、圆角矩形、饼图以及弦等生成的封闭对象框时,画笔宽度向内扩展。 |
返回值:
-
如果函数调用成功,返回值是新画笔的句柄;
-
如果函数调用失败,返回值是 NULL。
备注:
-
调用该函数创建新画笔之后,可以使用
SelectObject
函数将新画笔选入设备环境中。只有当画笔被选入设备环境,才能使用该画笔绘制线段或曲线。 -
如果 nWidth 参数的值是 0,则画笔为一个像素宽度,不管当前的映射模式。
-
如果 nWidth 参数的值大于 1,则 fnPenStyle 参数的值必须为 PS_NULL, PS_SOLID 或 PS_INSIDEFRAME 的其中一个。
-
如果 nWidth 参数的值大于 1,且 fnPenStyle 参数的值为 PS_INSIDEFRAME,所有与该画笔相关联(除了折线和多边形)的封闭图形绘制,画笔宽度向内扩展。
-
如果 nWidth 参数的值大于 1,且 fnPenStyle 参数的值为 PS_INSIDEFRAME,如果指定的 RGB 颜色不存在,就进行抖动处理。
-
如果你再也不需要该画笔,可以使用
DeleteObject
函数将其删除。
CreatePenIndirect
CreatePenIndirect 函数根据指定的 LOGPEN 结构创建一个画笔。
- API 函数原型:
HPEN CreatePenIndirect(
_In_ const LOGPEN *lplgpn
);
参数解析:
参数 | 含义 |
---|---|
lplgpn | 【1】指向 LOGPEN 结构 的指针 【2】 LOGPEN 结构 指定了画笔的样式、宽度和颜色 |
返回值:
-
如果函数调用成功,返回值是新画笔的句柄;
-
如果函数调用失败,返回值是 NULL。
备注:
-
调用该函数创建新画笔之后,可以使用
SelectObject
函数将新画笔选入设备环境中。只有当画笔被选入设备环境,才能使用该画笔绘制线段或曲线。 -
如果你再也不需要该画笔,可以使用
DeleteObject
函数将其删除。
LOGPEN 结构
LOGPEN 结构定义了画笔、图形对象用于绘制线条和边框的宽度、样式和颜色。
CreatePenIndirect 函数需要使用到 LOGPEN 结构。
typedef struct tagLOGPEN {
UINT lopnStyle;
POINT lopnWidth;
COLORREF lopnColor;
} LOGPEN, *PLOGPEN;
成员解析:
成员 | 含义 |
---|---|
lopnStyle | 指定画笔样式,详细内容请看下边 |
lopnWidth | 1. 指定画笔的宽度 2. POINT 结构,Windows 只使用该结构的 x 成员表示画笔宽度,y 成员不使用 3. 如果该值为 0,则画笔为一个像素宽度,不管当前的映射模式 |
lopnColor | 1. 指定画笔的 RGB 颜色 2. RGB 颜色使用 RGB 宏 生成 COLORREF 结构 |
lopnStyle 成员指定画笔样式为如下值之一:
值 | 含义 |
---|---|
PS_SOLID | 实线 |
PS_DASH | 虚线(nWidth 参数的值必须 <= 1) |
PS_DOT | 点线(nWidth 参数的值必须 <= 1) |
PS_DASHDOT | 点划线(nWidth 参数的值必须 <= 1) |
PS_DASHDOTDOT | 点点划线(nWidth 参数的值必须 <= 1) |
PS_NULL | 该画笔看不见 |
PS_INSIDEFRAME | 该画笔用于在 GDI 函数绘图中实现,绘制椭圆、矩形、圆角矩形、饼图以及弦等生成的封闭对象框时,画笔宽度向内扩展。 |
备注:
-
如果 lopnWidth 成员的值大于 1,且 lopnStyle 成员的值为 PS_INSIDEFRAME,所有与该画笔相关联(除了折线和多边形)的封闭图形绘制,画笔宽度向内扩展。
-
如果指定的 RGB 颜色不存在,就进行抖动处理。
-
如果 lopnWidth 成员的值小于等于 1,则 PS_INSIDEFRAME 样式与 PS_SOLID 相同。
GetObject
GetObject 函数用于获得指定图形对象的信息。
- API 函数原型:
int GetObject(
_In_ HGDIOBJ hgdiobj,
_In_ int cbBuffer,
_Out_ LPVOID lpvObject
);
参数解析:
参数 | 含义 |
---|---|
hgdiobj | 【1】 指定目标图形对象的句柄 【2】 它可以是这样的一个句柄:逻辑位图、画刷、字体、调色板、画笔或通过调用 CreateDIBsection 函数创建的与设备无关位图 |
cbBuffer | 指定将要写到缓冲区的信息的字节数 |
lpvObject | 指向一个缓冲区的指针(该缓冲区将用于存放指定图形对象的信息) |
下边列出的是缓冲区获得的每种图形对象的信息类型(通过 hgdiobj 参数指定)
对象类型 | 写入到缓冲区的数据 |
---|---|
HBITMAP | BITMAP 结构 |
HBITMAP(通过调用 CreateDIBSection 函数获得) | 【1】DIBSECTION 结构(如果 cbBuffer 参数的值被设置为 sizeof (DIBSECTION))【2】BITMAP 结构(如果 cbBuffer 参数的值被设置为 sizeof (BITMAP)) |
HPALETTE | 逻辑调色板的颜色数(WORD 类型) |
HPEN(通过调用 ExtCreatePen 函数获得) | EXTLOGPEN 结构 |
HPEN | LOGPEN 结构 |
HBRUSH | LOGBRUSH 结构 |
HFONT | LOGFONT 结构 |
*注释:*lpvObject 参数指向的地址必须是 4 字节的倍数,否则 GetObject 函数调用失败。
返回值:
-
如果函数调用成功,且 lpvObject 参数是一个有效的指针,则返回值是存储到缓冲区的字节数;
-
如果函数调用成功,而 lpvObject 参数是 NULL,则返回值是需要存储到缓冲区的信息的字节数;
-
如果函数调用失败,返回值是 0。
备注:
-
lpvObject 参数指向的缓冲区一定要足够大以接收图形对象的信息。
-
如果 hgdiobj 参数指定一个由调用 CreateDIBSection 函数创建的位图,且指定的缓冲区足够大,则 GetObject 函数返回一个 DIBSECTION 结构。
-
如果 hgdiobj 参数指定一个通过其他途径创建的位图,则 GetObject 只返回位图的宽、高和颜色格式信息,通过调用 GetDIBits 或 GetBitmapBits 函数可以得到位置的位值。
-
如果 hgdiobj 参数指定一个逻辑调色板,则 GetObject 获得一个 2 字节的整数,该整数指定调色板中的项数,函数不会获得定义调色板的 LOGPALETTE 结构,为了获得有关调色板项的信息,应用程序可以调用
GetPaletteEntries
函数。
DeleteObject
DeleteObject 函数用于删除一个逻辑画笔、画刷、字体、位图、区域或者调色板,释放所有与该对象有关的系统资源。
注意,在对象被删除之后,指定的句柄也就失效了。
- API 函数原型:
BOOL DeleteObject(
_In_ HGDIOBJ hObject
);
参数解析:
参数 | 含义 |
---|---|
hObject | 指定待删除的逻辑画笔、画刷、字体、位图、区域或者调色板的句柄 |
返回值:
-
如果函数调用成功,返回值是非 0;
-
如果指定的句柄无效或者它已被选入设备环境,则返回值是 0。
备注:
-
当一个绘画对象(如画笔或画刷)当前被选入一个设备环境中时,不要删除该对象。
-
当一个画刷被删除时,与该画刷相关的位图并不被删除,该图必须单独地删除。
GetCurrentObject
GetCurrentObject 函数用于获得被选入指定环境设备中的指定对象类型的句柄。
- API 函数原型:
HGDIOBJ GetCurrentObject(
_In_ HDC hdc,
_In_ UINT uObjectType
);
参数解析:
参数 | 含义 |
---|---|
hdc | 指定设备环境句柄 |
uObjectType | 指定要获取的对象类型 |
uObjectType 参数可以是下边任意一值:
值 | 含义 |
---|---|
OBJ_BITMAP | 返回指定设备环境选入的位图 |
OBJ_BRUSH | 返回指定设备环境选入的画刷 |
OBJ_COLORSPACE | 返回指定设备环境选入的色彩空间 |
OBJ_FONT | 返回指定设备环境选入的字体 |
OBJ_PAL | 返回指定设备环境选入的调色板 |
OBJ_PEN | 返回指定设备环境选入的画笔 |
返回值:
-
如果函数调用成功,返回值是指定对象的句柄;
-
如果函数调用失败,返回值是 NULL。
备注:
应用程序可以使用 GetCurrentObject
函数和 GetObject
函数来获得对当前选入给定设备环境的图形对象的描述。
enjoy it ~