您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:190 来源:vckbase.com

本文章共5267字,分4页,当前第1页,快速翻页:
 

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 - 下一页>>
相关文章

关于CEdit控件的透明 --作者:monsoon
think window procedure
DCT快速变换
如何提取网页中所有链接
用C#语言实现http协议下的多线程文件传输
如何选中其他程序ListView控件中的某个Item
在VC中调用 WebService (非托管)
自动查找并删除VC生成的临时文件
一步步制作真彩工具条
如何定制浮动工具条
关于调试时输出的字符串信息
SendMessage和PostMessage,total ordering
用udp协议通讯示例
用VC 制作QQ自动登陆软件
MFC程序员的WTL指南: Part II - WTL 界面基
COM 组件设计与应用(十)——IDispatch 接
一个简单的读写注册表实例
利用辅助线程更新用户界面UI
如何更改其它程序 ListView 控件中某个 Ite
如何在NT下获取进程的路径

相关评论


本文章所属分类:首页 VC++

  热门关键字: