当前位置: 首页 > 编程语言 > C#

在无边框窗体上使用Windows动画分享

时间:2023-04-11 12:10:56 C#

在无边框窗体上使用Windows动画最近,我(主要是出于好奇)做了一个无边框窗体。制作我自己的标题栏,其中包括一个标题和三个按钮(最小化、最大化和关闭),就像每个普通的Windows程序一样。我还为按钮编写了代码(只是问你是否想看代码)。但是,我注意到没有动画。我的意思是,例如,如果我单击最小化按钮,则没有动画,程序会立即消失(它不会关闭,按钮有效,但没有动画)。这在所有情况下都会发生:当我打开程序时它会立即出现,而当我关闭它时它会立即消失。有什么方法可以使用标准Windows程序使用的这些动画吗?似乎不可能在无边框形式上制作动画。但是,有两种可能的解决方法。在最小化或恢复之前将FormBorderStyle设置回Sizable,然后再设置回None。请改用AnimateWindow函数。动画往往发生在窗口当前所在的位置。这些函数可以应用于任何控件,而不仅仅是顶层窗口。以下是一些示例代码:classFormA:Form{privateconstintWM_SYSCOMMAND=0x0112;私人常量SC_MINIMIZE=0xF020;私有常量SC_RESTORE=0xF120;protectedoverridevoidWndProc(refMessagem){switch(m.Msg){caseWM_SYSCOMMAND:intcommand=m.WParam.ToInt32();if(command==SC_RESTORE){this.FormBorderStyle=FormBorderStyle.Sizable;this.ControlBox=true;}休息;}base.WndProc(refm);}}[DllImport("user32.dll")]staticexternboolAnimateWindow(IntPtrhwnd,intdwTime,intdwFlags);私人常量intAW_VER_POSITIVE=0x00000004;私人常量intAW_VER_NEGATIVE=0x00000008;私人常量intAW_SLIDE=0x00040000;私人常量intAW_HIDE=0x00010000;[STAThread]staticvoidMain(){Application.EnableVisualStyles();表格f=newFormA();f.ControlBox=false;f.FormBorderStyle=FormBorderStyle.None;boolisMinimizing=false;varmb=newButton{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)返回;if(f.WindowState!=FormWindowState.Minimized)f.FormBorderStyle=FormBorderStyle.None;};f.Controls.Add(mb);应用程序运行(f);我知道一年前有人问过这个问题,但我遇到了同样的问题并找到了一个非常好的解决方案看看Github上的这个repo。将FormBase.cs和Native.cs添加到项目中。你要做的就是创建一个Form,feMain.cs并从FormBase派生它Main.cspublicMain(){InitializeComponent();//在调整大小时重绘抓取器this.SetStyle(ControlStyles.ResizeRedraw,true);//使用动画最小化/恢复表单的能力this.FormBorderStyle=FormBorderStyle.Sizable;}//在右下角绘制抓手protectedoverridevoidOnPaint(PaintEventArgse){Rectanglerc=newRectangle(this.ClientSize.Width-cGrip,this.ClientSize.Height-cGrip,cGrip,cGrip);ControlPaint.DrawSizeGrip(e.Graphics,this.BackColor,rc);rc=newRectangle(0,0,this.ClientSize.Width,cCaption);e.Graphics.FillRectangle(Brushes.DarkBlue,rc);SizeGripStyle=SizeGripStyle.Hide;}//覆盖WndProc以添加调整大小能力->CursorprotectedoverridevoidWndProc(refMessagem){if(m.Msg==0x84){//TrapWM_NCHITTESTPointpos=newPoint(m.LParam.ToInt32()&0xffff,m.LParam.ToInt32()>>16);pos=this.PointToClient(pos);如果(pos.X>=this.ClientSize.Width-cGrip&&pos.Y>=this.ClientSize.Height-cGrip){m.Result=(IntPtr)17;//HTBOTTOMRIGHT返回;}}base.WndProc(refm);我还删除了.cs中的FormBaseLine147,因为我的Form有圆角//SetWindowRegion(m.HWnd,0,0,pos.cx,pos.cy);以上就是C#学习教程:在无边框窗体上使用Windows动画分享的所有内容,如果对您有用,需要了解更多C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: