窗口的动画效果其实我们只要会用一个windows的api就可以了,下面我来介绍一下这个api
函数原型:
BOOL AnimateWindow(HWND hWnd,DWORD dwTime,DWORD dwFlags)
函数功能:
能在窗口打开或者隐藏时产生动画效果。
参数含义:
hWnd:指定产生动画效果的窗口句柄。
dwTime:指明动画持续时间(以毫秒计算),动画的标准时间应该为200毫秒。
dwFlags:指定动画类型。这个参数可以是一个或者多个标志的组合。以下是该参数的取值:
AW_SLIDE:使用滑动类型。缺省则为滚动类型。当使用AW_CENTER标志时,这个标志被忽略。
AW_ACTIVATE:激活窗口。在使用了AW_HIDE标志后不能使用这个标志。
AW_BLEND:实现淡出效果。只有当hWnd为顶层窗口的时候才可以使用此标志。
AW_HIDE:隐藏窗口,缺省则为显示窗口。
AW_CENTER:若使用了AW_HIDE标志,则使窗口向内重叠,即收缩窗口;若未使用AW_HIDE标志,则使窗口向外扩展,即展开窗口;
AW_HOR_POSITIVE:自左向右显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志被忽略;
AW_VER_POSITIVE:自顶向下显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志被忽略;
AW_VER_NEGATIVE:自下向上显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志被忽略;
如果函数调用成功,则返回非零值,否则返回值为零。
注意:在窗口使用了窗口边界,窗口已经可见仍要显示窗口,窗口已经隐藏仍要隐藏窗口的条件下,函数会调用失败。
BOOL AnimateWindow(HWND hWnd,DWORD dwTime,DWORD dwFlags)
函数功能:
能在窗口打开或者隐藏时产生动画效果。
参数含义:
hWnd:指定产生动画效果的窗口句柄。
dwTime:指明动画持续时间(以毫秒计算),动画的标准时间应该为200毫秒。
dwFlags:指定动画类型。这个参数可以是一个或者多个标志的组合。以下是该参数的取值:
如果函数调用成功,则返回非零值,否则返回值为零。
注意:在窗口使用了窗口边界,窗口已经可见仍要显示窗口,窗口已经隐藏仍要隐藏窗口的条件下,函数会调用失败。
还有两个api函数可能对你的动感界面有帮助
BOOL DrawAnimatedRects(HWND hwnd, int idAni, CONST RECT *lprcFrom, CONST RECT *lprcTo);
就字面意思窗口从这个区域移动到另一个区域,这个和movewindow可是不同 这个是有动画效果的
第二个参数就是用来设置这个动画效果的。可是好像这个参数只有一个值IDANI_CAPTION有效果,而且移动的效果也仅限于标题栏的移动效果,最小化和最大化就是用的这个函数。还有一个参数为IDANI_OPEN 但是没发现有什么效果。
还有一个就是有关窗口的半透明的问题
BOOL SetLayeredWindowAttribut
es(
HWND hwnd,
COLORREF crKey,
BYTE bAlpha,
DWORD dwFlags
);
hwnd是透明窗体的句柄,
crKey为颜色值,
bAlpha是透明度,取值范围是[0,255],
dwFlags是透明方式,可以取两个值:
当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;
当取值为LWA_COLORKEY时,Alpha参数有效而窗体中的所有颜色为crKey的地方将变为透明。
LWA_ALPHA = 0x2
LWA_COLORKEY=0x1
也可以取两个值的组合:LWA_ALPHA Or LWA_COLORKEY。这样crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度。
要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性
(旧的sdk没有定义这个属性,所以可以直接指定为0x80000).
WS_EX_LAYERED = 0x80000
下面是一段例子代码 在vs2005 WTL 8.0编译通过的
);
hwnd是透明窗体的句柄,
crKey为颜色值,
bAlpha是透明度,取值范围是[0,255],
dwFlags是透明方式,可以取两个值:
要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性
(旧的sdk没有定义这个属性,所以可以直接指定为0x80000).
WS_EX_LAYERED = 0x80000
下面是一段例子代码 在vs2005 WTL 8.0编译通过的
::SetWindowLong(dlgMain.m_hWnd,GWL_EXSTYLE,
::GetWindowLong(dlgMain.m_hWnd,GWL_EXSTYLE)^0x80000);
//^WS_EX_TRANSPARENT WS_EX_TOPMOST
SetLayeredWindowAttribut
es(dlgMain.m_hWnd,0,128,2);
WS_EX_TRANSPARENT 就是那种“看的见 却摸不着”的窗口样式。后面这个属性是一直置顶。
如果你使用了MFC,则不必这么麻烦,直接
ModifyStyleEx(0, WS_EX_LAYERED);
SetLayeredWindowAttribut
es(dlgMain.m_hWnd,0,128,2);
两行代码即可解决