none
C# WinForm 无边框窗口最大化、最小化的动画没有了 RRS feed

  • 问题

  • 把WinForm的FormBorderStyle设置为None之后,虽然窗口无边框了,但是怎么做到有系统自带的最大化最小化动画呢?我知道这点可以实现,因为Visual Studio就能做到这一点,但是不知道是什么原理。
    2016年12月24日 3:08

答案

  • 你把FormBorderStyle设置为None之后,是不会自带系统的动画的。如果要实现,你可以自己做一个动画,就是在窗体最小化,最大化按钮被点击时,自己做一个窗体放大的动画或是一个窗体缩小到一个点然后点消失,托管到任务栏或的动画。

    具体可以这样实现:

    /// <summary>
    /// 窗体动画函数
    ///API声明
    /// </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;//使用淡入淡出效果
    //--------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------
    //将窗体的FormBorderStyle属性设置为none
    //窗体代码
    //窗体加载时使用
    private void Form1_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, 1000, AW_SLIDE | AW_ACTIVE | AW_VER_NEGATIVE);
    }
    //窗体准备关闭时(也可以在点击自定的关闭按钮时)
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
       AnimateWindow(this.Handle, 1000, AW_BLEND | AW_HIDE);
    }
    //此代码块综合了许多网站的代码,希望帮助到楼主!


    2017年1月19日 5:08

全部回复

  • 您好,

    當設定了 None 後的確是不會有動畫的,

    您可以參考以下的方式,

    Use windows animations on borderless form


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2016年12月24日 11:56
  • Hi DomadoM,

    >>" 但是怎么做到有系统自带的最大化最小化动画呢? "

    对于这句话不是太知道是什么个效果。你可以动态的截个图吗?

    这儿我发现以下动态的效果图的demo,你可以参考一下。

    Control Animation in Winforms

    Best Regards,

    Hart

    如果你的问题已经解决,请及时标记有用的回复作为答案,这样会帮助那些遇到相同问题的人


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年12月26日 2:04
    版主
  • 例如一个有边框的普通窗口,最小化后会有类似于消失的动画。但是无边框窗口最小化后就是一闪而过,没有动画。
    2017年1月18日 12:23
  • 你把FormBorderStyle设置为None之后,是不会自带系统的动画的。如果要实现,你可以自己做一个动画,就是在窗体最小化,最大化按钮被点击时,自己做一个窗体放大的动画或是一个窗体缩小到一个点然后点消失,托管到任务栏或的动画。

    具体可以这样实现:

    /// <summary>
    /// 窗体动画函数
    ///API声明
    /// </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;//使用淡入淡出效果
    //--------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------
    //将窗体的FormBorderStyle属性设置为none
    //窗体代码
    //窗体加载时使用
    private void Form1_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, 1000, AW_SLIDE | AW_ACTIVE | AW_VER_NEGATIVE);
    }
    //窗体准备关闭时(也可以在点击自定的关闭按钮时)
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
       AnimateWindow(this.Handle, 1000, AW_BLEND | AW_HIDE);
    }
    //此代码块综合了许多网站的代码,希望帮助到楼主!


    2017年1月19日 5:08