位图画刷(是的,我没说错)
位图画刷通常是那些 8像素 * 8像素的单色图案,你可以在这些图案上进行重新创作,又或者使用一些你认为比较复杂的图案,例如犬牙花纹(houndstooth)。实际上,除了这些,还有一些其他的妙用值得尝试。
CreatePatternBrush这个API函数会接受一个旧的位图并基于这个位图创建一个画刷,即使这个位图的尺寸十分巨大,也同样如此。
这个位图将会自动平铺,因此,这是一个位图平铺的快速方法。这意味着:GDI将会为你做底层的数学计算。
当你正苦于尝试将一个HBITMAP句柄当做HBRUSH来传递的时候,上面所提到的就是一个绝佳的解决方法:根据位图创建画刷并返回画刷的句柄。
举个例子
在这个例子中,我们将从头开始编写一个示例程序,它能通过位图画刷实现一个自定义的位图平铺背景。
在程序的入口点WinMain函数中,我们使用如下的替代调用:
if (!InitApp(lpCmdLine)) return 0;
在这里,我们在命令行上传递了一个指向一个位图(BMP)文件的路径,在此之后,奇迹就出现了:窗口的背景会显示出平铺的位图。请注意了,在这个过程中,我们仅仅是修改了窗口类的注册部分的代码,其他的地方我们可一点儿也没动。
一切就是这样的丝般柔顺,不是吗?
还有另一个用法
下面的程序是在上面的基础程序上面修改而成,在这个程序中,我们可以通过使用位图画刷来简化相当一大部分的工作。
在WinMain入口点中,我们在CreateWindowEx函数调用之前添加下面的代码:
g_hbr = CreatePatternBrushFromFile(lpCmdLine);
if (!g_hbr) return 0;
这一次,因为我们自己负责管理(而不是窗口类)画刷,所以别忘在WinMain返回之前释放画刷资源:
DeleteObject(g_hbr);
这个程序将会绘制一个椭圆,并使用我们创建的位图来进行填充。FillPath函数将使用当前选入到设备上下文中的画刷,所以在FillPath之前,我们需要将我们的位图画刷选入到设备上下文中,然后才进行绘制。绘制的结果就是:你得到了一个使用位图填充的椭圆。
换句话说,如果你不使用这个技巧,你将会需要自己实现一大堆的细节,例如位图裁切,平铺等。那样的话,就只能祝你好运了。
总结
今天我们两种不同的场景下使用了位图画刷,你预想中的脏活累活,那是一点都没有接触到(Windows为你做了):
1) 使用指定的位图来绘制窗口的背景色并自动平铺。
2) 使用位图来填充GDI绘制的各种图形。
是时候GET这个技巧了,老伙计。
领取专属 10元无门槛券
私享最新 技术干货