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

简介: 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);
        }
    }
}

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();
目录
相关文章
|
2月前
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
155 2
|
15天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
61 13
|
3月前
|
SQL API 定位技术
基于C#使用winform技术的游戏平台的实现【C#课程设计】
本文介绍了基于C#使用WinForms技术开发的游戏平台项目,包括项目结构、运行截图、实现功能、部分代码说明、数据库设计和完整代码资源。项目涵盖了登录注册、个人信息修改、游戏商城列表查看、游戏管理、用户信息管理、数据分析等功能。代码示例包括ListView和ImageList的使用、图片上传、图表插件使用和SQL工具类封装,以及高德地图天气API的调用。
基于C#使用winform技术的游戏平台的实现【C#课程设计】
|
2月前
|
设计模式 程序员 C#
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
203 0
|
2月前
|
API C# Windows
【C#】在winform中如何实现嵌入第三方软件窗体
【C#】在winform中如何实现嵌入第三方软件窗体
132 0
|
2月前
|
XML 存储 安全
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
97 0
|
3月前
|
C# 容器
C#中的命名空间与程序集管理
在C#编程中,`命名空间`和`程序集`是组织代码的关键概念,有助于提高代码的可维护性和复用性。本文从基础入手,详细解释了命名空间的逻辑组织方式及其基本语法,展示了如何使用`using`指令访问其他命名空间中的类型,并提供了常见问题的解决方案。接着介绍了程序集这一.NET框架的基本单位,包括其创建、引用及高级特性如强名称和延迟加载等。通过具体示例,展示了如何创建和使用自定义程序集,并提出了针对版本不匹配和性能问题的有效策略。理解并善用这些概念,能显著提升开发效率和代码质量。
130 4
|
2月前
|
安全 API C#
C# 如何让程序后台进程不被Windows任务管理器强制结束
C# 如何让程序后台进程不被Windows任务管理器强制结束
72 0
|
3月前
|
Linux C# 开发者
Uno Platform 驱动的跨平台应用开发:从零开始的全方位资源指南与定制化学习路径规划,助您轻松上手并精通 C# 与 XAML 编程技巧,打造高效多端一致用户体验的移动与桌面应用程序
【9月更文挑战第8天】Uno Platform 的社区资源与学习路径推荐旨在为初学者和开发者提供全面指南,涵盖官方文档、GitHub 仓库及社区支持,助您掌握使用 C# 和 XAML 创建跨平台原生 UI 的技能。从官网入门教程到进阶技巧,再到活跃社区如 Discord,本指南带领您逐步深入了解 Uno Platform,并提供实用示例代码,帮助您在 Windows、iOS、Android、macOS、Linux 和 WebAssembly 等平台上高效开发。建议先熟悉 C# 和 XAML 基础,然后实践官方教程,研究 GitHub 示例项目,并积极参与社区讨论,不断提升技能。
111 2
|
1月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
35 3