12

我正在寻找一种将关闭按钮添加到类似于 NotifyIcon 的.NET ToolTip 对象的方法。我将工具提示用作使用 Show() 方法以编程方式调用的消息气球。这很好用,但没有 onclick 事件或关闭工具提示的简单方法。您必须在代码中的其他地方调用 Hide() 方法,我希望工具提示能够自行关闭。我知道网络上有几个气球工具提示,它们使用管理和非托管代码通过 Windows API 执行此操作,但我宁愿呆在我舒适的 .NET 世界中。我有一个调用我的 .NET 应用程序的第三方应用程序,它在尝试显示非托管工具提示时崩溃。

4

3 回答 3

4

您可以尝试通过覆盖现有的工具提示窗口并自定义 onDraw 函数来实现自己的工具提示窗口。我从未尝试过添加按钮,但之前使用工具提示进行了其他自定义。

    1    class MyToolTip : ToolTip
    2     {
    3         public MyToolTip()
    4         {
    5             this.OwnerDraw = true;
    6             this.Draw += new DrawToolTipEventHandler(OnDraw);
    7 
    8         }
    9 
   10         public MyToolTip(System.ComponentModel.IContainer Cont)
   11         {
   12             this.OwnerDraw = true;
   13             this.Draw += new DrawToolTipEventHandler(OnDraw);
   14         }
   15 
   16         private void OnDraw(object sender, DrawToolTipEventArgs e)
   17         {
                      ...Code Stuff...
   24         }
   25     }
于 2008-10-28T22:31:46.057 回答
3

您可以使用自己的设置 TTS_CLOSE 样式的 CreateParams 子类化 ToolTip 类:

private const int TTS_BALLOON = 0x80;
private const int TTS_CLOSE = 0x40;
protected override CreateParams CreateParams
{
    get
    {
       var cp = base.CreateParams;
       cp.Style = TTS_BALLOON | TTS_CLOSE;
       return cp;
    }
}

TTS_CLOSE 样式还需要TTS_BALLOON 样式,并且您还必须在工具提示上设置 ToolTipTitle 属性。

要使此样式生效,您需要使用应用程序清单启用 Common Controls v6 样式。

添加一个新的“应用程序清单文件”并在 <assembly> 元素下添加以下内容:

<dependency>
  <dependentAssembly>
    <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        processorArchitecture="*"
        publicKeyToken="6595b64144ccf1df"
        language="*"
      />
  </dependentAssembly>
</dependency> 

至少在 Visual Studio 2012 中,这些东西包含在默认模板中,但被注释掉了——你可以取消注释它。

带有关闭按钮的工具提示

于 2012-12-10T16:50:57.090 回答
2

您可以尝试在 ToolTip 类的实现中覆盖 CreateParams 方法...即

    protected override CreateParams CreateParams
    {
        get
        {
           CreateParams cp = base.CreateParams;
           cp.Style = 0x80 | 0x40; //TTS_BALLOON & TTS_CLOSE

           return cp;
        }
    }
于 2011-02-11T17:37:27.363 回答