スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

关于vista的aero效果

我不要这种充满了IT文的宅用blog啊~~(碎碎念)

总之这是今晚EP的结果。

vista的aero效果是使用所谓的桌面窗口管理器,也就是Desktop Window Manager(DWM)实现的,放狗以这个关键词一搜头条就是MSDN所以不用费神给连接了。

在默认情形下,DWM用aero的半透明效果渲染程序窗口的非客户区(non-client,嘛反正windows下面搞过点界面的都能明白吧),然后它也提供了两个API:DwmExtendFrameIntoClientArea和EnableBlurBehind来允许把半透明效果应用到客户区域。就这么简单。

真的么…………抱歉,这是孔明的陷阱。

如果你只是简单地把API应用到原有的程序上面的话,结果只有“惨不忍睹”四字……

以下是我个人的理解了:

按照MSDN的说法,DWM实际上是把一个alpha通道叠加到了原有的窗口上面——糟糕的是我对alpha通道完全不了解所以不知道叠加起来是个什么概念!不过简言之,如果窗口某个位置的像素是纯的话,最后的效果就是和非客户区一样的半透明。所以如果你直接应用这个API到原有程序,你会发现色的文字全部变透明了,其它部分则像被打了个高光似的。

然后很显然,这个渲染是在窗口完全绘画好之后才进行的,也就是说是在“窗口原有的样子”上再叠加一层,所以不要考虑窗口背景擦除前景绘画之类的问题。

最后,DWM的API只对顶层窗口有效,而作用范围则是应用这个API时传入的窗口句柄,它并不理会你这个窗口下面的子窗口啥的,也就是说不管三七二十一指定范围内的像素通杀。


根据以上的背景知识,要对一个程序实现aero的毛玻璃效果并不那么简单。

首先,要小心地定义aero效果的范围,把不想应用的地方定义出一个RGN来挖掉,记住DWM是不会躲开的子窗口的……呃如果定义起来实在太困难的话,也许还不如把那部分的子窗口做成另外的顶层窗口……

对需要应用aero效果的地方要自行绘画,填上合适的,经过alpha通道叠加后可以变透明的色彩……或者干脆什么都不画,直接一口气把主框架的背景色透出来更方便;不过边框还是得自己处理orz。

所有在透明区域的元素都要小心不要因为alpha通道的叠加而产生了奇怪的效果。

最后说一下WPF和传统win32在aero效果上的区别:MSDN上有一个把DWM的API应用到WPF上的示例,那里面aero效果并不会叠加在WPF主框架的子元素上面……大概是因为WPF中并没有WIN32那样的子窗口结构的缘故吧……

不过很显然的,在WPF里面要应用aero效果会更方便……


总之这研究带来的唯一成果就是我立刻放弃了给MPC-HC的界面作美化的想法了。很容易就放弃……算是我的优点么orz
スポンサーサイト

标签 : EP MPC-HC WPF
主题 : ソフトウェア開発
分类 : コンピュータ

发表评论(*请使用半角标点符号)

不公开的评论

个人情报

とある姉コン

Author:とある姉コン
轻小说,ACG,IT相关。

本人则是姐控的死宅(啥),专业是物理化学和高性能计算,有悠久历史(从2000年开始算的话)的代码民工,没了。

ココロ
RSS
最新日志
最新评论
分类
検索フォーム
Tag

虚假的完美世界 EP 姐控 网络 真实的悲惨世界 破鞋党 后宫 絶望した! 文学少女 化物語 HTTP代理 MPC-HC Little_Busters! Fate 文学批评的性别观 戦場ヶ原さま大好き 无限循环 学生会 游戏 K-ON 笨蛋测验召唤兽 DNS服务 Galgame创作 RivaTuner 人渣 自爆 Room.No.1301 GPU-Z 4850HD IE8 WPF Rita UAC windows_live CLANNAD Windows_Gadgets 空境 

友情连接
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。