MFC中窗口美化函数

来源:互联网 发布:新网域名备案 编辑:程序博客网 时间:2024/05/23 16:25
 
窗口的动画效果其实我们只要会用一个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标志时,该标志被忽略;

如果函数调用成功,则返回非零值,否则返回值为零。
注意:在窗口使用了窗口边界,窗口已经可见仍要显示窗口,窗口已经隐藏仍要隐藏窗口的条件下,函数会调用失败。
 
还有两个api函数可能对你的动感界面有帮助
BOOL DrawAnimatedRects(HWND hwnd, int idAni, CONST RECT *lprcFrom, CONST RECT *lprcTo);
就字面意思窗口从这个区域移动到另一个区域,这个和movewindow可是不同 这个是有动画效果的
第二个参数就是用来设置这个动画效果的。可是好像这个参数只有一个值IDANI_CAPTION有效果,而且移动的效果也仅限于标题栏的移动效果,最小化和最大化就是用的这个函数。还有一个参数为IDANI_OPEN 但是没发现有什么效果。
还有一个就是有关窗口的半透明的问题
BOOL SetLayeredWindowAttributes(         
    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编译通过的
::SetWindowLong(dlgMain.m_hWnd,GWL_EXSTYLE,
   ::GetWindowLong(dlgMain.m_hWnd,GWL_EXSTYLE)^0x80000);//^WS_EX_TRANSPARENT WS_EX_TOPMOST
  SetLayeredWindowAttributes(dlgMain.m_hWnd,0,128,2);
  看这个绿色注释部分 也是窗口的扩展属性。
WS_EX_TRANSPARENT 就是那种“看的见 却摸不着”的窗口样式。后面这个属性是一直置顶。
如果你使用了MFC,则不必这么麻烦,直接
ModifyStyleEx(0, WS_EX_LAYERED);
SetLayeredWindowAttributes(dlgMain.m_hWnd,0,128,2);
两行代码即可解决