一 短消息提示
短消息提示Toast:
用于呈现一条短消息,提示完成后即可自动消失;
特点:
① 弹出式窗口;
② 短文本,可以折行显示;
③ 根据文本长度,自动调整大小;
④ 约1.5后,自动消失;
二 弹出窗口
在Winform中,所有的窗口都用Form实现,比如:
① 常规窗口Window;
② 对话框窗口Dialog;
③ 悬浮窗口FloatWindow;
④ 工具提示Tooltip;
⑤ 弹出式窗口Popup(如菜单窗口、下拉列表窗口);
自定义一个Form类,即可定义一个窗口
publicclassmyToast:Form{}
本窗口不需要边框,位置和大小都是自己控制的。
创建并显示窗口
myToast toast=newmyToast();
toast.ShowMessage("This is a totas!");
子窗体代码
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Drawing.Drawing2D;usingSystem.Drawing.Text;usingSystem.Linq;usingSystem.Runtime.InteropServices;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespace 弹窗提示
{publicpartialclassToast:Form{privatestring message;publicToast(){//无边框this.FormBorderStyle = FormBorderStyle.None;//背景白色this.BackColor = Color.White;}publicvoidShowMessage(string message){this.message = message;//手动指定位置this.StartPosition = FormStartPosition.Manual;this.Location =newPoint(0,0);this.Size =newSize(300,100);//显示窗口this.Show();}protectedoverridevoidOnPaint(PaintEventArgs e){base.OnPaint(e);Graphics g = e.Graphics;int w =this.Width, h =this.Height;Rectangle rect =newRectangle(0,0, w, h);
rect.Inflate(-4,-4);//平滑绘制,反锯齿
g.SmoothingMode = SmoothingMode.HighQuality;
g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;if(message!=null){StringFormat sf =newStringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;Brush brush =newSolidBrush(Color.Black);
g.DrawString(message,this.Font, brush, rect, sf);
brush.Dispose();}}}}
父窗体代码
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespace 弹窗提示
{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidbutton1_Click(object sender,EventArgs e){Toast toast =newToast();
toast.ShowMessage("This is a toast!");}}}
三 窗口位置
toast窗口显示时,相当于主窗口位置居中。
① 找到主窗口,得到主窗口的位置;
② 计算toast窗口的位置;
toast窗口显示时,不剥夺主窗口的焦点,需要重写ShowWithoutActivation
protectedoverridebool ShowWithoutActivation
{get{returntrue;}}
1 要点与细节
① 已知一个控件Control,可以得到它所在的窗口;
Form form=ctrl.FindForm();
子窗体代码:
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Drawing.Drawing2D;usingSystem.Drawing.Text;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespace 窗口位置
{publicpartialclassToast:Form{privatestring message;publicToast(){this.FormBorderStyle = FormBorderStyle.None;this.BackColor = Color.White;this.ShowInTaskbar =false;}//owner 可以是子窗口也可以是控件publicvoidShowMessage(Control owner,string message){this.message = message;this.StartPosition = FormStartPosition.Manual;this.Size =newSize(300,100);//找到owner所在的顶级窗口Form form = owner.FindForm();this.Owner = form;//使toast窗口相对主窗口居中Rectangle fr =newRectangle(form.Location, form.Size);int x = fr.X +(fr.Width -this.Width)/2;int y = fr.Y +(fr.Width -this.Height)/2;this.Location =newPoint(x, y);this.Show();}//焦点控制:本窗口不剥夺主窗口的焦点//否则,当toast窗口激活时,主窗口焦点被剥夺protectedoverridebool ShowWithoutActivation
{get{returntrue;}}protectedoverridevoidOnPaint(PaintEventArgs e){base.OnPaint(e);Graphics g = e.Graphics;int w =this.Width, h =this.Height;Rectangle rect =newRectangle(0,0, w, h);
rect.Inflate(-4,-4);//平滑绘制,反锯齿
g.SmoothingMode = SmoothingMode.HighQuality;
g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;if(message!=null){StringFormat sf =newStringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;Brush brush =newSolidBrush(Color.Black);
g.DrawString(message,this.Font, brush, rect, sf);
brush.Dispose();}}}}
父窗体代码
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespace 窗口位置
{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidbutton1_Click(object sender,EventArgs e){Toast toast =newToast();
toast.ShowMessage(button1,"中国人民解放军!");}}}
四 窗口大小
Toast的窗口的大小,应该根据消息长度来调整,比如:
toast.ShowMessage(button1,"成功");
toast.ShowMessage(button1,"思密达");
toast.ShowMessage(button1,"编程是一种艺术");
使用Graphics.MeasureString()可以测算文本的尺寸
Graphics g=this.CreateGraphics();SizeF size=g.MeasureString(str,this.Font,300);
g.Dispose();
注意,临时创建的Graphics用完之后需要手工销毁。
版权归原作者 钢铁男儿 所有, 如有侵权,请联系我们删除。