验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

C#怎么实现短消息提示窗口位置及窗口大小

阅读:756 来源:乙速云 作者:代码code

C#怎么实现短消息提示窗口位置及窗口大小

      一 短消息提示

      短消息提示Toast:

      用于呈现一条短消息,提示完成后即可自动消失;

      特点:

      ① 弹出式窗口;

      ② 短文本,可以折行显示;

      ③ 根据文本长度,自动调整大小;

      ④ 约1.5后,自动消失;

      二 弹出窗口

      在Winform中,所有的窗口都用Form实现,比如:

      ① 常规窗口Window;

      ② 对话框窗口Dialog;

      ③ 悬浮窗口FloatWindow;

      ④ 工具提示Tooltip;

      ⑤ 弹出式窗口Popup(如菜单窗口、下拉列表窗口);

      自定义一个Form类,即可定义一个窗口

      public class myToast:Form
      {
      
      }

      本窗口不需要边框,位置和大小都是自己控制的。

      创建并显示窗口

      myToast toast=new myToast();
      toast.ShowMessage("This is a totas!");

      子窗体代码

      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Drawing.Drawing2D;
      using System.Drawing.Text;
      using System.Linq;
      using System.Runtime.InteropServices;
      using System.Text;
      using System.Threading.Tasks;
      using System.Windows.Forms;
      
      namespace 弹窗提示
      {
          public partial class Toast : Form
          {
              private string message;
              public Toast()
              {
                  //无边框
                  this.FormBorderStyle = FormBorderStyle.None;
                  //背景白色
                  this.BackColor = Color.White;
              }
      
              public void ShowMessage(string message)
              {
                  this.message = message;
      
                  //手动指定位置
                  this.StartPosition = FormStartPosition.Manual;
                  this.Location = new Point(0, 0);
                  this.Size = new Size(300, 100);
      
                  //显示窗口
                  this.Show();
              }
      
              protected override void OnPaint(PaintEventArgs e)
              {
                  base.OnPaint(e);
      
                  Graphics g = e.Graphics;
                  int w = this.Width, h = this.Height;
                  Rectangle rect = new Rectangle(0, 0, w, h);
                  rect.Inflate(-4, -4);
      
                  //平滑绘制,反锯齿
                  g.SmoothingMode = SmoothingMode.HighQuality;
                  g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
      
                  if(message!=null)
                  {
                      StringFormat sf = new StringFormat();
                      sf.Alignment = StringAlignment.Center;
                      sf.LineAlignment = StringAlignment.Center;
      
                      Brush brush = new SolidBrush(Color.Black);
                      g.DrawString(message, this.Font, brush, rect, sf);
                      brush.Dispose();
                  }
              }
          }
      }

      父窗体代码

      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      using System.Windows.Forms;
      
      namespace 弹窗提示
      {
          public partial class Form1 : Form
          {
              public Form1()
              {
                  InitializeComponent();
              }
      
              private void button1_Click(object sender, EventArgs e)
              {
                  Toast toast = new Toast();
                  toast.ShowMessage("This is a toast!");
              }
          }
      }

      三 窗口位置

      toast窗口显示时,相当于主窗口位置居中。

      ① 找到主窗口,得到主窗口的位置;

      ② 计算toast窗口的位置;

      toast窗口显示时,不剥夺主窗口的焦点,需要重写ShowWithoutActivation

      protected override bool ShowWithoutActivation
      {
         get
         {
            return true;
         }
      }

      1 要点与细节

      ① 已知一个控件Control,可以得到它所在的窗口;

      Form form=ctrl.FindForm();

      子窗体代码:

      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Drawing.Drawing2D;
      using System.Drawing.Text;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      using System.Windows.Forms;
      
      namespace 窗口位置
      {
          public partial class Toast : Form
          {
              private string message;
              public Toast()
              {
                  this.FormBorderStyle = FormBorderStyle.None;
                  this.BackColor = Color.White;
                  this.ShowInTaskbar = false;
              }
              //owner 可以是子窗口也可以是控件
              public void ShowMessage(Control owner,string message)
              {
                  this.message = message;
      
                  this.StartPosition = FormStartPosition.Manual;
                  this.Size = new Size(300, 100);
      
                  //找到owner所在的顶级窗口
                  Form form = owner.FindForm();
                  this.Owner = form;
      
                  //使toast窗口相对主窗口居中
                  Rectangle fr = new Rectangle(form.Location, form.Size);
                  int x = fr.X + (fr.Width - this.Width) / 2;
                  int y = fr.Y + (fr.Width - this.Height) / 2;
                  this.Location = new Point(x, y);
      
                  this.Show();
              }
      
              //焦点控制:本窗口不剥夺主窗口的焦点
              //否则,当toast窗口激活时,主窗口焦点被剥夺
              protected override bool ShowWithoutActivation
              {
                  get { return true; }
              }
      
              protected override void OnPaint(PaintEventArgs e)
              {
                  base.OnPaint(e);
      
                  Graphics g = e.Graphics;
                  int w = this.Width, h = this.Height;
                  Rectangle rect = new Rectangle(0, 0, w, h);
                  rect.Inflate(-4, -4);
      
                  //平滑绘制,反锯齿
                  g.SmoothingMode = SmoothingMode.HighQuality;
                  g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
      
                  if(message!=null)
                  {
                      StringFormat sf = new StringFormat();
                      sf.Alignment = StringAlignment.Center;
                      sf.LineAlignment = StringAlignment.Center;
      
                      Brush brush = new SolidBrush(Color.Black);
                      g.DrawString(message, this.Font, brush, rect, sf);
                      brush.Dispose();
                  }
              }
          }
      }

      父窗体代码

      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      using System.Windows.Forms;
      
      namespace 窗口位置
      {
          public partial class Form1 : Form
          {
              public Form1()
              {
                  InitializeComponent();
              }
      
              private void button1_Click(object sender, EventArgs e)
              {
                  Toast toast = new Toast();
                  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用完之后需要手工销毁。

    分享到:
    *特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
    相关文章
    {{ v.title }}
    {{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
    你可能感兴趣
    推荐阅读 更多>