最近,我(出于好奇)制作了一种无边界的表格。像每个普通的Windows程序一样,制作完自己的标题栏(包括标题)和三个按钮(最小化,最大化和关闭)之后。我还为这些按钮编写了代码(只问您是否要查看代码)。

但是,我注意到没有动画。我的意思是,例如如果单击最小化按钮,则没有动画,该程序会立即消失(它不会关闭,该按钮可以工作,但是没有动画)。在所有情况下都会发生这种情况:当我打开程序时,它会立即出现;当我关闭程序时,它会立即消失。

是否有某种方式可以使用标准Windows程序使用的这些动画?

最佳答案

似乎不可能在无边界表单上具有动画效果。但是,有两种可能的解决方法。


在最小化或还原之前,将FormBorderStyle设置回“可调整大小”,然后再重新设置为“不可变”。
请使用AnimateWindow函数。动画往往发生在窗口当前所在的位置。这些功能可以应用于任何Control,而不仅仅是顶层窗口。


这是一些示例代码:

    class FormA : Form {

        private const int WM_SYSCOMMAND = 0x0112;
        private const int SC_MINIMIZE = 0xF020;
        private const int SC_RESTORE = 0xF120;
        protected override void WndProc(ref Message m) {
            switch (m.Msg) {
                case WM_SYSCOMMAND:
                    int command = m.WParam.ToInt32();
                    if (command == SC_RESTORE) {
                        this.FormBorderStyle = FormBorderStyle.Sizable;
                        this.ControlBox = true;
                    }
                break;
            }
            base.WndProc(ref m);
        }
    }

[DllImport("user32.dll")]
static extern bool AnimateWindow(IntPtr hwnd, int dwTime, int dwFlags);

private const int AW_VER_POSITIVE = 0x00000004;
private const int AW_VER_NEGATIVE = 0x00000008;
private const int AW_SLIDE =        0x00040000;
private const int AW_HIDE = 0x00010000;


            [STAThread]
            static void Main() {
                Application.EnableVisualStyles();
                Form f = new FormA();
                f.ControlBox = false;
                f.FormBorderStyle = FormBorderStyle.None;

                bool isMinimizing = false;
                var mb = new Button { Text = "Min" };
                mb.Click += delegate {
                    isMinimizing = true;
                    f.FormBorderStyle = FormBorderStyle.Sizable;
                    f.ControlBox = true;
                    f.WindowState = FormWindowState.Minimized;
                    f.FormBorderStyle = FormBorderStyle.None;
                    isMinimizing = false;
                    //AnimateWindow(f.Handle, 300, AW_SLIDE | AW_VER_POSITIVE | AW_HIDE);

                };
                f.SizeChanged += delegate {
                    if (isMinimizing)
                        return;
                    if (f.WindowState != FormWindowState.Minimized)
                        f.FormBorderStyle = FormBorderStyle.None;
                };

                f.Controls.Add(mb);
                Application.Run(f);
        }

10-06 06:06
查看更多