【讨论】GDI+,分层窗口(LayeredWindow)的技术特点以及应用

豆腐 2004-06-29 08:39:13
最近在作一个界面换肤的工程,用传统的HOOK+子类化的操作,很多依赖WM_PAINT来维护窗口的外观,昨天一个朋友给推荐了一下层窗口,试用一下,果然不错!

win2000以后的版本在用户界面方面包括了几个重大的改进,譬如有阴影的鼠标,渐入的工具条快速提示,透明的窗口,平滑的窗口变化等等.这些变化都可以归结为用户对"渐变"的需求远远要比传统的"跃进式"要感兴趣的多,很显然,"渐变"比"跃进式"的用户界面要温和的多.

其实是因为WIN2000采用了一种GDI,以前叫GDI2K,现在叫GDI+,是一种新型的图形设备接口,它的主要特点在于它那个创建全新的用户桌面体系,能够轻易的完成二维或三维的图形处理,同同时也提供了增强的图形处理技术,如alpha blending,纹理,贴图,增强的文本以及图片显式技术.实际上GDI+主要的特色就就在于强调通过硬件加速来达到靓号的视觉感受!

透明的窗口,淡入淡出,这些在很大程度上引入了多分层窗口的应用!
分层窗口主要作用以及特点如下:
分层窗口采取"合成"(compose)的方式来绘制,【系统占用资源低】,【支持窗口平滑变化】
分层窗口可以是【半透明】或者【透明】的
分层窗口可以是【任意形状】,支持【变形操作】


我们知道,在传统的windows98或者NT下面,窗口外观发生变化(该窗口被其它窗口覆盖,窗口大小发生变化)时,应用程序会自动维护窗口的外观,而这种维护,是在编程中加入了对WM_PAINT之类的消息响应.如果桌面窗口的外观频繁的发生变化,那么,所有的窗口都回去响应"WM_PAINT"消息,以保持窗口自身的外观,这样就使得每个窗口都在进行重绘操作,这样就自然加重了操作系统的负担,当系统忙不过来的时候,你会发现,有些窗口忧郁在重绘过程中就产生了"抖动"~~~大大的影响了整个桌面的外观.

分层窗口的出现使得上面的问题得到了解决,它的特点就在于,它将窗口的绘制操作进行了重新定义::【由操作系统(而不是应用程序),完成重绘操作,完成的方式是"合成":将窗口看成一副位图,窗口外形的变化只是"位图"的变化!而不需要非得通过对WM_PAINT消息来进行.这样就能够保证分层窗口在概念上包括两层含义:与传统相比,这种窗口从外观上看起来恩奇怪(它可以是透明或者半透明的,或者是异性的);二是【重定向】:对窗口的重绘操作不需要你手工添加代码来维护,系统会自动将重绘操作在后台完成!


分层窗口实际上一种在WIN2000下能够自动地与非活动窗口进行合成的一种窗口.
...全文
1943 56 打赏 收藏 转发到动态 举报
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
snaill 2004-09-17
  • 打赏
  • 举报
回复
关注
wlzqi 2004-09-17
  • 打赏
  • 举报
回复
GDI+确实是个好东西,他有GDI无法比拟的优越,本人觉得因该尽量使用GDI+,至于GDI+不支持位操作,和不方便使用缓冲技术,这点我想在GDI+ 1.0后因该会有改善的。
我最近也发现了一个GDI+的缺陷(也许不是缺陷,是我没有发现解决方法)。就是Graphics myGraphics( this->m_hWnd ) ,好像不能离开{}作用域定义,不能像变量一样事先声明好,以至使用不是很方便.
另外:就是我在OnPaint中用GDI+ 绘制窗体中的一个区域,并在OnTimer中每秒改变区域形状,这时 本人感觉GDI+资源好像不能及时释放,导致程序的CPU使用率缓慢、逐步提高,1~2个小时后就可到100%,不知道这算不算GDI+的一个问题呀。
TTLOVEVBNET 2004-09-08
  • 打赏
  • 举报
回复
在GDI+中编程好很多对路径的操作方便多了,重绘速度也不错,不过就是不能设置SetROP2()(绘图模式)所以要是GDI+和GDI一起来用会有意想不到的效果
asen 2004-09-02
  • 打赏
  • 举报
回复
长知识!以后会用到
mdzhao 2004-09-02
  • 打赏
  • 举报
回复
好东西,保存!!
DentistryDoctor 2004-09-01
  • 打赏
  • 举报
回复
GDI+效果是很好,但性能却比GDI差。
ningzhiyu 2004-09-01
  • 打赏
  • 举报
回复
mark
蒋晟 2004-08-22
  • 打赏
  • 举报
回复
GDI+在转换格式方面效率不如C++算法,但是使用简单,兼容多种格式是其优点,而且没有授权的问题。

.Net版本和DLL版本的发布都很简单。但是DLL版本的封装类是C++的,如果要和其他语言混合编程,推荐使用.Net版本,或者IPicture接口。

显示方面,也兼容了DirectX和GDI,支持在DirectX表面或者设备上下文中绘图。速度方面有些损失,但是各种特效效果不错。简化了对字体的处理,以各种方式显示文字和增加特效更加简单。
老夏Max 2004-08-13
  • 打赏
  • 举报
回复
Mark
keiven 2004-08-05
  • 打赏
  • 举报
回复
gz
lanstar200 2004-08-05
  • 打赏
  • 举报
回复
mark
zht_1 2004-08-05
  • 打赏
  • 举报
回复
关注.
Muf 2004-08-04
  • 打赏
  • 举报
