C# 重写Notification提示窗口的示例代码

下面是详细讲解“C# 重写Notification提示窗口的示例代码”的完整攻略:

一、什么是Notification提示窗口

Notification提示窗口就是Windows操作系统的一个提示框,一般用于通知用户系统的一些状态变化或提示信息。它一般弹出在屏幕的右下角,显示一定的时间之后会自动消失。

二、怎样重写Notification提示窗口

要重写Notification提示窗口,需要用到Windows Forms中的NotifyIcon控件。这个控件可以在系统托盘中显示一个图标,同时支持弹出BalloonTip提示窗口。我们可以通过自定义BalloonTip窗口的样式和内容来实现重写Notification提示窗口的效果。

下面是一个简单的示例:

示例一

//创建一个NotifyIcon控件
private NotifyIcon notifyIcon1 = new NotifyIcon();

//设置NotifyIcon控件的属性
notifyIcon1.Icon = new Icon("MyIcon.ico");
notifyIcon1.Visible = true;

//注册NotifyIcon控件的BalloonTip显示事件
notifyIcon1.BalloonTipShown += NotifyIcon1_BalloonTipShown;

//注册NotifyIcon控件的BalloonTip关闭事件
notifyIcon1.BalloonTipClosed += NotifyIcon1_BalloonTipClosed;

//弹出一个自定义的BalloonTip提示窗口
private void ShowNotification(string message)
{
    notifyIcon1.BalloonTipTitle = "提示信息";
    notifyIcon1.BalloonTipText = message;
    notifyIcon1.BalloonTipIcon = ToolTipIcon.Info;
    notifyIcon1.ShowBalloonTip(3000);
}

//处理BalloonTip关闭事件
private void NotifyIcon1_BalloonTipClosed(object sender, EventArgs e)
{
    //TODO: BalloonTip关闭时需要执行的操作
}

//处理BalloonTip显示事件
private void NotifyIcon1_BalloonTipShown(object sender, EventArgs e)
{
    //TODO: BalloonTip显示时需要执行的操作
}

上面的代码中,我们首先创建了一个NotifyIcon控件,并设置了它的Icon和Visible属性。然后,我们注册了NotifyIcon控件的BalloonTipShown和BalloonTipClosed事件,用于处理BalloonTip提示窗口的显示和关闭。最后,我们实现了ShowNotification方法,用于弹出一个自定义的BalloonTip提示窗口。

示例二

接下来,我们再看一个稍微复杂一些的示例,该示例实现了一个带有多个按钮和文本框的BalloonTip提示窗口。

//创建一个NotifyIcon控件
private NotifyIcon notifyIcon1 = new NotifyIcon();

//设置NotifyIcon控件的属性
notifyIcon1.Icon = new Icon("MyIcon.ico");
notifyIcon1.Visible = true;

//注册NotifyIcon控件的BalloonTip显示事件
notifyIcon1.BalloonTipShown += NotifyIcon1_BalloonTipShown;

//注册NotifyIcon控件的BalloonTip关闭事件
notifyIcon1.BalloonTipClosed += NotifyIcon1_BalloonTipClosed;

//弹出一个自定义的BalloonTip提示窗口
private void ShowCustomNotification(string message)
{
    //创建BalloonTip的容器控件
    var container = new Panel();
    container.BackColor = Color.White;

    //创建BalloonTip的文本框
    var textBox = new TextBox();
    textBox.Multiline = true;
    textBox.ReadOnly = true;
    textBox.Text = message;
    textBox.Dock = DockStyle.Top;
    container.Controls.Add(textBox);

    //创建BalloonTip的按钮
    var btnOK = new Button();
    btnOK.Text = "确定";
    btnOK.Dock = DockStyle.Right;
    container.Controls.Add(btnOK);

    var btnCancel = new Button();
    btnCancel.Text = "取消";
    btnCancel.Dock = DockStyle.Right;
    container.Controls.Add(btnCancel);

    //创建BalloonTip
    var balloonTip = new CustomBalloonTip(notifyIcon1);
    balloonTip.AutoClose = false;
    balloonTip.Size = container.PreferredSize;
    balloonTip.Controls.Add(container);

    //显示BalloonTip
    balloonTip.Show(5000);
}

//处理BalloonTip关闭事件
private void NotifyIcon1_BalloonTipClosed(object sender, EventArgs e)
{
    //TODO: BalloonTip关闭时需要执行的操作
}

