首页 新闻 会员 周边 捐助

AnimateWindow API阻塞UI线程,请问如何解决

0
悬赏园豆:50 [已解决问题] 解决于 2014-03-14 10:01

具体情况是这样的:

有2个窗体,分别是Form1,Form2

Form2在FormLoad方法里加载AnimateWindow效果

Form1点击一个按钮时创建一个Form2实例,并显示。

问题是:当Form2在显示(渐出效果)的时候,Form1就无法进行其它操作了

 

代码如下:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f = new Form2();
            f.Show();
        }
    }
    public partial class Form2 : Form
    {
        #region 窗体动画API
        /// <summary>   
        /// 窗体动画函数    注意:要引用System.Runtime.InteropServices;   
        /// </summary>   
        /// <param name="hwnd">指定产生动画的窗口的句柄</param>   
        /// <param name="dwTime">指定动画持续的时间</param>   
        /// <param name="dwFlags">指定动画类型,可以是一个或多个标志的组合。</param>   
        /// <returns></returns>   
        [DllImport("user32")]
        private static extern bool AnimateWindow(IntPtr hwnd, int dwTime, int dwFlags);
        //下面是可用的常量,根据不同的动画效果声明自己需要的   
        private const int AW_HOR_POSITIVE = 0x0001;//自左向右显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志   
        private const int AW_HOR_NEGATIVE = 0x0002;//自右向左显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志   
        private const int AW_VER_POSITIVE = 0x0004;//自顶向下显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志   
        private const int AW_VER_NEGATIVE = 0x0008;//自下向上显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志该标志   
        private const int AW_CENTER = 0x0010;//若使用了AW_HIDE标志,则使窗口向内重叠;否则向外扩展   
        private const int AW_HIDE = 0x10000;//隐藏窗口   
        private const int AW_ACTIVE = 0x20000;//激活窗口,在使用了AW_HIDE标志后不要使用这个标志   
        private const int AW_SLIDE = 0x40000;//使用滑动类型动画效果,默认为滚动动画类型,当使用AW_CENTER标志时,这个标志就被忽略   
        private const int AW_BLEND = 0x80000;//使用淡入淡出效果   
        #endregion

        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

            int x = Screen.PrimaryScreen.WorkingArea.Right - this.Width;
            int y = Screen.PrimaryScreen.WorkingArea.Bottom - this.Height;
            this.Location = new Point(x, y);
            AnimateWindow(this.Handle, 3000, AW_SLIDE | AW_ACTIVE | AW_VER_NEGATIVE);
        }
    }

 

百度了2个小时没找出方法,鄙人小菜一枚,还请大家帮忙!

牧马的主页 牧马 | 初学一级 | 园豆:63
提问于:2014-03-04 15:11
< >
分享
最佳答案
-1

windows.doevent()

收获园豆:50
傅傅傅傅傅先生 | 菜鸟二级 |园豆:252 | 2014-03-14 09:55
其他回答(3)
0

把 Form2 设置为 Form1 的子窗体。

Launcher | 园豆:45050 (高人七级) | 2014-03-04 15:18

还是阻塞的吧?

支持(0) 反对(0) 牧马 | 园豆:63 (初学一级) | 2014-03-04 16:55
0

当Form2在显示(渐出效果)的时候,Form1就无法进行其它操作了

正常都是这样的,因为form1和form2都是运行在UI线程的呀,但是form1的其他线程是可以工作的,比如在渐出效果的时候,还可以去加载数据库的数据,但是无法做其他的UI操作,因为只有一个线程

lawbc | 园豆:63 (初学一级) | 2014-03-04 16:49

那用多线程能不能解决问题,或者消息泵什么的?

支持(0) 反对(0) 牧马 | 园豆:63 (初学一级) | 2014-03-05 08:45
0

自己解决了,虽然方法有点挫 - -

代码写在博客里了 http://www.cnblogs.com/xm_cpppp/p/3581450.html

牧马 | 园豆:63 (初学一级) | 2014-03-05 15:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册