65.9K
CodeProject 正在变化。 阅读更多。
Home

CRegionCreator

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.10/5 (15投票s)

2005年12月21日

3分钟阅读

viewsIcon

49387

downloadIcon

2659

一篇关于从位图创建自定义区域并更改默认窗口皮肤的文章。

CRegionCreator Test Application Image

引言

本文介绍了如何从位图创建自定义区域,并使用该区域更改默认窗口皮肤。 已经编写了一个名为 CRegionCreator 的类来简化此问题。 此外,还展示了皮肤自定义窗口的示例。

注意

为了演示,此示例使用了免费媒体播放器 BSPlayer 在其安装文件夹中找到的默认皮肤位图。

背景

作为背景知识,读者可以查看 CodeProject 上关于此主题的不同文章。

使用代码

要使用代码,请将以下内容添加到您想要创建自定义区域的类中

//
#include "RegionCreator.h"
//

然后,创建包含类的实例,并使用它唯一的名为 CreateRegionFromBitmap() 的方法,该方法将返回新创建区域的句柄

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

传递给此方法的两个参数是一个从其他地方获得的位图句柄,以及位图中的透明颜色。 现在,您应该有一个有效的区域句柄,在使用完毕后应该销毁它。 在我的示例中,我使用 LoadImage() 函数加载所有类型的位图(4b、8b、16b、24b、32b),并将位图左上角像素的颜色设置为透明颜色,但您可以传入任何颜色。 具有此值的每个像素都不会是结果区域的一部分。 因此,以这种方式,可以形成一个非常好的区域,无论是连接的还是断开连接的。

更改默认窗口皮肤

要将这些区域应用于自定义窗口,必须调用 SetWindowRgn(),并传递窗口句柄、新获得的区域句柄以及一个标志,该标志指示是否需要重绘窗口作为参数。

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

就这样! 完成此步骤后,您的窗口将呈现您喜欢的形状。

小警告

您应该记住以下几点

  • 在通过调用 SetWindowRgn() 方法将区域句柄赋予窗口后,不要销毁该区域句柄。 这很重要,因为它可能导致异常。
  • 当将新区域应用于现有窗口时,如果该窗口已经具有某些特定的窗口样式,则情况有所不同。 在我的示例中,我仅使用 WS_CHILDWS_VISIBLE 窗口样式创建了一个新的子窗口。 尝试将区域应用于带有 2D 或 3D 边框的窗口时,会残留一些令人讨厌的残余,这肯定需要一些额外的处理,但尚未实现。 这与边框的大小有关。 此外,如果您的窗口具有标题栏和菜单栏,则情况也会有所不同。
  • 目前,您将只能处理具有自定义颜色深度的位图文件,这应该足以入门。
  • 注意您的窗口的大小(边界矩形)与位图的大小(边界矩形)相比。 在此示例中,我使皮肤窗口的大小与位图的大小相同,以便在将其绘制到窗口设备上下文时不会执行任何缩放。

关注点

在研究这个主题时,我发现拥有不同皮肤的窗口非常有趣。 可以通过这种方式实现整个框架,因此这是一个挑战。

© . All rights reserved.