1

我通过响应 Draw 事件来自定义 WinForms ToolTip 控件的外观。我只希望工具提示的某些角是圆角的。我已经完成了所有工作,以至于第一次显示工具提示时,一切看起来都很完美。然而,在随后的显示中,圆角矩形的未填充区域继续具有第一次显示工具提示时背景中的内容。

问题的屏幕截图(我显然无权内联): http ://tinypic.com/r/30xa3w9/3

在图片中,您可以在左上角看到剩余的伪影,我希望它只是透明的(显示灰色背景),如下所示:

tinypic.com/r/mvn8eo/3(也没有添加多个链接的权利)

下面是绘图代码:

private void ToolTip_Draw(object sender, DrawToolTipEventArgs args)
{
    args.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
    var rect = new RectangleF(0, 0, args.Bounds.Width, args.Bounds.Height);
    using (var backBrush = new LinearGradientBrush(rect, Color.Silver, this.BackColor, 90))
    {
        using (var path = GetRoundedRectangle(rect, 10, 4, 4, 1))
        {
            args.Graphics.FillPath(backBrush, path);
            args.DrawText();
        }
    }
}

GetRoundedRectangle 函数(不包括在内)只是为我想要的圆角几何计算适当的 GraphicsPath。

在将 BackColor 设置为 Color.Transparent 之后,我尝试添加对 args.DrawBackground 的调用,但这只是用表单背景的深灰色填充该区域,而不是实际上是透明的,我认为这是典型的“模拟”透明度赢表格。

附带说明一下,IsBalloon 设置为 true 的非自定义工具提示是具有正确透明度的非矩形。

任何人都可以建议解决此问题吗?

4

2 回答 2

1

这是一个解决方案,虽然不完美。它使用 Graphics.CopyFromScreen 将工具提示下的区域复制到背景中。当然,获取工具提示的位置并不简单——因此反射和 PInvoke 调用 GetWindowRect。

剩下的一个小故障是在工具提示淡出时背景可能是错误的。例如,如果您有一个在鼠标悬停时是彩色的按钮,那么当您将鼠标移开而它消失时,工具提示仍将具有该彩色背景。将 ToolTip.UseFading 设置为 false 似乎会改变背景绘制的频率,使其比褪色问题更糟糕。如果用户在操作系统级别禁用了眼睛糖果,这也可能会触发与将 UseFading 设置为 false 相同的绘制故障。

    private void ToolTip_Draw2(object sender, DrawToolTipEventArgs args)
    {
        var graphics = args.Graphics;
        var bounds = args.Bounds;
        graphics.SmoothingMode = SmoothingMode.AntiAlias;
        var windowRect = GetWindowRect();
        graphics.CopyFromScreen(windowRect.Left, windowRect.Top, 0, 0, new Size(bounds.Width, bounds.Height));

        using (var backBrush = new LinearGradientBrush(bounds, C.Color_LogitechGray2, this.BackColor, 90))
        {
            using (var path = GetRoundedRectangle(bounds, 10, 4, 4, 1))
            {
                args.Graphics.FillPath(backBrush, path);
                args.DrawText();
            }
        }
    }

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);

    private Rectangle GetWindowRect()
    {
        RECT rect = new RECT();
        var window = typeof(ToolTip).GetField("window", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(this) as NativeWindow;
        GetWindowRect(window.Handle, ref rect);
        return rect;
    }
于 2009-09-24T15:04:33.737 回答
1

Control.Region是您正在寻找的。您需要告诉窗口管理器工具提示的形状,以便正确重绘背景。

于 2009-09-05T09:17:55.577 回答