CRegionCreator

介绍 本文介绍如何从位图创建自定义区域,并使用该区域更改默认窗口外观。为了简化这个问题,我们编写了一个名为CRegionCreator的类。此外,还显示了一个如何给自定义窗口剥皮的示例。 请注意 为了演示,这个示例使用了在其安装文件夹中找到的自由媒体播放器BSPlayer的默认皮肤位图。 背景 作为背景知识,读者可以阅读关于这个主题的不同的CodeProject文章。 使用的代码 要使用该代码,请将以下代码添加到您希望在其中创建自定义区域的类中:复制Code

//
#include "RegionCreator.h"
//

然后,创建包含的类的一个实例,并使用它唯一的方法CreateRegionFromBitmap(),该方法将返回新创建的区域的句柄:Hide  复制Code

//
CRegionCreator regionCreator;
//
HRGN hRgn = regionCreator.CreateRegionFromBitmap(hBitmap, 
                                       transparentColor);
//

传递给这个方法的两个参数是在其他地方获得的位图句柄和位图中的透明颜色。现在,您应该有一个有效的区域句柄,您应该在使用它完成工作后销毁它。在我的示例中,我使用了一个LoadImage()函数来加载所有类型的位图(4b、8b、16b、24b、32b),并将位图中左上角像素的颜色设置为透明颜色,但是可以传递任何颜色。具有该值的每个像素都不会成为结果区域的一部分。这样,就可以形成一个很好的区域,连通的或不连通的。 更改默认窗口外观 要将这些区域应用到自定义窗口,需要调用SetWindowRgn()并将窗口句柄、新获得的区域句柄和指示是否需要重新绘制窗口的标志作为参数传递。隐藏,复制Code

//
SetWindowRgn(hWnd, hRgn, TRUE);
//

这是所有!在这一步之后,你将有你的窗口在你喜欢的形状。 小的警告 你应该记住以下几点: 不要通过调用SetWindowRgn()方法将区域句柄交给窗口后销毁它。这一点很重要,因为它可能导致异常。 当将新区域应用到现有窗口时,如果该窗口已经具有一些特定的窗口样式,则不相同。在我的示例中,我创建了一个只有WS_CHILD和WS_VISIBLE窗口样式的新子窗口。当尝试在带有2D或3D边界的窗口上应用一个区域时,会留下一些令人讨厌的残留物,这无疑会要求一些尚未实现的额外处理。这和边界的大小有关。此外,如果窗口有标题栏和菜单栏,情况就不一样了。 目前,您将只能处理具有自定义颜色深度的位图文件,这对于开始应该足够了。 将窗口的大小(边界矩形)与位图的大小(边界矩形)进行比较。在这个例子中,我为蒙皮的窗口取了与位图相同的大小,以便在将其绘制到窗口关联设备时不执行任何缩放。 的兴趣点 在研究这个主题的时候,我发现有一个不同外表的窗户是非常有趣的。整个框架可以通过这种方式实现,因此这是一个挑战。 本文转载于:http://www.diyabc.com/frontweb/news12314.html

原文地址:https://www.cnblogs.com/Dincat/p/13473936.html