使用 VisualStyleElement.ToolTip.Standard.Normal 的 VisualStyleR

本文关键字:VisualStyleR Normal Standard VisualStyleElement ToolTip 使用 | 更新日期: 2023-09-27 17:55:21

我正在创建一个自定义ToolTip,如果文本是多行的,它将加粗第一行文本。我还使用VisualStyleRenderer使用样式正确绘制工具提示。但是,当我绘制文本(即使设置了TextFormatFlags.VerticalCenter)时,它会在框的顶部绘制。我打算将边界框向下移动 2 个像素(这在 Windows 7 上修复了它),但我不确定它对另一个操作系统的可移植性如何。有谁知道如何正确垂直居中绘制文本?

编辑:为了清楚这一点,我知道这段代码没有加粗第一行。我正在尝试首先复制标准工具提示,然后进行粗体。

public class BoldedFirstLineToolTip : ToolTip
{
    public BoldedFirstLineToolTip()
    {
        this.OwnerDraw = true;
        this.Draw += new DrawToolTipEventHandler(OnDraw);
    }
    private void OnDraw(object sender, DrawToolTipEventArgs e)
    {
        // Try to draw using the visual style renderer.
        if (VisualStyleRenderer.IsElementDefined(VisualStyleElement.ToolTip.Standard.Normal))
        {
            var renderer = new VisualStyleRenderer(VisualStyleElement.ToolTip.Standard.Normal);
            renderer.DrawBackground(e.Graphics, e.Bounds);
            var b = e.Bounds;
            // b.Y + 2 // This works when using e.Graphics.DrawString.
            renderer.DrawText(e.Graphics, b, e.ToolTipText, false /*drawDisabled*/, 
                TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);
        }
        else
        {
            // Fall back to non-visual style drawing.
            e.DrawBackground();
            e.DrawBorder();
            e.DrawText();
        }
    }   
}

使用 VisualStyleElement.ToolTip.Standard.Normal 的 VisualStyleR

我决定只使用填充修复。我在下面提供了我的完整解决方案。我在XP和Windows 7上都进行了测试。

public class BoldedFirstLineToolTip : ToolTip
{
    public BoldedFirstLineToolTip()
    {
        this.OwnerDraw = true;
        this.Draw += new DrawToolTipEventHandler(OnDraw);
    }
    private void OnDraw(object sender, DrawToolTipEventArgs e)
    {
        // Try to draw using the visual style renderer.
        if (VisualStyleRenderer.IsSupported && VisualStyleRenderer.IsElementDefined(VisualStyleElement.ToolTip.Standard.Normal))
        {
            var bounds = e.Bounds;
            var renderer = new VisualStyleRenderer(VisualStyleElement.ToolTip.Standard.Normal);
            renderer.DrawBackground(e.Graphics, bounds);
            var color = renderer.GetColor(ColorProperty.TextColor);
            var text = e.ToolTipText;
            using (var textBrush = new SolidBrush(renderer.GetColor(ColorProperty.TextColor)))
            using (var font = e.Font)
            {
                // Fix the positioning of the bounds for the text rectangle.
                var rendererBounds = new Rectangle(e.Bounds.X + 6, e.Bounds.Y + 2, e.Bounds.Width - 6 * 2, e.Bounds.Height - 2 * 2);
                if (!text.Contains(''n'))
                {
                    renderer.DrawText(e.Graphics, rendererBounds, text);
                }
                else
                {
                    var lines = text.Split(''n').Select(l => l.Trim());
                    var first = lines.First();
                    var otherLines = Environment.NewLine + String.Join(Environment.NewLine, lines.Skip(1).ToArray());
                    // Draw the first line.
                    using (var boldFont = new Font(font, FontStyle.Bold))
                    {
                        e.Graphics.DrawString(first, boldFont, textBrush, rendererBounds.X - 1, rendererBounds.Y - 1);
                    }
                    renderer.DrawText(e.Graphics, rendererBounds, otherLines, false /*drawDisabled*/, TextFormatFlags.Left);
                }
            }
        }
        else
        {
            // Fall back to non-visual style drawing.
            e.DrawBackground();
            e.DrawBorder();
            using (var sf = new StringFormat())
            {
                sf.LineAlignment = StringAlignment.Center;
                e.Graphics.DrawString(e.ToolTipText, SystemFonts.DialogFont, Brushes.Black, e.Bounds, sf);
            }
        }
    }
}