//处理BalloonTip显示事件
private void NotifyIcon1_BalloonTipShown(object sender, EventArgs e)
{
    //TODO: BalloonTip显示时需要执行的操作
}

//自定义的BalloonTip控件
public class CustomBalloonTip : ToolTip
{
    private const int CS_DROPSHADOW = 0x20000;

    private Control _owner;

    public CustomBalloonTip(Control owner)
    {
        _owner = owner;

        //设置BalloonTip的样式
        this.UseFading = true;
        this.UseAnimation = true;
        this.IsBalloon = true;
        this.ShowAlways = true;

        //去掉BalloonTip的阴影
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle(ControlStyles.UserPaint, true);
        this.SetStyle(ControlStyles.DoubleBuffer, true);

        //将BalloonTip的样式设为WS_EX_TOOLWINDOW
        int exStyle = (int)Win32API.GetWindowLong(this.Handle, Win32API.GWL_EXSTYLE);
        exStyle |= (int)Win32API_WS_EX.WS_EX_TOOLWINDOW;
        Win32API.SetWindowLong(this.Handle, Win32API.GWL_EXSTYLE, (IntPtr)exStyle);
    }

    protected override void CreateHandle()
    {
        base.CreateHandle();
        Win32API.SetWindowPos(this.Handle, Win32API.HWND_TOPMOST, 0, 0, 0, 0,
            Win32API.SWP_NOMOVE | Win32API.SWP_NOSIZE | Win32API.SWP_NOACTIVATE);
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= CS_DROPSHADOW;
            return cp;
        }
    }

    protected override void OnPopup(System.EventArgs e)
    {
        base.OnPopup(e);
        this.UpdateOwner();
    }

    protected override void OnDraw(System.Windows.Forms.DrawToolTipEventArgs e)
    {
        e.DrawBackground();
        e.DrawBorder();
        e.DrawText(TextFormatFlags.TextBoxControl | TextFormatFlags.LeftAndRightPadding);
    }

    private void UpdateOwner()
    {
        if (_owner != null && this.Visible)
        {
            //获取BalloonTip的位置和大小
            Rectangle rect = this.Bounds;
            rect.X = _owner.PointToScreen(Point.Empty).X - rect.Width / 2;
            rect.Y = _owner.PointToScreen(Point.Empty).Y - rect.Height - 10;

            //更新BalloonTip的位置
            Win32API.SetWindowPos(this.Handle, Win32API.HWND_TOPMOST, rect.X, rect.Y,
                rect.Width, rect.Height, Win32API.SWP_NOACTIVATE);
        }
    }
}

public class Win32API
{
    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);

    [DllImport("user32.dll")]
    public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);

    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

    public const int WS_EX_TOOLWINDOW = 0x80;
    public const int GWL_EXSTYLE = -20;
    public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
    public const int SWP_NOSIZE = 0x0001;
    public const int SWP_NOMOVE = 0x0002;
    public const int SWP_NOACTIVATE = 0x0010;
}

public enum Win32API_WS_EX : int
{
    WS_EX_LAYERED = 0x00080000,
    WS_EX_TRANSPARENT = 0x00000020,
    WS_EX_TOOLWINDOW = 0x80,
}

这个示例中,我们首先创建了一个NotifyIcon控件,并设置了它的Icon和Visible属性。然后,我们注册了NotifyIcon控件的BalloonTipShown和BalloonTipClosed事件,用于处理BalloonTip提示窗口的显示和关闭。接着,我们实现了ShowCustomNotification方法,用于弹出一个自定义的BalloonTip提示窗口。

在ShowCustomNotification方法中,我们首先创建了一个Panel控件,用于作为BalloonTip的容器。然后,我们在容器中添加了一个文本框和两个按钮,用于显示提示信息和完成一些操作。接着,我们创建了一个自定义的BalloonTip控件,设置它的样式和大小,并将容器添加到它的Controls集合中。最后,我们调用了BalloonTip的Show方法,显示这个自定义的BalloonTip提示窗口。

在CustomBalloonTip中,我们重写了一些方法,用于自定义BalloonTip的样式和位置。其中,CreateHandle方法用于设置BalloonTip的句柄为最顶层窗口,并将BalloonTip的样式设为WS_EX_TOOLWINDOW;CreateParams属性用于设置BalloonTip的ExStyle,使之显示阴影;OnPopup方法用于在BalloonTip显示时更新BalloonTip的位置;OnDraw方法用于绘制BalloonTip的边框和文本;UpdateOwner方法用于更新BalloonTip的位置,使之显示在NotifyIcon控件的下方。

