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();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/869491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统|day1.了解操作系统

文章目录 了解操作系统定义目的操作系统体系结构功能特征操作系统的区别(64位与32位)操作系统的地址内存管理缓存 了解操作系统 定义 操作系统是控制管理计算机系统的硬软件,分配调度资源的系统软件 目的 方便性,有效性(提高系统资源的利用率,提高系统的吞吐量) 操作系统体…

WEB安全:网络安全常用术语

一、攻击类别 漏洞&#xff1a;硬件、软件、协议&#xff0c;代码层次的缺陷。 后⻔&#xff1a;方便后续进行系统留下的隐蔽后⻔程序。 病毒&#xff1a;一种可以自我复制并传播&#xff0c;感染计算机和网络系统的恶意软件(Malware)&#xff0c;它能损害数据、系统功能或拦…

C++ //练习 14.49 为上一题提到的类定义一个转换目标是bool的类型转换运算符,先不用在意这么做是否应该。

C Primer&#xff08;第5版&#xff09; 练习 14.49 练习 14.49 为上一题提到的类定义一个转换目标是bool的类型转换运算符&#xff0c;先不用在意这么做是否应该。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 class Date{…

RAG的学习与实践——LangChain和LlamaIndex学习笔记

RAG RAG(Retrieval Augmented Generation)系统&#xff0c;代表“检索增强生成”。RAG由五个关键步骤组成&#xff1a; 加载&#xff1a;这是指将数据从其所在位置&#xff08;无论是文本文件、PDF、其他网站、数据库还是 API&#xff09;获取到您的管道中。LlamaHub提供数百…

OpenCV4 ——fatal error: opencv2/opencv.hpp: No such file or directory

fatal error: opencv2/opencv.hpp: No such file or directory #include <opencv2/opencv.hpp> 解决方案 这是因为opencv头文件的路径中多了一个opencv4的文件夹&#xff1a;/usr/include/opencv4/opencv2&#xff0c; 可以将opencv2拷贝到自己的include文件夹。 xxx:…

Jetson-AGX-Orin离线安装nvidia-jetpack

Jetson-AGX-Orin 离线安装nvidia-jetpack 1、制作离线nvidia-jetpack包 1.1、准备一台Jetson-AGX-Orin&#xff0c;烧录不带nvidia-jetpack的系统。 最好待离线安装jetpack的Orin系统是基于此系统扩展或者制作的。即烧录的系统为出厂系统。 1.2、将这台Jetson-AGX-Orin连上…

【Swiper】轮播图 笔记

文章目录 场景代码&#xff08;6.8.4&#xff09;代码&#xff08;11.1.4&#xff09; 场景 官网&#xff1a;Swiper - 最现代的移动触控滑块 - Swiper 中文 最近用svelte写轮播图&#xff0c;用了Swiper组件。需求是&#xff1a;一共三张图&#xff0c;来回切&#xff0c;保…

基于YOLOv8深度学习的CT扫描图像肾结石智能检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

comsol达西定律的小例子

comsol达西定律的小例子

【深度学习基础】环境搭建 Linux报错bash: conda: command not found...

目录 一、 问题描述二、 解决方法1. 在.bashrc文件中添加环境变量2. 卸载重装anconda 三、总结 一、 问题描述 在linux环境下安装anaconda时候报错&#xff1a;bash: conda: command not found… 二、 解决方法 1. 在.bashrc文件中添加环境变量 参考链接&#xff1a;【解决】…

Java锁升级详解:从偏向锁到重量级锁的演进

简介 在Java并发编程中&#xff0c;synchronized关键字是实现线程同步的一种常见机制。从JDK 1.6开始&#xff0c;为了提高性能&#xff0c;Java虚拟机&#xff08;JVM&#xff09;对synchronized进行了优化&#xff0c;引入了锁升级的概念。锁升级包括从无锁状态到偏向锁、轻…

同步与异步:.NET 中的 Task.WaitAll 和 Task.WhenAll

在 C# 中&#xff0c;异步编程通常涉及同时运行多个任务。处理多个任务的两种常见方法是 Task.WaitAll 和 Task.WhenAll。虽然它们看起来很相似&#xff0c;但它们的用途不同&#xff0c;并且用于不同的场景。本文探讨了 Task.WaitAll 和 Task.WhenAll 之间的区别&#xff0c;并…

C++ 字符串哈希(hush)讲解

文章目录 什么是哈希&#xff08;hash&#xff09;哈希原理实现过程其他练习 什么是哈希&#xff08;hash&#xff09; 哈希&#xff0c;又称 hash&#xff0c;它是密码学的基础&#xff0c;理解哈希是理解数字签名和加密通信等技术的必要前提。 在 C 中&#xff0c;哈希通常…

Centos搭建FTP

FTP搭建 安装vsftpd #安装vsftpd yum install vsftpd -y systemctl start vsftpd systemctl enable vsftpd systemctl restart vsftpd创建测试用户 #创建测试用户 useradd -d /home/ftptest -g ftp -s /sbin/false ftptest passwd ftptest #admin12#$.. echo "/sbin/fa…

【单片机毕业设计选题24054】-基于STM32的水质检测系统

系统功能: 主要功能模块原理图: 电源时钟烧录接口: 单片机和按键输入电路: 传感器采集电路&#xff1a; 资料获取地址 系统主要功能模块代码 初始化代码: /* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration-----------------------------------------------…

SpringSecurity(Authorization Events)

Authorization Events 对于每个被拒绝的授权&#xff0c;都会激发一个 AuthorizationDeniedEvent。此外&#xff0c;还可以为授予的授权激发 AuthorizationGrantedEvent。 若要侦听这些事件&#xff0c;必须首先发布 AuthorizationEventPublisher。 Spring Security 的 Spri…

编译Linux内核, 制作迷你系统并在虚拟机里运行(2)

编译制作环境&#xff1a;ubuntu20.0.4 一&#xff0c;参考文档 Linux 系统裁剪--制作一个最小化的Linux iso镜像 https://blog.csdn.net/alfiy/article/details/122568957 按照上述文档的步骤&#xff0c;制作的iso启动不了&#xff0c;经过多次尝试&#xff0c;发现生成的…

【Go - 常见的5类函数用法】

函数 函数通过func关键字定义&#xff0c;后跟函数名、参数列表、返回类型。语法如下&#xff1a; func functionName(parameters) returnType {// 函数体 }示例 func add(x int, y int) int {return x y }func swap(x, y string) (string, string) {return y, x }变参函数…

电脑虚拟摄像头怎么使用?电脑摄像头可以被虚拟摄像头替代吗?8款推荐!

在数字化日益普及的今天&#xff0c;视频通话和在线会议已成为我们生活和工作中不可或缺的一部分。然而&#xff0c;当我们的电脑没有配备摄像头&#xff0c;或摄像头出现故障时&#xff0c;我们可能会面临一些不便。这时&#xff0c;电脑虚拟摄像头便成为了一个实用的解决方案…

C# 策略模式(Strategy Pattern)

策略模式定义了一系列的算法&#xff0c;并将每一个算法封装起来&#xff0c;使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。 // 策略接口 public interface IStrategy { void Execute(); } // 具体策略A public class ConcreteStrategyA : IStra…