AnimateWindow实现窗口动画

函数原型:BOOL AnimateWindow(HWNDhWnd,DWORDdwTime,DWORDdwFlags)。

函数功能:该函数能在显示与隐藏窗口时产生两种特殊类型的动画效果:滚动动画和滑动动画。

 

一、动画窗口的实现

下面就以一个简单的单文档程序为例,说明如何在VC中使用AnimateWindow函数来实现打开和关闭程序时的动画效果。笔者所使用的开发环境为:WindowsME,VisualC++6。



1、建立一个MFCAppWizard(exe)应用工程Animate。

在MFCAppWizard向导的第一步中选择Singledocument,再点击按键Finish->OK完成工程建立。

 

2、在CMainFrame::OnCreate函数中增加黑体加粗部分语句。

intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct) 
      
       …… 
       m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 
       EnableDocking(CBRS_ALIGN_ANY); 
       DockControlBar(&m_wndToolBar); 
       AnimateWindow(GetSafeHwnd(),1000,AW_CENTER); 
       return0; 

}

 

3、使用MFCClassWizard增加消息处理函数

使用ClassWizard在CMainFrame类中增加WM_CLOSE消息处理函数,并增加以下语句。

voidCMainFrame::OnClose() 
{ 
       //TODO:Addyourmessagehandlercodehereand/orcalldefault 
       AnimateWindow(GetSafeHwnd(),1000,AW_HIDE|AW_CENTER); 
       CFrameWnd::OnClose(); 

}

 

二、编译时出现的问题

 

在实现动画窗口的程序时,笔者发现如果直接在VC中使用AnimateWindow函数,在编译时会报告出错。以上述程序为例,在编译时系统会报告:

''AnimateWindow'':undeclaredidentifier 
 ''AW_HIDE'':undeclaredidentifier 
 ''AW_CENTER'':undeclaredidentifier 

通过错误提示可以看出是编译系统认为AnimateWindow函数和AW_HIDE、AW_CENTER两个参数没有定义。因该函数是定义在Winuser.h头文件中的,于时,笔者显示地在程序中定义了对该头文件的包含,编译时却仍然出现相同的错误。为什么在VC中编译不能通过呢?通过查阅MSDN笔者发现在MSDN中明确提到WindowsNT5.0和Windows98以上版本均支持该函数。通过笔者的研究发现,问题出在定义AnimateWindow函数的头文件Winuser.h中,在VC安装目录下进入include子目录,用EDIT打开Winuser.h文件,按F3键查找AnimateWindow,可以发现有两处定义,一处是定义该函数中使用到的参数;另一处是该函数原型的定义。在这两处定义中均出现了对Windows版本的条件判断,#if(WINVER>=0X500)……,原来问题出在这里,我们目前所使用的各种Windows主版本号均为5点零以下,所以在VC中编译上述程序时,编译系统自然将AnimateWindow函数排除在外。因此为了在我们的程序中使用该函数,就得对其头文件进行一些小小的修改,即将#if(WINVER>=0X500)改为#if(WINVER>=0X400),请注意两处出现该函数定义的部分都要进行修改。

假如你不想修改Winuser.h,可以在工程里的StdAfx.h文件靠前位置加上如下定义:

#undefWINVER 

#defineWINVER0X500

修改好头文件后,编译即可通过。

文章引用自:作者:陈萌 nbchen75@sina.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使Winform窗口切换不闪烁,可以尝试以下几种方法: 1. 双缓冲技术:在窗口的构造函数中添加以下代码: ``` SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); UpdateStyles(); ``` 这将使窗口使用双缓冲技术,可以减少窗口切换时的闪烁现象。 2. 开启硬件加速:在窗口的构造函数中添加以下代码: ``` SetStyle(ControlStyles.Opaque, true); ``` 这将使窗口使用硬件加速,也可以减少窗口切换时的闪烁现象。 3. 使用窗口动画:在窗口的构造函数中添加以下代码: ``` AnimateWindow(this.Handle, 200, AW_BLEND); ``` 这将为窗口添加一个渐变动画,可以使窗口切换更加平滑,减少闪烁现象。 注意:以上方法需要在窗口的构造函数中添加,建议在窗口的Load事件中执行,以确保窗口已经完全加载。同时,需要引入以下命名空间: ``` using System.Runtime.InteropServices; using System.Windows.Forms; ``` 完整代码示例: ``` using System.Runtime.InteropServices; using System.Windows.Forms; public partial class Form1 : Form { [DllImport("user32.dll")] static extern bool AnimateWindow(IntPtr hWnd, int time, int flags); private const int AW_BLEND = 0x00080000; public Form1() { InitializeComponent(); SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); UpdateStyles(); SetStyle(ControlStyles.Opaque, true); AnimateWindow(this.Handle, 200, AW_BLEND); } private void Form1_Load(object sender, EventArgs e) { //TODO: 窗口加载完成后的操作 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值