CBrush 和 HBRUSH画笔的创建使用及常见的错误使用示例。
创建画笔
/// [in] COLORREF 画笔的颜色
/// return HBRUSH 如果函数成功,则返回值将标识逻辑画笔,如果函数失败,则返回值为 NULL。
HBRUSH CreateSolidBrush([in] COLORREF color);/// [in] int iHatch 画笔的阴影样式
/// [in] COLORREF color 用于阴影的画笔的前景色
/// return HBRUSH 如果函数成功,则返回值将标识逻辑画笔,如果函数失败,则返回值为 NULL。
HBRUSH CreateHatchBrush([in] int iHatch, [in] COLORREF color);typedef struct tagLOGBRUSH {UINT lbStyle; /// 画笔样式COLORREF lbColor; /// 要绘制画笔的颜色ULONG_PTR lbHatch; /// 阴影样式
} LOGBRUSH/// [in] const LOGBRUSH *plbrush 指向包含画笔相关信息的 LOGBRUSH 结构的指针
/// return HBRUSH 如果函数成功,则返回值将标识逻辑画笔,如果函数失败,则返回值为 NULL。
BOOL CreateBrushIndirect([in] const LOGBRUSH *plbrush);/// [in] HBITMAP hbm 要用于创建逻辑画笔的位图的句柄
/// return HBRUSH 如果函数成功,则返回值将标识逻辑画笔,如果函数失败,则返回值为 NULL。
HBRUSH CreatePatternBrush([in] HBITMAP hbm);/// [in] HGLOBAL h 包含打包 DIB 的全局内存对象的句柄,该对象由 BITMAPINFO 结构组成,后跟定义位图像素的字节数组
/// [in] UINT iUsage 指定是否初始化 BITMAPINFO 结构的 bmiColors 成员。
/// return HBRUSH 如果函数成功,则返回值将标识逻辑画笔,如果函数失败,则返回值为 NULL。
HBRUSH CreateDIBPatternBrush([in] HGLOBAL h, [in] UINT iUsage);
注意事项
1:如果不再需要 HBRUSH 对象,请调用 DeleteObject 函数将其删除。
2:可通过调用 SelectObject 函数将画笔选择到任何设备上下文中。
错误示例1
// 1.创建画刷
HBRUSH hBrush = CreateSolidBrush(COLOR_BTNFACE);// 2.选择画刷到上下文中。
HGDIOBJ hOldBrush = pDC->SelectObject(hBrush);// 3.绘制。
CRect rect(50, 50, 150, 150);
pDC->Rectangle(rect);// 4.重置回原来的画刷到上下文中。
pDC->SelectObject(hOldBrush);// ...
// 未正确释放画刷资源,还需调用 DeleteObject(hBrush)。
错误示例2
// 1.创建画刷HBRUSH hBrush = CreateSolidBrush(COLOR_BTNFACE);// 2.选择画刷到上下文中。HGDIOBJ hOldBrush = pDC->SelectObject(hBrush);// 3.绘制。CRect rect(50, 50, 150, 150);pDC->Rectangle(rect);// 4.删除画刷,画刷过早删除,导致删除失败,无法正确释放画刷资源,需在步骤5:“重置回原来的画刷到上下文中”后,掉用释放画刷。DeleteObject(hBrush);// 5.重置回原来的画刷到上下文中。pDC->SelectObject(hOldBrush);
错误示例3
// 1.创建画刷HBRUSH hBrush = CreateSolidBrush(COLOR_BTNFACE);// 2.将GDI对象附加到CGdiObject对象,使用CBrush管理GDI对象的生命周期,brush析构时,会自动释放画刷hBrush。CBrush brush;brush.Attach(hBrush);// 1,2步骤可使用下方函数合并为一步。//brush.CreateSolidBrush(COLOR_BTNFACE);// 3.选择画刷到上下文中。HGDIOBJ hOldBrush = pDC->SelectObject(hBrush);// 4.绘制。CRect rect(50, 50, 150, 150);pDC->Rectangle(rect);// 5.重置回原来的画刷到上下文中。pDC->SelectObject(hOldBrush);// 6.从CBrush对象中拆离GDI对象并返回GDI对象的句柄,返回的GDI对象的句柄需要自行管理释放。hBrush = (HBRUSH)brush.Detach();//... // 未正确释放画刷资源,还需调用 DeleteObject(hBrush)。
正确示例1
// 1.创建画刷
HBRUSH hBrush = CreateSolidBrush(COLOR_BTNFACE);// 2.选择画刷到上下文中。
HGDIOBJ hOldBrush = pDC->SelectObject(hBrush);// 3.绘制。
CRect rect(50, 50, 150, 150);
pDC->Rectangle(rect);// 4.重置回原来的画刷到上下文中。
pDC->SelectObject(hOldBrush);// 5.删除画刷
DeleteObject(hBrush);
正确示例2
{// 1.创建画刷HBRUSH hBrush = CreateSolidBrush(COLOR_BTNFACE);// 2.将GDI对象附加到CGdiObject对象,使用CBrush管理GDI对象的生命周期,brush析构时,会自动释放画刷hBrush。CBrush brush;brush.Attach(hBrush);// 1,2步骤可使用下方函数合并为一步。//brush.CreateSolidBrush(COLOR_BTNFACE);// 3.选择画刷到上下文中。HGDIOBJ hOldBrush = pDC->SelectObject(hBrush);// 4.绘制。CRect rect(50, 50, 150, 150);pDC->Rectangle(rect);// 5.重置回原来的画刷到上下文中。pDC->SelectObject(hOldBrush);} // brush析构,自动释放画刷hBrush。