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();
相关文章:
C#实现Winform程序右下角弹窗消息提示
前言 消息通知在应用程序中,是一种非常有用的功能,实现对一些重要信息、提醒或警告及时向用户展示。我们在使用软件时,通常会收到一种从桌面右下角弹出的(提示信息或广告)信息框。本文将介绍使用 C# 实现此种方式的信息…...
Java三剑客:封装、继承、多态的魔法世界
第一章:封装的艺术 —— 保护你的宝藏 案例分析:银行账户系统 想象一下,你正在构建一个银行账户系统。每个账户都有一个余额,这个余额需要受到严格的保护,不能被随意修改。我们可以通过封装来实现这一目标。 示例代…...
0145__Linux的capability
https://zhuanlan.zhihu.com/p/693896673 Linux的capability深入分析(1)_linux 设置进程capprm-CSDN博客 cap_init(3) - Linux manual page...

# Redis 入门到精通(一)数据类型(4)
Redis 入门到精通(一)数据类型(4) 一、redis 数据类型–sorted_set实现时效性任务管理 1、sorted_set 类型数据操作的注意事项 score 保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992…...

西邮计科嵌入式复习
西邮嵌入式复习 一、第一章复习二、第二章复习三、第三章复习四、第四章复习 一、第一章复习 二、第二章复习 三、第三章复习 四、第四章复习...
Java如何使用 HttpClientUtils 发起 HTTP 请求
Java如何使用 HttpClientUtils 发起 HTTP 请求 一、前言1.HttpClientUtils 类概览2.解析 HttpClientUtils 类3.使用 HttpClientUtils 类 一、前言 在现代的软件开发中,经常需要与远程服务器进行通信,例如获取数据或发送数据。Apache HttpClient 是一个流…...
无人机的工作原理
无人飞行器(UAV,即Unmanned Aerial Vehicle)的工作原理涉及多个复杂的系统和技术。以下是对各个系统和技术的详细介绍: 1. 飞行控制系统(FCS) 飞行控制系统是无人机的“大脑”,负责监控和调整…...

敏捷开发笔记(第10章节)--Liskov原则(LSP)
目录 1:PDF上传链接 10.1 Liskov替换原则(LSP) 10.2 一个违反LSP的简单例子 10.6 启发式规则和习惯用法 10.7 结论 1:PDF上传链接 【免费】敏捷软件开发(原则模式与实践)资源-CSDN文库 OCP背后的主要机制是抽象(abstraction…...

基于SSM的校园一卡通管理系统的设计与实现
摘 要 本报告全方位、深层次地阐述了校园一卡通管理系统从构思到落地的整个设计与实现历程。此系统凭借前沿的 SSM(Spring、Spring MVC、MyBatis)框架精心打造而成,旨在为学校构建一个兼具高效性、便利性与智能化的一卡通管理服务平台。 该系…...

新版Android Studio中设置gradle的JDK版本
旧版android studio 在旧版(具体哪个版本号之前搞不清了)中设置JDK版本在>File——>Project Structure——>SDK location——>Gradle Setting——>Gradle SDK 新版android studio 某次更新后发现SDK location下找不到Gradle Setting选项…...

打造你的智能家居指挥中心:基于STM32的多协议(zigbee、http)网关(附代码示例)
1. 项目概述 随着物联网技术的蓬勃发展,智能家居正逐步融入人们的日常生活。然而,市面上琳琅满目的智能家居设备通常采用不同的通信协议,导致不同品牌设备之间难以实现互联互通。为了解决这一难题,本文设计了一种基于STM32的多协…...

【基于R语言群体遗传学】-16-中性检验Tajima‘s D及连锁不平衡 linkage disequilibrium (LD)
Tajimas D Test 已经开发了几种中性检验,用于识别模型假设的潜在偏差。在这里,我们将说明一种有影响力的中性检验,即Tajimas D(Tajima 1989)。Tajimas D通过比较数据集中的两个𝜃 4N𝜇估计值来…...

防火墙组网与安全策略实验
实验要求: 实现: 防火墙接口配置: 所有接口均配置为三层接口 由于G1/0/3口下为vlan环境,所以防火墙需要配置子接口 : 交换机划分vlan分开生产区和办公区、配置trunk干道 : 安全策略: 生产区访…...

xmind梳理测试点,根据这些测试点去写测试用例
基本流(冒烟用例必写) 备选流 公共测试点:...

MICCAI 2024 每日一篇论文 纯纯直读 CUTS:用于多粒度无监督医学图像分割的深度学习和拓扑框架
MICCAI 2024 CUTS: A Deep Learning and Topological Framework for Multigranular Unsupervised Medical Image Segmentation CUTS: 用于多粒度无监督医学图像分割的深度学习和拓扑框架 作者 陈璐1*、Matthew Amodio1*、梁博伦.沈2、冯高3、阿曼阿维斯塔4、Sanjay Aneja3,5…...

实验9 存储过程与函数的创建管理实验
一、实验目的: 理解存储过程和函数的概念。掌握创建存储过程和函数的方法。掌握执行存储过程和函数的方法。掌握游标的定义、使用方法。 二、实验内容 1.某超市的食品管理的数据库的Food表,Food表的定义如表所示, Food表的定义…...

计算机网络--tcpdump和iptable设置、内核参数优化策略
tcpdump工具 tcpdump命令: 选项字段: 过滤表达式: 实用命令: TCP三次握手抓包命令: #客户端执行tcpdump 抓取数据包 tcpdump -i etho tcp and host 192.168.12.36 and port 80 -W timeout.pcapnetstat命令 netst…...
Vue3框架搭建2:axios+typescript封装
仓库地址:https://github.com/buguniao5213/LuArch 1、安装axios npm install axios2、创建文件 先创建一个文件夹: ├── src/ │ ├── api/ │ │ ├── index.ts/ #编写axios封装代码 │ │ └── example.ts/ #定义…...

【机器学习】使用决策树分类器预测汽车安全性的研究与分析
文章目录 一、决策树算法简介决策树的结构分类和回归树 (CART)决策树算法术语决策树算法直觉 二、属性选择度量信息增益熵 基尼指数计算分割基尼指数的步骤 三、决策树算法中的过度拟合避免过度拟合的方法 四、导入库和数据可视化探索性数据分析重命名列名查看数据集的总结信息…...

【香橙派 Orange pi AIpro】| 开发板深入使用体验
目录 一. 🦁 写在前面二. 🦁 愉快的安装流程2.1 安装前准备2.2 流程准备2.2.1 烧录镜像2.2.2 开机2.2.3 连网2.2.4 SSH远程连接开发板 2.3 体验 AI 应用样例 三. 🦁 写在最后 一. 🦁 写在前面 大家好,我是狮子呀&…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...