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日

相关文章

  • 利用C#实现最基本的小说爬虫示例代码

    以下是利用C#实现最基本的小说爬虫示例代码的完整攻略: 1. 爬虫工具的选择 爬取小说需要借助爬虫工具,此处选择C#语言中一个开源的爬虫框架——HtmlAgilityPack,它能够以DOM的方式来解析HTML文档。 2. 分析小说网站的HTML结构 在编写爬虫前需要对小说网站的HTML结构进行分析,确定目标数据的XPath表达式。 以某小说网站为例,网站每…

    C# 2023年5月31日
    00
  • C# 语言入门基础介绍

    C# 语言入门基础介绍 什么是 C# C# 是一种面向对象的编程语言,由 Microsoft 公司开发。它是 .NET 框架的一部分,可以用来开发各种类型的应用程序,例如桌面应用程序、Web 应用程序、移动应用程序等。 C# 语言和 Java 语言非常相似,都是基于面向对象的编程范式,具有相同的语法规则和编程思想。因此,如果您已经熟悉 Java 语言,那么学…

    C# 2023年5月15日
    00
  • 浅析C#中静态方法和非静态方法的区别

    接下来我将为您详细讲解“浅析C#中静态方法和非静态方法的区别”。 什么是C#中的静态方法和非静态方法 在C#中,静态方法和非静态方法是常见的两种方法类型。静态方法是指在类中定义的方法,该方法不需要实例化该类的对象就可以直接调用。而非静态方法则是需要实例化对象后才能被调用的方法。 具体来说,静态方法是使用 static 关键字定义的方法,而非静态方法则不使用 …

    C# 2023年6月7日
    00
  • 如何使用C#操作幻灯片

    如何使用C#操作幻灯片 操作幻灯片涉及到的主要对象有幻灯片(Presentation)、幻灯片文档(Slide)和幻灯片放映(PresentationSlideShow)。在C#中,可以通过Microsoft.Office.Interop.PowerPoint命名空间下的对象来对幻灯片进行操作。 以下是使用C#操作幻灯片的详细攻略: 步骤1:启用Office…

    C# 2023年6月6日
    00
  • C#自定义IP输入框控件

    那么下面我们来详细讲解一下如何实现C#自定义IP输入框控件。 1. 需求分析 我们需要自定义一个IP地址输入框控件,要求用户可以在文本框中输入0~255之间的数字,并以“.”分隔开4段,组成一个完整的IP地址。 2. 控件的设计 我们设计的自定义IP输入框控件,需要包含以下属性和方法: 属性: IPAddr:获取或设置IP地址的值。 方法: CreatePa…

    C# 2023年5月15日
    00
  • C#中把日志导出到txt文本的简单实例

    C#中把日志导出到txt文本的简单实例,可以分为以下几步: 1. 引入System.IO命名空间 首先,在程序的顶部引入System.IO命名空间,即: using System.IO; 2. 创建txt文件,并写入日志内容 接着,在程序中创建txt文件,并将日志内容写入该文件中。下面是一个示例: string logFilePath = @"D:…

    C# 2023年6月1日
    00
  • C# ref and out的使用小结

    下面是关于“C# ref 和 out 的使用小结”的详细讲解: 什么是 ref 和 out ref 和 out 是 C# 中用于传递参数的关键字。它们可以让一个方法修改传递给它的参数,并把修改后的值返回给调用者。 ref 和 out 两者非常相似,唯一的区别在于: ref:传入的参数必须是已经初始化了的变量。 out:传入的参数可以是未初始化的变量。 ref…

    C# 2023年5月15日
    00
  • 一文带你了解C#中的协变与逆变

    一文带你了解C#中的协变与逆变 什么是协变与逆变 在程序设计中,经常需要对类进行继承和实现接口的操作。在这样的过程中,我们通常会遇到这样的问题:子类或者实现接口的类的泛型参数类型和父类的泛型参数类型不匹配。而“协变”和“逆变”就是解决这样的问题的方法。 协变和逆变是 C# 4.0 引入的两个关键技术,可以让我们更加灵活地使用泛型。在 C# 中,协变和逆变可以…

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