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

yizhihongxing

下面是详细讲解“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日

相关文章

  • 读写XML文件的内容并将其显示在ListView控件上的方法

    读写XML文件并将其显示在ListView控件上是一个常见的任务。以下是一些步骤,可以指导你完成这个任务: 第一步:创建XML文件 首先,需要创建一个XML文件,并在其中添加所需的数据。XML文件是一种可扩展标记语言,用于存储结构化数据。它的语法类似于HTML,但XML的重点是数据,而不是展示。以下是一个简单的XML示例: <?xml version=…

    C# 2023年6月7日
    00
  • C#中的委托和事件

    委托和事件的概念说明: 委托是一种类型,代表可以指向具有特定参数列表和返回类型的方法的引用,可以使方法的参数自由变化,可以做到比直接调用方法更灵活。 事件是一种特殊的委托,被用于实现发布者/订阅者模式,通过事件的注册和触发可以完成对象间的通信。 委托的声明和使用: 声明委托的语法:delegate returnType DelegateName(parame…

    C# 2023年5月15日
    00
  • C# 7.0 使用下划线忽略使用的变量的原因分析

    C#7.0使用下划线忽略使用的变量的原因分析 在C#7.0中,我们可以使用一个特殊的下划线符号(_)来忽略我们不需要使用的变量,这在代码中并不会引起编译器的警告或错误提示,那么为什么需要使用这个符号,本文将对此进行详细讲解。 忽略变量的原因 在我们的应用程序和代码中,常常会出现我们所不需要的变量、返回值或者方法参数,但在某种情况下,我们又不得不使用这些变量或…

    C# 2023年5月15日
    00
  • c# BackgroundWorker使用方法

    c# BackgroundWorker使用方法攻略 背景介绍 使用C#编写程序时,如果需要完成一些比较费时的操作,例如读写文件、网络传输等,这些操作会阻塞UI线程,使得UI无响应,影响用户体验。因此,我们需要使用多线程来完成这些操作,使得UI线程不受阻塞,从而保证程序的流畅性和高效性。 而在多线程编程中,我们经常会使用C#自带的BackgroundWorke…

    C# 2023年5月15日
    00
  • 将Datatable转化成json发送前台实现思路

    将Datatable转化成json并发送到前端页面,通常可以分为以下几个步骤: 引入必要的库文件 在使用Datatable转化成json时,需要使用到jQuery库和Datatable插件,所以需要在页面中引入这两个文件。 <!– 引入jQuery库 –> <script src="https://cdn.bootcss.co…

    C# 2023年5月31日
    00
  • ASP.NET中Label控件用法详解

    下面是关于“ASP.NET中Label控件用法详解”的详细攻略。 什么是Label控件 Label控件是 ASP.NET中常用的一种控件,用来显示纯文本信息或者富文本信息,可以用来在Web应用中显示静态文本内容,如标题、说明等。 Label控件的用法详解 1. 创建Label控件 Label控件可以通过在ASPX文件中直接使用HTML标记来创建,也可以在后端…

    C# 2023年6月3日
    00
  • C#读取QQ纯真IP数据库QQWry.Dat的代码

    下面是详细的攻略。 1. 下载QQ纯真IP数据库QQWry.Dat 首先,我们需要先下载QQ纯真IP数据库QQWry.Dat,可以从官网下载(http://www.cz88.net/),也可以搜索下载链接。 2. 使用C#读取QQ纯真IP数据库 读取QQ纯真IP数据库QQWry.Dat,我们需要用到二进制读取和文件指针的知识。以下是读取QQWry.Dat的代…

    C# 2023年6月2日
    00
  • .netcore+vue 实现压缩文件下载功能

    .NET Core + Vue 实现压缩文件下载功能 在本攻略中,我们将详细讲解如何使用.NET Core和Vue.js实现压缩文件下载功能,并提供两个示例说明。 压缩文件下载功能简介 压缩文件下载功能是指将多个文件打包成一个压缩文件,并提供下载链接,用户可以通过该链接下载压缩文件。该功能通常用于批量下载文件,可以提高用户体验和下载效率。 实现压缩文件下载功…

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