【问题标题】:Tooltip text formatting : *Making partly bold*工具提示文本格式:*部分加粗*
【发布时间】:2015-01-24 03:40:28
【问题描述】:

问题:我想让 Tooltip 文本部分加粗。

我想在工具提示上显示的示例文本:

label1:label1Value

label2:label2Value

到目前为止的进展:我用自己的 Draw 事件实现制作了一个自定义的 tooptip 类。我用过:

DrawToopTipEventArgs newAgrs = new DrawToopTipEventArgs (
    e.Graphics, e.AssociatedWindow, e.AssociatedControl, 
    e.Bounds, e.ToolTipText, this.BackColor, this.ForeColor,
    new Font("Arial Unicode MS", 8.25F, FontStyle.Bold));

newAgrs.DrawText(TextFormatFlags.TextBoxControl);

主要问题:这种方式能够使完整的工具提示文本变为粗体,但仍然坚持我如何仅将值部分变为粗体并保持其余标签不变。 (如上图)。

【问题讨论】:

    标签: c# winforms tooltip


    【解决方案1】:

    您必须自己测量文本并绘制​​所有内容。

    private void ToolTip_Draw(object sender, DrawToolTipEventArgs e)
    {
        using (var boldFont = new Font(e.Font, FontStyle.Bold))
        {
            var headerText = "Header: ";
            var valueText = "Value";
    
            var headerTextSize = TextRenderer.MeasureText(headerText, e.Font);
    
            TextRenderer.DrawText(e.Graphics, headerText, e.Font, e.Bounds.Location, Color.Black);
    
            var valueTextPosition = new Point(e.Bounds.X + headerTextSize.Width, e.Bounds.Y);
            TextRenderer.DrawText(e.Graphics, valueText, boldFont, valueTextPosition, Color.Black);
        }
    }
    

    为了简单起见,我对标头和值字符串进行了硬编码。将其扩展为适用于多行应该是微不足道的。测量的文字大小有高度,也可以从Font对象本身获取高度。

    您作为示例的原因是将所有内容都加粗是因为您只是将所有绘图委托给具有新字体的DrawToolTipEventArgs 实例,并告诉它使用新的论点。它很高兴地采用了新字体并使用它绘制了所有文本。

    另外要记住的一点是Popup 事件也应该被处理。这甚至用于测量工具提示的大小,因此您有足够的空间来绘制文本。如果你不处理它,它可能不够宽,无法处理粗体。具体来说,您需要设置 PopupEventArgs.ToolTipSize 属性。

    【讨论】:

    • 谢谢,这是一个完美的答案。为我工作。我现在有一个额外的要求,请问是否可以在此工具提示文本中添加复选框控件?示例:标签:值 [复选框控制]
    • 简短的回答是“否”。要执行您想要的操作,您要么必须找到一个第三方控件,它允许您拥有更高级的工具提示,要么您必须使用另一个无边框 Form 自己编写一些东西。
    • 现在我遇到了另一个问题。这适用于一个数据网格条目,但显示多个矩形框正在混合所有要显示的文本并显示重叠的黑色背景(这真的很荒谬)。知道可能是什么原因吗?我已经处理了弹出事件以将 e.ToolTipSize 设置为足够大,仍然会在 datagridview 中插入多行的一些荒谬的黑色背景。你能告诉我如何为这个工具提示画背景吗?
    • 要么清除图形,要么填充工具提示大小的矩形
    • 做到了,但没有奏效。在 Draw tooltip 事件中,我添加了 DrawToolTipEventArgs.ResetClip 并且还做了 tooltip.RemoveAll() 但没有帮助。调试给了我一点提示。当我第一次悬停时,会引发弹出事件,弹出一个空的工具提示窗口(这是正确的)。当调用 TextRender.DrawText 时,此窗口会填充 Draw 事件。问题:但是当我第二次将鼠标悬停时,这次弹出的执行并没有给出一个空的工具提示窗口,而是包含以前的工具提示文本中的内容,并且一半填充了黑色背景。有什么想法吗?
    猜你喜欢
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    相关资源
    最近更新 更多