回复
至于有些人说,发布时还要带上gdiplus.dll,这没什么好说的。这个库目前不过1MB,再说,如果用VC/MFC来开发程序的话,还需带上mfc4c*.dll或mfc71*.dll之类,这几个dll大小可观。
也许有人说,mfc库windows自带。我得提醒大家,不见得自带,我用的是windowsxp,有些软件没带mfc库,结果我还得找别人去拷mfc42*.dll,才能用。大家发布软件时,不要存有侥幸心理,还是该发布的库要一起发布,如果用户不能用,那才是大事。
Muf 2004-08-04
  • 打赏
  • 举报
回复
呵呵,原先说错了。GDI+是在.NET出来同一时期出现的。所以它在XP中附带。
GDI+可以在Windows98以上操作系统中使用。
不过,就目前来说,支持GDI+加速的显卡不多。
既使是这一点,如果使用GDI+绘制图片来说,它的速度不错。
我做过测试,发现GDI+在画图片时,效率最高的是带Alpha的图片。
效率极低的是缩放图片,最低的是绘制特效图片(即用带有ImageAttributes参数的DrawImage)。
所以,在使用DrawImage时,最好尺寸参数都全部指定,不要省略,否则有可能被GDI+进行缩放处理,那效率可就低得多了。
另外,Cached图片只是略比普通图片快一点,在效率上的差别并不明显。所以除非是常用的图片,否则没必要用Cached。
enoloo 2004-08-01
  • 打赏
  • 举报
回复
不错
mrf2con 2004-07-30
  • 打赏
  • 举报
回复
oh忘了解释为什么gdi要与directx分家呢?为什么不用directx?最重要的一点呵呵,我想大家都清楚--gdi是设备无关的吧,(所以设备无关的优越性我就不用讲了)哈哈 对不对大家帮着修正
mrf2con 2004-07-30
  • 打赏
  • 举报
回复
在有一个基本问题就是关于gdi是不是与directx有瓜葛?答案是没有,也就是说gdi与directx是毫无关联的两种东西,如果你的游戏简单,而且又不想使用directx那么方法只有一个就是使用gdi,因此现在大多数软件的漂亮皮肤,或者是一些简单的图标软件使用的还是传统gdi开发。
下面把握所知道的gdi与directx的区别说一下,请大家修正:
gdi (graph device interface 图形设备接口)是建立在(DDI 显示设备接口之上的,而显示设备接口则直接访问视频硬件(如显卡)但是显示设备接口也使用(HEL 硬件仿真层)而directx则是与(HAL 硬件抽象层)打交道的,每个显卡公司出的显卡驱动就是为了HAL而准备的。如果某个特性,比如说directx9的某个特性,你的显卡不支持,那么在directx9调用这个特性,但你的显卡只是支持directx8那么hal便不会将其作为硬件特性进行报告,这时候directx也会去找HEL,呵呵。所以这么看来,gdi一般来说没有用到显卡的高级特性,比如说gdi使用的某种功能在你的显卡上已经是硬件支持,但是gdi还是不会去使用这个支持,因此性能要比directx差,而directx就显得能屈能伸多了!
mrf2con 2004-07-30
  • 打赏
  • 举报
回复
Muf(沐枫) 提到gdi+ 是在.net中出现的,对于传统win32的热爱,我查了一下msdn

Gdiplus.dll is included with Windows XP. For information about which operating systems are required to use a particular class or method, see the More Information section of the documentation for the class or method. GDI+ is available as a redistributable for Windows NT 4.0 SP6, Windows 2000, Windows 98, and Windows Me. To download the latest redistributable, see http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdkredist.htm .

Note If you are redistributing GDI+ to a downlevel platform or a platform that does not ship with that version of GDI+ natively, install Gdiplus.dll in your application directory. This puts it in your address space, but you should use the linker's /BASE option to rebase the Gdiplus.dll to prevent address space conflict.

发现,并不是.net的才有,它有传统api的借口,上面的是关于它的dll, msdn上还有gdi+软件的分布问题
SainTown 2004-07-30
  • 打赏
  • 举报
回复

以一个简单的绘图程序为例说明分层窗口的特点:

一种实现方式是:程序保存图形数据,比如点的坐标,线的起点终点等等,然后WM_PAINT时根据这些数据重绘。

另一种实现方式是:程序在内存中建立一个BITMAP,然后在BITMAP上绘图,这样,绘制过程只需要进行一次。响应WM_PAINT时就直接把内存中BITMAP的内容拷贝到屏幕上即可。
这是一种用空间换时间的方法。

分层窗口的实现模式就像后一种情况,只不过是系统自动进行的,还附带了些新特性。内存位图的创建是自动进行的,向窗口相关的DC绘图时也是自动定向到内存位图的,响应WM_PAINT消息时也是系统自动进行的。

上面那位哥们说的分层窗口耗内存的情况是对的。

至于GDI+,我有个同事对GDI+和GDI做过比较,应该说两种各有优劣。简单的操作好像GDI要快点,复杂的操作GDI+要好些。但相对来说GDI+要好些,还有很多丰富的新功能。

GDI+的确会用到硬件功能。我同事上次写了一个程序,在某台机器上更新时特别慢,足足要10分钟,相反在其他机器上没有这种情况,后来才发现是GDI+的一个alpha blend函数的问题。看来GDI+在硬件兼容性上还有点bug :)
caicheng 2004-07-29
  • 打赏
  • 举报
回复
好啊,我刚学GDI+
我觉得能利用显卡的加速这实在是重大的进步啊
否则办公室用ATI/NV的卡岂不是太让人心疼了?哈哈
加载更多回复(36)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