0


C# 短消息提示 窗口位置

一 短消息提示

短消息提示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用完之后需要手工销毁。

标签: c# ui .net

本文转载自: https://blog.csdn.net/weixin_42291376/article/details/128138733
版权归原作者 钢铁男儿 所有, 如有侵权,请联系我们删除。

“C# 短消息提示 窗口位置”的评论:

还没有评论