CreatePatternBrush
CreatePatternBrush是Windows图形设备接口(GDI)中的一个应用程序接口函数,属于笔刷(Brush)函数族。它接收一个位图句柄,返回可被选入设备上下文的逻辑笔刷句柄,系统用该位图平铺填充图形内部。 它是GDI中创建自定义图案笔刷的主要途径之一,配套函数包括CreateDIBPatternBrushPt、SelectObject、DeleteObject以及用于调整图案对齐的SetBrushOrgEx。
定义
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]
参见
-
图形设备接口 —— CreatePatternBrush所属的Windows二维图形子系统。
-
设备上下文 —— 笔刷必须选入其中才能参与绘制。
-
CreateDIBPatternBrushPt —— 用设备无关位图构造图案笔刷的另一函数。
-
CreateHatchBrush —— 创建预定义阴影线图案的笔刷。
-
SetBrushOrgEx —— 调整笔刷原点,用于对齐相邻区域的图案。
-
SelectObject —— 把笔刷等绘图对象选入设备上下文的函数。
参考资料
- UID: NF:wingdi [引用日期2026-10-29]
- aa922171(v=msdn [引用日期2026-10-29]
- title: Realizing Brushes [引用日期2026-10-29]
- overview-of-the-windows-graphics-architecture [引用日期2026-10-29]
- Graphics Device Interface [引用日期2026-10-29]
- C++中createpatternbrush的用法是什么 [引用日期2026-10-29]
- description: "Learn more about: CBrush Class" [引用日期2026-10-29]
- CreatePatternBrush(3w) — libwine-dev — Debian wheezy [引用日期2026-10-29]