|
这个月一直有个问题让我困扰着我.
在CE中是否可以真正意义上的实现相对于屏幕弹出的窗口或是图片淡入淡出(弹出时)?就是说.在mobile屏幕上(而不是你自己写的窗口或是其它你程序中的背景图片上),一个窗口淡入淡出.或是一个图片淡入淡出.我说的不是在你的窗口基础上再淡入淡出.而是在屏幕上.总结实现有这几种方法:
1>建立分层窗口.窗口风格为WS_EX_LAYERED............下面实现不用再说了.因为mobile不支持分层窗口.
2>使用特定API---AnimateWindow函数................也不用再看了,因为mobile不支持AnimateWindow.
3>建立窗口的时候让窗口透明.然后按照一定的透明度把图片按一定的时间比例COPY到窗口DC中.可以实现窗口淡入.但是不能实现窗口淡出.我思考的原因是:在COPY一定的透明度的图片到窗口DC中时,窗口DC的图片透明度是一个叠加的效果.所以淡出就不会起作用.换句话说,窗口DC中的内容你只能覆盖不能清除.所以从不透明到透明是一个我不能解决的难点:
解决方案1: 同样地,把要弹出的窗口挡住的那部分屏幕在窗口弹出前先截取保存下来.在图片淡入到不透明的时候,用截取的屏幕图片做淡入.从用户的角度来看:确实是一个淡入淡出的效果.但是其间如果用户做一些影响屏幕更新的动作.这个方案是不可行的.
解决方案2: 在方案一的基础上,每一段时间截取一次屏幕再做淡入.-----不可行.原因是截取屏幕要用到的屏幕DC通常都包括你的窗口或图片在内.
目前较好的方案:
1>建立窗口时让窗口透明,
2>抓取窗口挡住的那部分屏幕,并抓取屏幕背景.
3>按一定透明度把窗口图片按一定时间比例COPY到屏幕DC
4>我觉得也是最重要的一点.每个时间段抓取一次窗口句柄.和上一次窗口句柄比较.
(相等):说明屏幕没有变化.用户没有对屏幕有动作.用第一次抓取的屏幕背景做谈入.
(不相等):说明屏幕已经被用户改变.此时再抓取一次屏幕.用这次抓取的屏幕背景做淡入(此时透明度不能从0开始.应该在上一次透明度基础上淡入).
缺点:如果用户动作太快.连续做了几个动作影响了屏幕.那么.这种方案多少有点让人不太满意.
不同意用像素点的颜色做位运算.个人认识: 用像素的RGB作淡入淡出不合适(单色可以):理由是视角颜色有亮度,灰度等其它属性. 只能用HSV,但是这种结构较复杂, MSDN对这方面几乎不支持用户这么做(API少).同时需要深度学习视觉渐变原理.
小弟愚见.
|
|