首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于位图画刷的其他两种用法

位图画刷(是的,我没说错)

位图画刷通常是那些 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这个技巧了,老伙计。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200529A0Q4CL00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券