C#短消息提示窗口位置及窗口大小详解

目录
  • 一 短消息提示
  • 二 弹出窗口
  • 三 窗口位置
    • 1 要点与细节
  • 四 窗口大小
  • 总结

一 短消息提示

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

总结

到此这篇关于C#短消息提示窗口位置及窗口大小的文章就介绍到这了,更多相关C#短消息提示窗口位置内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • c#消息提示框messagebox的详解及使用

    C#消息提示框messagebox的详解及使用 消息对话框是用messagebox对象的show方法显示的.MessageBox对象是命名空间System.Windows.Forms的一部分,Show是一个静态方法,意思是说,不需要基于MessageBox类的对象创建实例,就可以使用该方法.而且该方法是可以重载的,即方法可以有不同的参数列表形式. 返回结果:DialogResult dr1=MessageBox.Show(text,caption,buttons,icon,defaultbutt

  • C#短消息提示窗口位置及窗口大小详解

    目录 一 短消息提示 二 弹出窗口 三 窗口位置 1 要点与细节 四 窗口大小 总结 一 短消息提示 短消息提示Toast: 用于呈现一条短消息,提示完成后即可自动消失: 特点: ① 弹出式窗口: ② 短文本,可以折行显示: ③ 根据文本长度,自动调整大小: ④ 约1.5后,自动消失: 二 弹出窗口 在Winform中,所有的窗口都用Form实现,比如: ① 常规窗口Window; ② 对话框窗口Dialog: ③ 悬浮窗口FloatWindow; ④ 工具提示Tooltip; ⑤ 弹出式窗口P

  • Linux消息队列实现进程间通信实例详解

    Linux消息队列实现进程间通信实例详解 一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题.但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制. Linux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最大长度. 二.在Linux中使用消息队列 Linux提供了一系列消息队列的函数接口来让我们方便地使用

  • 使用纯JavaScript封装一个消息提示条功能示例详解

    目录 介绍 思路&布局 操作逻辑 完整代码 介绍 一个类似Element UI.Ant-Design UI等 UI 框架的消息提示功能,方便在任何网页环境中直接调用函数使用:区别在不依赖 js 及 css 引用,而是使用纯 js 进行封装实现,代码更精简,同时保持和 UI 框架一样的视觉效果(可自行修改成自己喜欢的样式) 代码仓库 在线预览效果(点击[登录].[点击复制]按钮时触发提示效果) 思路&布局 先来写单个提示条,并实现想要的过渡效果,最后再用逻辑操作输出节点即可:这里不需要父节点

  • Android中用Bmob实现短信验证码功能的方法详解

    这篇文章主要介绍发送验证码和校验验证码的功能,用到一个第三方平台Bmob,那Bmob是什么呢?Bmob可以开发一个云存储的移动应用软件,他提供了大量的标准的API接口,根据需要接入相关服务,开发者可以更加专注于应用的开发,让产品交付更快速,验证码功能就是其中一个. 一.跟其他第三方一样,我们开发之前要做一些准备工作. 1.首先,去官网注册一个帐号:http://www.bmob.cn/: 2.然后就可以创建应用了:具体怎么做Bmob说得很清楚了(官方操作介绍),如果你不想看,我简单说一下:点击右

  • SpringBoot实现短信验证码校验方法思路详解

    有关阿里云通信短信服务验证码的发送,请参考我的另一篇文章   Springboot实现阿里云通信短信服务有关短信验证码的发送功能 思路 用户输入手机号后,点击按钮获取验证码.并设置冷却时间,防止用户频繁点击. 后台生成验证码并发送到用户手机上,根据验证码.时间及一串自定义秘钥生成MD5值,并将时间也传回到前端. 用户输入验证码后,将验证码和时间传到后台.后台先用当前时间减去前台传过来的时间验证是否超时.如果没有超时,就用用户输入的验证码 + 时间 + 自定义秘钥生成MD5值与之前的MD5值比较,

  • 找出nginx配置文件的所在位置的方法详解

    对于一台陌生的服务器或安装太久忘了位置,怎么才能简单快速的找到配置文件的位置呢?要找出配置文件的位置,需要先找出nginx可执行文件的路径 , 这里有几种方法: 1.如果程序在运行中 ps -ef | grep nginx # ps -ef | grep nginx root 29514... 对于一台陌生的服务器或安装太久忘了位置,怎么才能简单快速的找到配置文件的位置呢? 要找出配置文件的位置,需要先找出nginx可执行文件的路径 , 这里有几种方法: 1.如果程序在运行中 ps -ef |

  • RabbitMQ延迟队列及消息延迟推送实现详解

    这篇文章主要介绍了RabbitMQ延迟队列及消息延迟推送实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 应用场景 目前常见的应用软件都有消息的延迟推送的影子,应用也极为广泛,例如: 淘宝七天自动确认收货.在我们签收商品后,物流系统会在七天后延时发送一个消息给支付系统,通知支付系统将款打给商家,这个过程持续七天,就是使用了消息中间件的延迟推送功能. 12306 购票支付确认页面.我们在选好票点击确定跳转的页面中往往都会有倒计时,代表着 3

  • Windows 下更改 jupyterlab 默认启动位置的教程详解

    起序:本文是在 python 自己的虚拟环境下做的,不是在 Anaconda 下做的. 一.安装 想要更改 jupyterlab 的默认启动位置,是不是得先安装 jupyterlab 呀,只需要在自己的 python 虚拟环境 中执行下面命令即可. pip install jupyterlab 二.执行 执行结束后,会在 C:\Users\用户名\.jupyter 目录下找到 jupyter_notebook_config.py. jupyter notebook --generate-conf

  • Android未读消息拖动气泡示例代码详解(附源码)

    前言 拖动清除未读消息可以说在很多应用中都很常见,也被用户广泛接受.本文是一个可以供参考的Demo,希望能有帮助. 提示:以下是本篇文章正文内容,下面案例可供参考 最终效果图及思路 实现关键: 气泡中间的两条边,分别是以ab,cd为数据点,G为控制点的贝塞尔曲线. 步骤: 绘制圆背景以及文本:连接情况绘制贝塞尔曲线:另外端点绘制一个圆 关键代码 1.定义,初始化等 状态:静止.连接.分离.消失 在onSizeChanged中初始化状态,固定气泡以及可动气泡的圆心 代码如下(示例): @Overr

随机推荐