CreatePatternBrush

义项:Windows GDI 函数
CreatePatternBrush

CreatePatternBrush是Windows图形设备接口(GDI)中的一个应用程序接口函数,属于笔刷(Brush)函数族。它接收一个位图句柄,返回可被选入设备上下文的逻辑笔刷句柄,系统用该位图平铺填充图形内部。 它是GDI中创建自定义图案笔刷的主要途径之一,配套函数包括CreateDIBPatternBrushPt、SelectObject、DeleteObject以及用于调整图案对齐的SetBrushOrgEx。

目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

CreatePatternBrush是微软Windows平台上的一个C语言接口函数,声明于头文件wingdi.h,其原型为“HBRUSH CreatePatternBrush(HBITMAP hbm)”,参数是用于生成笔刷的位图句柄,导入库为Gdi32.lib,运行库为Gdi32.dll。 函数成功时返回一个标识逻辑笔刷的句柄,失败时返回NULL。[1]

它的作用是把一份位图封装成GDI的绘图对象。图案笔刷在概念上就是系统用来涂填充形状内部区域的位图,与实体笔刷、库存笔刷、阴影线笔刷并列为四种逻辑笔刷类型。

原理

GDI绘图对象并不直接作用于硬件,应用程序先取得设备上下文句柄,再通过SelectObject把笔刷选入该上下文,此后调用FillRect、Rectangle、PatBlt等填充函数时,系统便以这块位图为图案重复平铺,铺满被填充的区域。 笔刷图案的平铺需要一个对齐基准,即笔刷原点;它指定位图中的某个像素与设备表面坐标的对应关系,默认取位图左上角(0,0),可通过SetBrushOrgEx改变偏移量,从而实现图案的相对错位。[2]

位图的色彩处理因位深而异。若传入的是每像素1位的单色位图,生成的笔刷并不携带固定颜色,而是取所用设备上下文当前的文字色与背景色:值为0的像素用当前文字色绘制,值为1的像素用当前背景色绘制。因此在同一程序里换掉文字色或背景色,同一支笔刷画出的图案颜色也随之变化。

笔刷创建本身不涉及颜色管理,只有当该笔刷被选入启用了ICM(图像颜色管理)的设备上下文时,系统才执行相应的颜色转换。 在驱动层,GDI会把逻辑笔刷交给显示驱动实现为设备可用的形式,并把实现结果缓存起来以减少重复计算。[3]

发展历程

CreatePatternBrush随Windows的GDI一同出现。GDI是Windows最初的图形接口,先为16位Windows编写,后来适配32位与64位Windows,是Windows用户界面绘制的基础。[4] 早期的Windows 95对图案笔刷的位图尺寸有限制,不支持从大于8×8像素的位图或DIB创建笔刷,超出部分只取用局部;Windows NT系列则允许更大的位图。

Windows XP引入GDI+作为补充,在保持GDI可用的同时增加了抗锯齿、渐变与透明等特性;Windows Vista起,系统改用新的显示驱动模型,图形硬件由Direct3D统一驱动,GDI在内部被重映射到新的路径上,但原有接口继续保留以维持应用程序兼容。[5] 微软现行的开发文档将最低支持客户端标为Windows 2000 Professional、最低支持服务器标为Windows 2000 Server,且仅限桌面应用。

应用

典型用法是先取得一份位图,再调用CreatePatternBrush得到笔刷句柄,随后用SelectObject将其选入设备上下文,调用填充函数绘制矩形、椭圆或路径内部,最后以DeleteObject释放笔刷。[6] 边框、窗口背景、报表与打印输出中的底纹都可以用这种方式绘制。

在微软基础类库(MFC)中,对应的封装是CBrush类的CreatePatternBrush成员函数,参数为指向CBitmap对象的指针,其内部同样调用这一Win32函数。MFC文档指出,用作填充图案的位图宜为8×8像素,更大的位图只取左上角前8行8列参与填充。[7] 部分第三方图形库也提供同名或同功能的接口,例如Wine在其GDI32实现中提供该函数,并在内部借助CreateBrushIndirect完成构造。[8]

局限

图案笔刷表达的是重复填涂,不能承担图像合成。GDI本身对Alpha混合的支持很有限,多数GDI函数不支持透明混合,几何图形绘制也不做抗锯齿,因此用图案笔刷绘制的边缘会呈现锯齿状,难以实现半透明底纹或平滑过渡。[4]

尺寸与位图类型构成另一重限制。用作图案的位图通常按8×8像素设计,超出部分可能被截断,导致图案失真;不同Windows版本对更大位图的支持程度并不一致。[7] 此外,绘图对象属于稀缺的系统资源,创建后必须成对释放,否则会造成资源泄漏。[3]

从定位上看,GDI属于传统接口,微软在文档中说明GDI与GDI+仍受支持,但新程序推荐使用Direct2D与DirectWrite,后者基于Direct3D,可充分利用GPU加速。[4]

参见

参考资料

  1. UID: NF:wingdi [引用日期2026-10-29]
  2. aa922171(v=msdn [引用日期2026-10-29]
  3. title: Realizing Brushes [引用日期2026-10-29]
  4. overview-of-the-windows-graphics-architecture [引用日期2026-10-29]
  5. Graphics Device Interface [引用日期2026-10-29]
  6. C++中createpatternbrush的用法是什么 [引用日期2026-10-29]
  7. description: "Learn more about: CBrush Class" [引用日期2026-10-29]
  8. CreatePatternBrush(3w) — libwine-dev — Debian wheezy [引用日期2026-10-29]
词条评价
词条统计

浏览次数:0 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-28T18:23:02Z

历史版本

本条目引用的词条
图形设备接口 设备上下文 CreateDIBPatternBrushPt CreateHatchBrush SetBrushOrgEx SelectObject