好了,以上就是关于“C# 重写Notification提示窗口的示例代码”的完整攻略了。希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 重写Notification提示窗口的示例代码 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • .NET core项目AsyncLocal在链路追踪中的应用

    .NET Core 项目 AsyncLocal 在链路追踪中的应用 在 .NET Core 项目中,AsyncLocal 是一个非常有用的工具,它可以帮助我们在异步调用链路中传递上下文信息。本攻略将详细介绍如何在 .NET Core 项目中使用 AsyncLocal 实现链路追踪。 AsyncLocal 的作用 在 .NET Core 项目中,AsyncLo…

    C# 2023年5月16日
    00
  • .Net创建型设计模式之工厂方法模式(Factory Method)

    .Net创建型设计模式之工厂方法模式(Factory Method) 工厂方法模式是一种常用的创建型设计模式。该模式通过定义一个抽象工厂方法来把实例的创建延迟到其子类。工厂方法模式中,客户端调用创建对象时只需使用工厂方法,而无需关心具体的对象是如何创建的。这样就可以将客户端代码与具体对象的创建和组装过程解耦。 使用场景 工厂方法模式适用于需要大量创建对象的场…

    C# 2023年5月31日
    00
  • C#9.0主要特性的一些想法

    C# 9.0主要特性的一些想法 C# 9.0是Microsoft发布的最新版本的C#语言。本文将重点讲解C# 9.0的主要特性,包括以下内容: 改进模式匹配 新的init-only属性 支持 Lambda 计算式中的 Discards 函数成员中现在可以包含参数 null 性 注释 函数和 ltc 参数中支持 调用链 改进模式匹配 模式匹配是C#的一个非常强…

    C# 2023年6月1日
    00
  • C#开发Winform实现学生管理系统

    C#开发Winform实现学生管理系统 目录 准备工作 创建新项目 创建数据库 绘制界面 编写代码 示例说明1:添加学生信息 示例说明2:查询学生信息 准备工作 在开始开发学生管理系统之前,我们需要先准备好以下工具: Visual Studio 2019:用于编写C#程序 SQL Server 2019:用于创建和管理数据库 SQL Server Manag…

    C# 2023年5月31日
    00
  • C# Linq读取XML文件的实例

    下面是关于” C# Linq 读取 XML 文件的实例”的攻略,包括示例说明。 1. 准备工作 安装 .NET Framework 创建一个 C# 控制台程序 2. 创建 XML 文件 我们首先需要创建一个 XML 文件,这里我们以一个字符串列表为例,创建一个名为 “test.xml” 的 XML 文件,代码如下: <?xml version=&quo…

    C# 2023年6月1日
    00
  • CPF 使用C#的Native AOT 发布程序的详细过程

    下面我将为你详细讲解如何使用C#的Native AOT发布程序。我们可以分为以下几个步骤来完成该过程: 安装必要的工具和组件 编写C#代码,确保它可以编译 使用AOT(Ahead Of Time)编译器生成本机代码 打包本机代码和必要的依赖文件 测试和发布应用程序 接下来,我将提交示例,以更好地演示这个过程。 步骤一:安装必要的工具和组件 首先,我们需要在开…

    C# 2023年5月15日
    00
  • C#中值类型和引用类型解析

    C#中值类型和引用类型解析 值类型和引用类型的区别 在C#中,类型分为值类型和引用类型两种。值类型存储的是实际的值,引用类型存储的是该值在内存中的地址。 在调用方法时,对于值类型的参数,传递的是实际的值,而对于引用类型的参数,则传递的是该值在内存中的地址。这就导致了在对参数值进行修改时的不同表现。 对于值类型的参数,当对其进行修改时,实际上是在方法内部对其副…

    C# 2023年5月15日
    00
  • Entity Framework中执行sql语句

    当使用Entity Framework框架时,可以通过执行SQL语句来访问数据。而执行SQL语句最基本的方式就是通过DbContext.Database属性实现,它提供了ExecuteSqlCommand方法。下面是详细的攻略: 1. 执行SQL查询 1.1 执行SELECT语句并返回结果 可以通过ExecuteSqlCommand方法执行查询语句,如下所示…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部