|
C At Work 专栏...
创建分层窗口,实现图像渐变
原著:Paul DiLascia
翻译:NorthTibet 逆风编程精品
下载源代码:CAtWork0512.exe (493KB)
原文出处:Layered
Windows, Blending Images
有没有方法创建一个半透明的窗口,并将该窗口上发生的所有鼠标事件都传递到桌面或另一个应用窗口处理?
Scott Stringham
当然可以,并且相当容易。你只要创建一个“分层窗口”即可。我写了一个小程序叫
lwtest 来示范如何做。你可以下载源代码。为了创建分层窗口,你需要扩展式样 WS_EX_LAYERED,此外,为了能在透明窗口上进行鼠标点击,你还需要
WS_EX_TRANSPARENT 扩展式样。在窗口创建之后,你可以同时设置两个式样,MFC 代码如下:int CMainFrame::OnCreate(...)
{
...
ModifyStyleEx(0, WS_EX_LAYERED|WS_EX_TRANSPARENT);
}
ModifyStyle 和 ModifyStyleEx 是专用的 MFC CWnd 方法,其作用顾名思义。如果你用 C
语言编写,那么得调用 GetWindowLong(GWL_EXSTYLE) 来获取扩展式样,然后必须调用
SetWindowLong(GWL_EXSTYLE)来设置式样。其效果与 ModifyStyle(Ex)一样。当然,你也可以在创建窗口的时候使用此式样。
一旦创建了分层窗0口,你便可以调用 SetLayeredWindowAttributes 来设置透明度。可用的分层窗口属性之一是
LWA_ALPHA,它就是用来调整透明度的,取值范围从 0(完全透明)到 255(不透明)。要得到半透明的效果,可以这样调用
SetLayeredWindowAttributes:
// in CMainFrame::OnCreate
SetLayeredWindowAttributes(0, 255 * 0.50, LWA_ALPHA);
这里我用乘法来表示一般公式;你可以仅用 128,因为那是 255 的一半(四舍五入)。你还可以用专门的颜色作为透明色。此时,你得用
LWA_COLORKEY 作为属性,在第一个参数中指定 COLORREF。Windows 会让所有像素颜色都呈透明。注意前面的代码段假设你是从
CWnd 派生对象中调用。如果用 C 语言,你得使用 ::SetLayeredWindowAttributes,它带有一个额外的参数 HWND。
你可以用分层窗口来进行动画和其它转换效果的处理;详细细节请参考文档中的“分层窗口”部分。
我正在写一个幻灯显示程序,该程序要显示JPEG图像序列。我使用了 2002年三月刊专栏文章中的 CPicture 类来绘制图像(参见:C
Q&A: Do You Have a License for that GIF? PreSubclassWindow, EOF in MFC,
and
More)。那个程序运行得很好。但我现在想添加从某一张图像到下一张图像的渐变特性。我在网页中用转换效果可以做到。那么是否有办法从程序代码中实现图像渐变特性?
Bob Kline
借助 COM 确实可以在 IE
中实现转换效果。这些效果包括——渐变、擦除,框入、框出、棒状等等——在DirectX
中都支持。具体细节已经超出了本文的讨论范围,所以我只能让你去看相关文档,其内容参见“Internet Development
SDK”中的“Using Transforms in C ”。你需要熟悉 COM 以及一些基本的 DirectX
知识,如:表层(surfaces)和转换(transforms)(DXSurface 和 DXTransform)。
如果你仅仅是想实现图像到图像的渐变,我可以给你示范如何用 GDI 函数 AlphaBlend 来实现,微软的老大们在 MFC
中已经对之进行了足够友好的包装,CDC::AlphaBlend。AlphaBlend 中的 alpha
是一个图形学术语。它表示位图使用3个字节来说明一个像素:每个字节分别表示 红、绿、蓝的值。由于 32位的 DWORD
有4个字节,多余的这个字节常被用作“alpha channel”,用于指定像素的透明度。这个 alpha 值按照如下的公式来合并像素:[R,G,B]blended = ?[R,G,B]image (1-?? [R,G,B]background 本文章更多内容:1 - 2 - 3 - 4 - 下一页>> |