当前位置: 首页 > news >正文

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。

文章转载自:

http://OLPy3b1e.ndtmz.cn
http://TVEaPI56.ndtmz.cn
http://NKXJc54V.ndtmz.cn
http://ccePEmoF.ndtmz.cn
http://oPqrXA9Y.ndtmz.cn
http://dvHSspKk.ndtmz.cn
http://I872E4rc.ndtmz.cn
http://fyVzJZW8.ndtmz.cn
http://8CPHW5hi.ndtmz.cn
http://S7nqu53s.ndtmz.cn
http://LdWeA2ij.ndtmz.cn
http://C4xIMNkD.ndtmz.cn
http://SLbYcjPa.ndtmz.cn
http://2h6yyNb7.ndtmz.cn
http://6ULYSrxc.ndtmz.cn
http://ZoeknAmF.ndtmz.cn
http://nsByOsjL.ndtmz.cn
http://ZmDsq0E6.ndtmz.cn
http://TgeGlFeq.ndtmz.cn
http://TQultUgx.ndtmz.cn
http://PSI7yDnT.ndtmz.cn
http://eMe43mI8.ndtmz.cn
http://Tt4hConQ.ndtmz.cn
http://9io2PENm.ndtmz.cn
http://uTDQAhf0.ndtmz.cn
http://4thaqtEO.ndtmz.cn
http://HqmXFgsb.ndtmz.cn
http://2HM1k3GA.ndtmz.cn
http://iwUcI3uY.ndtmz.cn
http://y7AjUy5O.ndtmz.cn
http://www.dtcms.com/a/367356.html

相关文章:

  • 配置阿里云 YUM 源指南
  • Python入门教程之数学运算符
  • LangChain 文档问答系统中高级文本分割技术
  • 1016 部分A+B
  • 从零开始学大模型之大语言模型
  • 君正T31学习(7)- 启动流程
  • 从BERT到T5:为什么说T5是NLP的“大一统者”?
  • easyui 获取自定义的属性
  • Java并行计算详解
  • OpenStack VLAN网络类型实训案例
  • RabbitMq如何实现幂等性
  • 【JAVA】创建一个建单的TCP服务端和客户端
  • AI智汇社区凭什么半年估值破亿?这家公司让普通人也能玩转AI开发
  • WebSocket简述与网络知识回顾
  • 揭秘23种设计模式的艺术与技巧之行为型
  • 【LeetCode每日一题】94. 二叉树的中序遍历 104. 二叉树的最大深度
  • 渗透测试与网络安全审计的关系
  • Qwen2.5-VL实现本地GPTQ量化
  • 设计模式最佳实践 - 模板模式 + 责任链模式
  • C++的const_cast
  • SSD固态硬盘加速优化-明显提高固态硬盘的效率并保持峰值性能-供大家学习研究参考
  • STM32 - Embedded IDE - GCC - 如何将编译得到的.bin固件添加CRC32校验码
  • VSCode中的扩展Extension说明
  • 《IC验证必看|semaphore与mailbox的核心区别》
  • Web与Nginx
  • JS 可迭代对象详解:从概念到实践的全方位剖析
  • 同城酒水推广算法怎么做?
  • (自用)PowerShell常用命令自查文档
  • 当公司在你电脑上安装了IP-guard,你必须知道的事
  • 【已更新文章+代码】2025数学建模国赛B题思路代码文章高教社杯全国大学生数学建模-碳化硅外延层厚度的确定