【发布时间】:2018-07-26 12:30:12
【问题描述】:
我正在开发这个小型 WinForm 应用程序,并决定使用具有半透明背景的自定义绘制工具提示。所以我开始将 ToolTip 上的OwnerDraw 属性设置为True,为Draw 和Popup 事件创建了事件处理程序(参见下面的示例代码。注释版本也不起作用)。
private void toolTip_Popup(object sender, PopupEventArgs e)
{
e.ToolTipSize = new Size(400, 400);
}
private void toolTip_Draw(object sender, DrawToolTipEventArgs e)
{
//e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(120, Color.Red)), new Rectangle(e.Bounds.Location, e.Bounds.Size));
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(120, Color.Red)), new Rectangle(0, 0, 400, 400));
}
现在,当工具提示第一次显示特定控件时,一切都会按预期工作。见下图(400x400 工具提示,半透明红色背景)。
但是当我第二次将鼠标悬停在同一个控件上时,工具提示会失去其半透明性。见下图。为什么会这样?
【问题讨论】:
-
ToolTip 本身不支持透明效果。你可以伪造它,使用 Graphics.CopyFromScreen() 在 Popup 中制作屏幕截图。在 Draw 中,首先绘制该位图,使其看起来透明,然后在其顶部绘制尖端。您的应用需要具备 dpiAware 功能,才能在任何显示器上顺利完成。
-
好的,但是为什么它在第一次用于特定控件时可以显示透明背景?
-
@HansPassant 我不确定你是否理解我的问题。图片是来自 WinForm 应用程序的屏幕截图(它们不是在某些 SW 中组成的,这就是我想要的效果)。 TooTtip 的半透明背景正在工作,问题是它只显示了一次半透明背景(第一次为控件显示 ToolTip)。
-
它不会失去其半透明性,它会在您的半红色下方绘制黑色背景。如果您在第二张图片中看到颜色不是红色,而是深红色。
-
你可以做的是构建一个派生自
ToolTip的类(利用它的鼠标驱动/定时器驱动的事件系统,中止Popup事件的工具提示(你必须订阅,您不能覆盖它),并在您可以从提供的e.AssociatedControl派生的位置显示半透明标签(或类似控件),并将替代控件移动到e.AssociatedControl@ 的计算位置987654334@. 其他路径,IMO,令人沮丧。