C#实现Winform程序右下角弹窗消息提示

前言

消息通知在应用程序中,是一种非常有用的功能,实现对一些重要信息、提醒或警告及时向用户展示。我们在使用软件时,通常会收到一种从桌面右下角弹出的(提示信息或广告)信息框。本文将介绍使用 C# 实现此种方式的信息通知窗口。

实现

1、使用 API 的 AnimateWindow 函数

定义 AnimateWindows

using System;using System.Runtime.InteropServices;
namespace Fountain.WinForm.MessageBoxDemo{    public class Win32    {        /// <summary>        /// 自左向右显示窗口,该标记可以在迁移转变动画和滑动动画中应用。应用AW_CENTER标记时忽视该标记        /// </summary>        public const int AW_HOR_POSITIVE = 0x0001;        /// <summary>        /// 自右向左显示窗口,该标记可以在迁移转变动画和滑动动画中应用。应用AW_CENTER标记时忽视该标记        /// </summary>        public const int AW_HOR_NEGATIVE = 0x0002;        /// <summary>        /// 自顶向下显示窗口,该标记可以在迁移转变动画和滑动动画中应用。应用AW_CENTER标记时忽视该标记        /// </summary>        public const int AW_VER_POSITIVE = 0x0004;        /// <summary>        /// 自下向上显示窗口,该标记可以在迁移转变动画和滑动动画中应用。应用AW_CENTER标记时忽视该标记该标记        /// </summary>        public const int AW_VER_NEGATIVE = 0x0008;        /// <summary>        /// 若应用了AW_HIDE标记,则使窗口向内重叠;不然向外扩大        /// </summary>        public const int AW_CENTER = 0x0010;        /// <summary>        /// 隐蔽窗口        /// </summary>        public const int AW_HIDE = 0x10000;        /// <summary>        /// 激活窗口,在应用了AW_HIDE标记后不要应用这个标记        /// </summary>        public const int AW_ACTIVE = 0x20000;        /// <summary>        /// 滑动类型动画结果,默认为迁移转变动画类型,当应用AW_CENTER标记时,这个标记就被忽视        /// </summary>        public const int AW_SLIDE = 0x40000;        /// <summary>        /// 淡入淡出结果        /// </summary>        public const int AW_BLEND = 0x80000;        /// <summary>        /// 窗体动画函数        /// </summary>        /// <param name="hwnd"></param>        /// <param name="dwTime"></param>        /// <param name="dwFlags"></param>        /// <returns></returns>        [DllImport("user32")]        public static extern bool AnimateWindow(IntPtr hwnd, int dwTime, int dwFlags);    }}

定义显示消息窗体

using System;using System.Drawing;using System.Windows.Forms;
namespace Fountain.WinForm.MessageBoxDemo{    public partial class FormMessageBox : Form    {        /// <summary>        /// 关闭窗口的定时器        /// </summary>        private Timer formCloseTime = new Timer();        /// <summary>        /// 构造方法        /// </summary>        public FormMessageBox()        {            InitializeComponent();        }        /// <summary>        /// 窗体加载        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void FormMessageBox_Load(object sender, EventArgs e)        {            // 手动设置起始位置            this.StartPosition = FormStartPosition.Manual;            // 计算屏幕尺寸并将窗体放置在右下角            Rectangle screenRectangle = Screen.PrimaryScreen.WorkingArea;            int x = screenRectangle.Width - this.Width;            int y = screenRectangle.Height - this.Height;            this.Location = new Point(x, y);            this.TopMost = true;
            Win32.AnimateWindow(this.Handle, 1000, Win32.AW_SLIDE + Win32.AW_VER_NEGATIVE);
            this.ShowInTaskbar = false;
            formCloseTime.Interval = 5000;            formCloseTime.Tick += new EventHandler(formCloseTime_Tick);            formCloseTime.Start();        }        /// <summary>        /// 关闭窗口的定时器响应事件        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void formCloseTime_Tick(object sender, EventArgs e)        {            formCloseTime.Stop();            this.Close();        }        /// <summary>        ///         /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void FormMessageBox_FormClosed(object sender, FormClosedEventArgs e)        {            formCloseTime.Stop();            formCloseTime.Dispose();            Win32.AnimateWindow(this.Handle, 1000, Win32.AW_SLIDE + Win32.AW_VER_POSITIVE + Win32.AW_HIDE);        }    }}

主界面调用

FormMessageBox formMessageBox = new FormMessageBox();formMessageBox.Show();

2、控制窗体显示

定义显示消息窗体

using System;using System.Drawing;using System.Threading;using System.Windows.Forms;
namespace Fountain.WinForm.MessageBoxDemo{    public partial class FormNotifyBox : Form    {        /// <summary>        /// 关闭窗口的定时器        /// </summary>        private System.Windows.Forms.Timer formCloseTime = new System.Windows.Forms.Timer();        /// <summary>        ///         /// </summary>        private Point formPoint;        /// <summary>        ///         /// </summary>        public FormNotifyBox()        {            InitializeComponent();            this.formPoint = new Point(Screen.PrimaryScreen.WorkingArea.Width - this.Width, Screen.PrimaryScreen.WorkingArea.Height);            // 设置窗体在屏幕右下角显示            this.Location = formPoint;        }        /// <summary>        ///         /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void FormNotifyBox_Load(object sender, EventArgs e)        {            try            {                formCloseTime.Interval = 5000;                formCloseTime.Tick += new EventHandler(formCloseTime_Tick);                formCloseTime.Start();                this.TopMost = false;                this.BringToFront();                this.TopMost = true;                this.PointToClient(this.formPoint);                this.Location = this.formPoint;                this.Show();                for (int i = 0; i < this.Height; i++)                {                    this.Location = new Point(formPoint.X, formPoint.Y - i);                    // 消息框弹出速度,数值越大越慢                    Thread.Sleep(1);                }            }            catch (Exception exception)            {               }        }        /// <summary>        /// 关闭窗口的定时器响应事件        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void formCloseTime_Tick(object sender, EventArgs e)        {            formCloseTime.Enabled = false;            for (int i = 0; i <= this.Height; i++)            {                //弹出框向下移动消失                Point point = new Point(this.Location.X, this.Location.Y + i);                this.PointToScreen(point);                //即时转换成屏幕坐标                this.Location = point;                //下降速度调节,数字越小消失的速度越快,建议不大于10                Thread.Sleep(8);            }            this.Close();            this.Dispose();        }    }}

主界面调用

FormNotifyBox notifyForm = new FormNotifyBox();notifyForm.Show();

相关推荐

  1. C#实现Winform程序消息提示

    2024-07-10 10:10:02       29 阅读
  2. 微信小程序订阅消息授权事件

    2024-07-10 10:10:02       40 阅读
  3. C# 构建可定时关闭的异步提示

    2024-07-10 10:10:02       44 阅读
  4. 程序

    2024-07-10 10:10:02       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 10:10:02       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 10:10:02       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 10:10:02       90 阅读
  4. Python语言-面向对象

    2024-07-10 10:10:02       98 阅读

热门阅读

  1. 【PyTorch单点知识】自动求导机制的原理与实践

    2024-07-10 10:10:02       30 阅读
  2. 大数据平台之Hive Metastore

    2024-07-10 10:10:02       27 阅读
  3. 《框架封装 · Redis 事件监听》

    2024-07-10 10:10:02       29 阅读
  4. Knife4j的原理及应用详解(四)

    2024-07-10 10:10:02       33 阅读
  5. Stable Diffusion 深入浅出,一看就会

    2024-07-10 10:10:02       29 阅读
  6. Oracle 动态编译数据库对象

    2024-07-10 10:10:02       30 阅读
  7. 从“技术驱动”向“应用驱动”

    2024-07-10 10:10:02       36 阅读