天道酬勤,学无止境

如何使用图形突出显示控件中的换行文本?(How to highlight wrapped text in a control using the graphics?)

问题

我需要使用fill rect突出显示控件中的特定字符。 通过使用如下所示的Graphics.MeasureString()方法,可以获取未包装文本时的位置,

var size = g.MeasureString(tempSearchText, style.Font, 0, StringFormat.GenericTypographic);

如果文本是自动换行的,那么我将无法找到字符的确切边界以突出显示文本。

我需要获取给定字符在包装文本中的确切范围。 提供您的建议以实现这种情况。

回答1

没有针对哪个控件的明确说明,因此我正在测试3种不同的控件:
TextBoxRichTextboxListBox

TextBox和RichTextbox具有相同的行为并共享相同的工具,因此无需定义两种不同的方法即可获得相同的结果。
当然,RichTextbox提供了更多选项,包括RTF。

另外,我正在测试Graphics.DrawString()和TextRenderer.DrawText()。

这是该测试的结果,因此可以更清楚地了解代码的作用。

警告
对于此示例,我使用Control.CreateGraphics() ,因为TextBoxRichTextBox控件不提供Paint()事件。 对于真实世界的应用程序,您应该创建派生自TextBoxRichTextBox WndPrc ,覆盖WndPrc并处理WM_PAINT

1)在多行TextBox控件中突出显示所有t

TextRenderer-> DrawText():

//Define some useful flags for TextRenderer
TextFormatFlags flags = TextFormatFlags.Left | TextFormatFlags.Top | 
                        TextFormatFlags.NoPadding | TextFormatFlags.WordBreak | 
                        TextFormatFlags.TextBoxControl;
//The char to look for
char TheChar = 't';

//Find all 't' chars indexes in the text
List<int> TheIndexList = textBox1.Text.Select((chr, idx) => chr == TheChar ? idx : -1)
                                      .Where(idx => idx != -1).ToList();

//Or with Regex - same thing, pick the one you prefer
List<int> TheIndexList = Regex.Matches(textBox1.Text, TheChar.ToString())
                              .Cast<Match>()
                              .Select(chr => chr.Index).ToList();

//Using .GetPositionFromCharIndex(), define the Point [p] where the highlighted text is drawn
if (TheIndexList.Count > 0)
{
    foreach (int Position in TheIndexList)
    {
        Point p = textBox1.GetPositionFromCharIndex(Position);
        using (Graphics g = textBox1.CreateGraphics())
               TextRenderer.DrawText(g, TheChar.ToString(), textBox1.Font, p,
                                     textBox1.ForeColor, Color.LightGreen, flags);
    }
}

使用Graphics.FillRectangle()Graphics.DrawString()的相同操作:

if (TheIndexList.Count > 0)
{
    using (Graphics g = textBox1.CreateGraphics())
    {
        foreach (int Position in TheIndexList)
        {
            PointF pF = textBox1.GetPositionFromCharIndex(Position);
            SizeF sF = g.MeasureString(TheChar.ToString(), textBox1.Font, 0,
                                       StringFormat.GenericTypographic);

            g.FillRectangle(Brushes.LightGreen, new RectangleF(pF, sF));
            using (SolidBrush brush = new SolidBrush(textBox1.ForeColor))
            {
                g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
                g.DrawString(TheChar.ToString(), textBox1.Font, brush, pF, StringFormat.GenericTypographic);
            }
        }
    }
}

行为没有显着差异: TextRenderer.DrawText()Graphics.DrawString()在这里执行完全相同的操作。
将Application.SetCompatibleTextRenderingDefault()设置为truefalse似乎没有任何影响(至少在当前上下文中)。

2)在TextBox控件和多行RichTextbox控件中突出显示一些字符串模式(“单词”)。

仅在使用TextRenderer ,因为行为没有差异。

我只是让IndexOf()查找字符串的第一个匹配项,但是之前使用的相同搜索模式可以代替它。 正则表达式效果更好。

string[] TheStrings = {"for", "s"};
foreach (string pattern in TheStrings)
{
    Point p = TextBox2.GetPositionFromCharIndex(TextBox2.Text.IndexOf(pattern));
    using (var g = TextBox2.CreateGraphics()) { 
        TextRenderer.DrawText(g, pattern, TextBox2.Font, p, 
                              TextBox2.ForeColor, Color.LightSkyBlue, flags);
    }
}

TheStrings = new string []{"m", "more"};
foreach (string pattern in TheStrings)
{
    Point p = richTextBox1.GetPositionFromCharIndex(richTextBox1.Text.IndexOf(pattern));
    using (Graphics g = richTextBox1.CreateGraphics())
        TextRenderer.DrawText(g, pattern, richTextBox1.Font, p,
                              richTextBox1.ForeColor, Color.LightSteelBlue, flags);
}

3)选择在所有的所有特殊ListItems的列表框控件的(当然也可以是任何其他字符串:)

ListBox.DrawMode设置为Normal并“即时”更改为OwnerDrawVariable以评估TextRendererGraphics在这里的行为是否不同。

差别很小:与标准实现相比,相对于ListBox的左边距有不同的偏移量。 具有TextFormatFlags.NoPadding TextRenderer向左渲染2个像素(与之相反,不带有标志)。 图形向右渲染1个像素。
当然,如果将OwnerDrawVariable设置为设计模式,则不会引起注意。

string HighLightString = "s";
int GraphicsPaddingOffset = 1;
int TextRendererPaddingOffset = 2;

private void button1_Click(object sender, EventArgs e)
{
    listBox1.DrawMode = DrawMode.OwnerDrawVariable;
}

以下代码的工作方式:

  1. 获取ListItem文本中出现模式( string HighLightString )的所有位置。
  2. 用模式的位置和长度定义一个CharacterRange结构的数组。
  3. 使用.SetMeasurableCharacterRanges()用所有CharacterRange结构填充StringFormat
  4. 使用Graphics.MeasureCharacterRanges()传递已初始化的StringFormat来定义Regions的数组。
  5. 使用Region.GetBounds()定义矩形数组
  6. 使用Graphics.FillRectangles()用高亮颜色填充所有矩形
  7. 绘制ListItem文本。

TextRenderer.DrawText()实现:

private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();

    TextFormatFlags flags = TextFormatFlags.Left | TextFormatFlags.Top | TextFormatFlags.NoPadding |
                            TextFormatFlags.WordBreak | TextFormatFlags.TextBoxControl;
    Rectangle bounds = new Rectangle(e.Bounds.X + TextRendererPaddingOffset, 
                                     e.Bounds.Y, e.Bounds.Width, e.Bounds.Height);

    string ItemString = listBox1.GetItemText(listBox1.Items[e.Index]);
    List<int> TheIndexList = Regex.Matches(ItemString, HighLightString)
                                  .Cast<Match>()
                                  .Select(s => s.Index).ToList();

    if (TheIndexList.Count > 0)
    {
        CharacterRange[] CharRanges = new CharacterRange[TheIndexList.Count];
        for (int CharX = 0; CharX < TheIndexList.Count; CharX++)
            CharRanges[CharX] = new CharacterRange(TheIndexList[CharX], HighLightString.Length);

        StringFormat format = new StringFormat(StringFormat.GenericDefault);
        format.SetMeasurableCharacterRanges(CharRanges);

        Region[] regions = e.Graphics.MeasureCharacterRanges(ItemString, e.Font, e.Bounds, format);

        RectangleF[] rectsF = new RectangleF[regions.Length];
        for (int RFx = 0; RFx < regions.Length; RFx++)
            rectsF[RFx] = regions[RFx].GetBounds(e.Graphics);

        e.Graphics.FillRectangles(Brushes.LightGreen, rectsF);
    }
    TextRenderer.DrawText(e.Graphics, ItemString, e.Font, bounds, e.ForeColor, flags);
}

`Graphics.DrawString()` implementation
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    Rectangle bounds = new Rectangle(e.Bounds.X - GraphicsPaddingOffset,
                                     e.Bounds.Y, e.Bounds.Width, e.Bounds.Height);

    string ItemString = listBox1.GetItemText(listBox1.Items[e.Index]);
    List<int> TheIndexList = Regex.Matches(ItemString, HighLightString)
                                  .Cast<Match>()
                                  .Select(s => s.Index).ToList();

    StringFormat format = new StringFormat(StringFormat.GenericDefault);
    if (TheIndexList.Count > 0)
    {
        CharacterRange[] CharRanges = new CharacterRange[TheIndexList.Count];
        for (int CharX = 0; CharX < TheIndexList.Count; CharX++)
            CharRanges[CharX] = new CharacterRange(TheIndexList[CharX], HighLightString.Length);

        format.SetMeasurableCharacterRanges(CharRanges);
        Region[] regions = e.Graphics.MeasureCharacterRanges(ItemString, e.Font, e.Bounds, format);

        RectangleF[] rectsF = new RectangleF[regions.Length];
        for (int RFx = 0; RFx < regions.Length; RFx++)
            rectsF[RFx] = regions[RFx].GetBounds(e.Graphics);

        e.Graphics.FillRectangles(Brushes.LightGreen, rectsF);
    }
    using (SolidBrush brush = new SolidBrush(e.ForeColor))
        e.Graphics.DrawString(ItemString, e.Font, brush, bounds, format);
}

笔记:
根据ListBox.DrawMode ,可能有必要订阅ListBox.MeasureItem()事件或将.ItemHeight属性设置为.ItemHeight的值。

private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
{
      e.ItemHeight = listBox1.Font.Height;
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 为什么Graphics.MeasureString()返回的数字比预期的高?(Why is Graphics.MeasureString() returning a higher than expected number?)
    问题 我正在生成一张收据,并且正在使用Graphics对象来调用DrawString方法以打印出所需的文本。 graphics.DrawString(string, font, brush, widthOfPage / 2F, yPoint, stringformat); 这对我需要做的事情很好。 我一直都知道我要打印的内容,因此我可以手动修剪任何字符串,使其适合80mm的收据纸。 然后,我不得不添加一些额外的功能,以使其更加灵活。 用户可以传递将添加到底部的字符串。 由于我不知道它们将要放置什么,因此我创建了自己的自动换行函数,该函数接受许多要换行的字符和字符串本身。 为了找出字符数,我正在做这样的事情: float width = document.DefaultPageSettings.PrintableArea.Width; int max = (int)(width / graphics.MeasureString("a", font).Width); 现在,宽度返回我283,单位为毫米,约为72,这在考虑80毫米纸张上的边距时很有意义。 但是MeasureString方法在Courier New 8pt字体上返回10.5。 因此,我得到的是26,而不是超出预期的36-40,导致两行文本变成了3-4。 PrintableArea.Width的单位为1/100英寸
  • C#:在节点上单击时,TreeView所有者图形带有ownerdrawtext和怪异的黑色突出显示(C#: TreeView owner drawing with ownerdrawtext and the weird black highlighting when clicking on a node)
    问题 我将DrawMode设置为OwnerDrawText并添加到DrawNode事件上,添加了我的代码以所需的方式绘制文本,并且所有工作都很好,除了在选择节点时突出显示了一些奇怪的黑色选择。 没问题,我添加了逻辑来检查节点的状态是否被突出显示,并绘制了自己的突出显示,除了单击节点时才添加黑色突出显示,而不仅仅是选中了...一旦鼠标按钮突出显示,矩形就会覆盖我的突出显示被释放但确实被绘制并闪烁...这很烦人。 :/ 显然我忘了真正问我的问题...在不完全处理图纸的情况下如何摆脱选择呢? 回答1 以我的经验,您通常不会。 您自己绘制还是不绘制。 如果尝试在控件绘制的图形之上合成图形,则最终会出现故障。 这有点麻烦,因为您必须处理焦点矩形,选择突出显示并自己绘制所有字形。 从好的方面来说,视觉样式可以用来完成大部分工作。 这是一些代码,可以帮助您找到大部分的方法(这是不完整的,因为它使用了一些未包括的方法,并且不能完全呈现普通树视图的功能,因为它支持渐变填充的项目和列,但是应该是方便参考) protected virtual void OnDrawTreeNode(object sender, DrawTreeNodeEventArgs e) { string text = e.Node.Text; Rectangle itemRect = e.Bounds; if (e.Bounds
  • 如何更改焦点JComboBox的突出显示颜色(How can I change the highlight color of a focused JComboBox)
    问题 首先让我解释一下我要实现的目标。 我正在Swing中创建一个数据输入表单,该表单由许多JComboBoxes和JTextField组成。 验证例程对这些组件进行迭代,并确定为每个控件指定的值是否为“有效”(就本示例而言,验证的细节无关紧要)。 当例程识别出一个组件包含无效值时,我想更改该字段的背景颜色,以及该字段的前景色/文本颜色,以使用户清楚该字段存在问题。 在将某个字段视为“有效”的情况下,我想将控件的背景设置为白色,并将前景/文本设置为黑色。 到目前为止,所有操作都非常简单明了,并且都可以在下面的附加演示代码中实现。 当组合框包含有效值并被聚焦时,组合框中的编辑器背景将设置为蓝色,对此我感到非常满意。 但是,我要实现的是更改当组合框包含无效值时用于突出显示焦点组合框的颜色。 尽管已将组合框的背景颜色更改为粉红色,但是如果控件已聚焦,则它仍使用蓝色来表示它已聚焦。 重点关注的无效字段示例:http://postimg.org/image/ne9xgjch3/ 尽管我知道这是完全正常的行为,但我想做的是将用于突出显示“无效”字段之一的颜色更改为较深的阴影,使非集中和无效控件具有该颜色-这样,用户仍可以看到焦点对准哪个控件,并且整个控件仍然是粉红色的。 我很欣赏这看似微不足道,但是我的最终用户坚持认为,整个领域在聚焦时仍保持粉红色(或粉红色的不同阴影)。 这就是我的理想国
  • 具有语法高亮显示的文本框/ richtextbox? [C#] [关闭](A textbox/richtextbox that has syntax highlighting? [C#] [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow的主题。 5年前关闭。 改善这个问题 在哪里可以找到WinForms控件,该控件将突出显示粘贴到其中的源代码? 我想要一种对多种不同语言都具有语法高亮显示的支持,但是如果仅与C#一起使用,我也可以。 回答1 Scintilla.NET可能就是您想要的 回答2 最近,在codeproject Fast Colored TextBox中发现了一个不错的控件,用于突出显示语法。 使用富文本框作为突出显示的唯一问题是在文档尺寸较大的情况下着色速度较慢。 对于中等大小的文档,可以通过延迟突出显示来解决此问题。 回答3 作为开源替代品,请看一下: dotNet火球 SharpDevelop的ICSharpCode.TextEditor 回答4 将ICSharpCode.TextEditor程序集引用添加到项目,为Visual Studio Toolbox选择程序集和控件。 之后,您可以将控件放到窗体上。 令人惊讶的是,您不会看到“属性”来选择语法突出显示架构。 取而代之的是,您必须使用方法SetHighlighting。 字符串参数从可用模式列表中设置突出显示模式。 这些模式被嵌入到控件中。 如何使用,更改架构和下载示例,请看以下文章 回答5 如果您愿意为控件付费
  • 自动突出显示文本框控件中的文本(Auto highlight text in a textbox control)
    问题 当控件获得焦点时,如何在文本框控件中自动突出显示文本。 回答1 在Windows窗体和WPF中: textbox.SelectionStart = 0; textbox.SelectionLength = textbox.Text.Length; 回答2 如果要对整个WPF应用程序执行此操作,则可以执行以下操作:-在文件App.xaml.cs中 protected override void OnStartup(StartupEventArgs e) { //works for tab into textbox EventManager.RegisterClassHandler(typeof(TextBox), TextBox.GotFocusEvent, new RoutedEventHandler(TextBox_GotFocus)); //works for click textbox EventManager.RegisterClassHandler(typeof(Window), Window.GotMouseCaptureEvent, new RoutedEventHandler(Window_MouseCapture)); base.OnStartup(e); } private void TextBox_GotFocus(object sender
  • 如何禁用UITableView选择?(How can I disable the UITableView selection?)
    问题 当您点击UITableView中的一行时,该行将突出显示并选中。 是否可以禁用此功能,所以点击一行不会执行任何操作? 回答1 对我来说,以下工作正常: tableView.allowsSelection = false 这意味着didSelectRowAt#根本无法工作。 就是说,如此触摸桌子的一排,绝对没有任何作用。 (因此,显然,绝不会有选定的动画。) (请注意,如果在单元格上有UIButton或任何其他控件,那么这些控件当然仍然可以使用。您碰巧在表格单元格上拥有的任何控件都与UITableView允许您“选择行”的功能完全无关。 “使用didSelectRowAt# 。) 要注意的另一点是:当UITableView处于编辑模式时,此功能不起作用。 要在编辑模式下限制单元格的选择,请使用以下代码: tableView.allowsSelectionDuringEditing = false 回答2 您要做的就是使用以下任一方法在UITableViewCell实例上设置选择样式: 目标C: cell.selectionStyle = UITableViewCellSelectionStyleNone; 或者 [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 斯威夫特2: cell
  • 如何使用JavaScript突出显示文本(How to highlight text using javascript)
    问题 有人可以通过可以在网页上突出显示文本的JavaScript函数来帮助我。 要求是-仅突出显示一次,而不是像我们在搜索情况下那样突出显示所有出现的文本。 回答1 您可以使用jquery突出显示效果。 但是,如果您对原始javascript代码感兴趣,请看一下我得到的内容。简单地将粘贴复制到HTML中,打开文件,然后单击“突出显示”-这应该突出显示“ fox”一词。 在性能方面,我认为这适用于小文本和单个重复(如您指定的那样) function highlight(text) { var inputText = document.getElementById("inputText"); var innerHTML = inputText.innerHTML; var index = innerHTML.indexOf(text); if (index >= 0) { innerHTML = innerHTML.substring(0,index) + "<span class='highlight'>" + innerHTML.substring(index,index+text.length) + "</span>" + innerHTML.substring(index + text.length); inputText.innerHTML = innerHTML; } }
  • 在JavaFX TextArea中突出显示字符串(Highlighting Strings in JavaFX TextArea)
    问题 我们在应用程序中使用JavaFX的TextArea控件,并尝试将其与Jazzy Spell Check API集成-例如,当用户输入不在词典中的错误单词时,该单词将突出显示。 有什么办法可以突出显示控件中的单词吗? 我在JavaDocs中没有看到任何选择,因此,如果有人可以建议一种方法? 我猜可能会使用HTMLEditor组件并用<font face="red=>wrongWord</font>给单词加上颜色,但这会带来很多不同的拼写检查问题,例如作为html标签和单词的计数。 回答1 JavaFX TextArea控件(自2.0.2开始)不支持混合文本样式(字体等)的富文本编辑。 您可以通过操纵TextArea的selectRange来突出显示TextArea中的连续字符串,如以下示例所示: public class TextHighlight extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { final TextArea text = new TextArea("Here is some textz to highlight"); text.setStyle
  • 带有语法突出显示的UITextView(UITextView with Syntax Highlighting)
    问题 如何在UITextView进行语法突出显示,特别是在iPhone上对Objective-C进行语法突出显示(和检测)? 我对如何执行此操作的一些想法: NSAttributedString 。 现在可在iOS 3.2及更高版本中使用。 但是如何将NSAttributedString放入UITextView中呢? UIWebView 。 用户完成编辑后将其覆盖,并使用CSS样式表为文本着色。 但是,我将如何在UIWebView执行此操作,为它提供文本,然后为其着色呢? 回答1 更新:自从iOS 7和TextKit以来,语法突出显示变得像馅饼一样容易。 在这里寻找介绍(由我提供)。 假设您需要一个可编辑的组件,则没有太多希望。 快速概述,以确保涵盖所有内容: UITextView :仅纯文本,无(公共)方式。 但可编辑。 没有机会更改任何内容,没有机会获得几何图形等。内部使用Web视图。 每个段落都是一个<div> ,由编辑引擎更改。 您可以在其中更改DOm,但这就是所有私有API。 全部为私人,因此别无选择。 UIWebView : html ,因此可以样式化,具有嵌入的图像等。我猜(无需仔细研究)这就是前面提到的Three 20 UI所使用的。 问题:无法编辑。 没有(公开)解决方案。 您可以在没有专用API且没有很多麻烦的情况下获得选择,访问DOM等。
  • 改变中突出显示颜色(Changing <select> highlight color)
    问题 如何更改<select>的突出显示颜色,即当光标通过CSS越过<li>时突出显示<li>的颜色? 回答1 不知道您对“突出显示<li>的颜色”的含义是什么,但是听起来您想更改<option>元素的背景颜色。 我尝试过,但它不起作用,您总是会得到系统颜色。 如果要在鼠标悬停时突出显示整个<select>元素,可以使用以下方法: select:hover { background-color: red; } 但是,在不同的浏览器中,行为是不同的。 例如,Chrome不会在下拉菜单中突出显示选项。 Firefox可以,但是如果您将鼠标移开并且它们仍然被拉下,它不会将它们变回原样。 正如许多其他类似问题所指出的那样,您无法可靠地设置表单控件的样式。 有关更多详细信息,请参见此处。 回答2 您无法通过-> background:#f9f9f9类的方式更改选项的突出显示颜色。 您可以执行以下操作: select > option:hover{ box-shadow: 0 0 10px 100px #FED20F inset; transition: all .2s ease-in-out; } 回答3 如上所述,设置background-color仍然可以,但是:hover在IE7中是有问题的-将您的doctype设置为strict会有所帮助。 回答4 您可以使用:hover伪类 例如
  • git diff-向我显示行尾更改吗?(git diff - show me line ending changes?)
    问题 我的编辑器正在更改源文件的行尾。 当我执行git diff ,我看到同一行两次-一次用-和一次用+ -没有明显的区别。 我如何获得git diff来告诉我此更改实际上是什么? 回答1 首先,请确保您使用的是彩色输出(例如git diff --color ),并且已使用(例如)启用了空白突出显示 git config color.diff.whitespace "red reverse" 但是,这可能并非在所有情况下都可行,因为git似乎并未突出显示已删除行的尾随空格。 要查看已删除的空格,只需使用 git diff -R 将空格放在比较的“添加”侧,并在此突出显示。 有关更多详细信息,请参见此SO问题的答案。 回答2 您可以使用以下命令查看行尾差异。 git diff | cat -v 然后,对于CRLF(DOS)结尾,将打印“ ^ M”,对于LF(Unix)结尾,则不打印任何内容。 显然git diff做对了,打印CR和LF字符以结束CRLF。 但是因为CR被控制台占用,所以我们看不到它。 通过使用cat -v,我们可以使其可见。 回答3 观察空格变化的一种方法是使用 git diff --color --word-diff-regex=. 这凸显了所有空白改变处处线。 删除的空格包装在[-和-] ,添加的空白包装在{+和+} 。 或者,如亚历克斯(Alex)所建议 git
  • 如何在UWP中更改所选ListView项的突出显示颜色(Windows 10)(How to change Highlight color of the selected ListView item in UWP (Windows 10))
    问题 我正在使用C#和XAML开发Windows 10应用程序。 我有一个ListView,并且想要更改所选项目的默认HighLight颜色。 我看到了很多代码示例(像这样),但是所有示例都是为WP8或Win8设计的,我试图实现这些示例,但它们对我不起作用。 通常,我在修改控件的默认主题时遇到麻烦,因为我找不到有用的文档。 如果有人可以帮助我突出显示颜色并向我推荐优质的文档,那将是很好的。 回答1 实际上,发现样式属性的更好方法是使用Blend。 首先,在Blend中打开您的页面。 然后右键单击您的ListView并转到 编辑其他模板>编辑生成的项目容器(ItemContainerStyle)>编辑副本。 给它起一个名字,然后点击OK 。 现在,您已经为ListViewItem生成了完整的内置样式,在这里您可以找到有关其外观,动画和其他视觉行为的所有信息。 您应该看一下这段代码- <ListViewItemPresenter CheckBrush="{ThemeResource SystemControlForegroundBaseMediumHighBrush}" ContentMargin="{TemplateBinding Padding}" CheckMode="Inline" ContentTransitions="{TemplateBinding
  • RichTextBox语法实时高亮显示-禁用重绘(RichTextBox syntax highlighting in real time--Disabling the repaint)
    问题 我正在创建一个使用RichTextBox并可以访问关键字和'badwords'列表的函数。 我需要突出显示在用户键入时在RichTextBox中找到的所有关键字和关键字,这意味着每次释放编辑键时都会调用该函数。 我已经编写了此函数,但是框中的单词和光标闪烁得太舒服了。 我发现了一个解决方案-在我编辑和格式化其文本时禁用RichTextBox自己重新绘制的功能。 但是,我唯一知道做到这一点的方法是重写“ WndProc”函数并拦截重绘消息,如下所示: protected override void WndProc(ref System.Windows.Forms.Message m) { if (m.Msg == 0x00f) { if (paint) base.WndProc(ref m); else m.Result = IntPtr.Zero; } else base.WndProc(ref m); } 布尔值“ paint”在开始突出显示之前设置为false,在结束时设置为true。 但是正如我说的,我制作的函数必须包含在RichTextBox中。 我不能使用子类。 因此,有没有办法从外部禁用RichTextBox的自动重绘? 回答1 这是RichTextBox类中的一个疏忽。 其他控件(如ListBox)支持BeginUpdate和EndUpdate方法来禁止绘画。
  • 如何比较两个富文本框内容并突出显示已更改的字符?(How to compare two rich text box contents and highlight the characters that are changed?)
    问题 我用于阅读2个richtextbox内容的代码如下: richTextBox1.Text = File.ReadAllText(tfsVersionFilePath); richTextBox2.Text = File.ReadAllText(dbVersionFilePath); 现在,我需要比较两个富文本框的内容,并突出显示两个富文本框中已更改的字符。 目的是通过c#应用程序获得差异并突出显示as in TFS (比较文件)中的字符。 谢谢。 编辑: int length = (richTextBox1.Text.Length > richTextBox2.Text.Length) ? richTextBox1.Text.Length : richTextBox2.Text.Length; for (int i = 0; i < length; i++) { if (richTextBox1.Text[i] != richTextBox2.Text[i]) { /* and then start your highlight selection here, this is where some difference between the two rich text boxes begins */ richTextBox1.Select(i, 1)
  • 基本Widgets(25):【类】QLabel [官翻]
    文章目录 详细说明属性公共函数构造和析构属性相关其他 重写的公共函数公共槽信号重写的受保护的函数参考 QLabel Class QLabel小部件提供文本或图像显示。 Header#include < QLabel >qmakeQT += widgetsInheritsQFrameInherited By 详细说明 QLabel用于显示文本或图像。不提供用户交互功能。标签的视觉外观可以以各种方式配置,并且可以用于为另一个小部件指定焦点助记键。 QLabel可以包含以下任何内容类型: ContentSettingPlain text将QString传递给setText() 。Rich text将包含富文本的QString传递给setText() 。A pixmap将QPixmap传递给setPixmap() 。A movie将QMovie传递给setMovie() 。A number将int或double传递给setNum() ,后者将数字转换为纯文本。Nothing与空纯文本相同。这是默认值。由clear() 设置。 警告:当将QString传递给构造函数或调用setText() 时,请确保清理您的输入,因为QLabel试图猜测它是将文本显示为纯文本还是富文本(html4标记的子集)。您可能希望显式调用setTextFormat() ,例如,如果希望文本为纯格式,但无法控制文本源
  • 如何在Java Swing TextArea中更改突出显示颜色? 并且,更改与突出显示位置相对应的文本的开头(How to change highlighting color in Java Swing TextArea? And also, change the beginning of text corresponding to the highlighting location)
    问题 问题1:通过使用defaulthighlighter,我可以使聚焦线变为蓝色。 现在,我想将其更改为其他颜色。 有人知道如何更改此参数吗? - - 解决了 问题2:pos是我要突出显示的子字符串的开始索引。 我使用setCaretPosition(pos); 更新显示内容。 但是它总是出现在窗口的底部。 我想把它放在顶部。 谁能告诉我该如何处理? 我使用一个演示来展示我的问题: import java.awt.Color; import java.net.MalformedURLException; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingUtilities; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultHighlighter; public class Test { public static void main(final String[] args) throws MalformedURLException { SwingUtilities.invokeLater(new
  • 如何以MS Word保留格式和语法高亮显示代码段?(How do you display code snippets in MS Word preserving format and syntax highlighting?)
    问题 有谁知道一种在Microsoft Word文档中显示可保留颜色和格式的代码的方法? 优选地,该方法也将是不引人注目的并且易于更新。 我试图将代码作为常规文本包含在内,这看起来很糟糕,并且在编辑常规文本时会遇到麻烦。 我还尝试将对象(写字板文档和文本框)插入文档,然后将代码放入这些对象中。 该代码看起来更好,并且在编辑其余文本时更容易避免。 但是,这些对象只能跨越一页,这在需要添加几页代码时使编辑成为一场噩梦。 最后,我知道有更好的编辑器/格式可以解决此问题,但是我仍然坚持使用MS word。 回答1 对我来说,这是在word中添加代码的最佳方法: 转到“ Insert选项卡的“ Text部分,单击“ object按钮(在右侧) 选择“ OpenDocument Text ,这将打开一个新的嵌入式Word文档从Visual Studio / Eclipse复制并粘贴您的代码到此嵌入式word页面中保存并关闭 结果看起来非常不错。 这是此方法的优点: 代码保持其原始布局和颜色代码与文档的其余部分分开,好像是图片还是图表拼写错误不会在代码中突出显示(这很酷!) 而且只需要几秒钟。 回答2 下载并安装Notepad ++并执行以下操作: 将您的代码粘贴到窗口中; 从语言菜单中选择编程语言; 选择要复制的文本; 右键单击并选择“插件命令” ->“复制带有语法突出显示的文本” ;
  • 使Vim将所有空格显示为字符(Make Vim show ALL white spaces as a character)
    问题 我找不到一种使Vim将所有空白显示为字符的方法。 我发现的只是关于制表符,尾随空格等。 回答1 正如其他人所说,您可以使用 :set list 结合 :set listchars=... 显示不可见的字符。 现在,没有可用于显示空白的显式选项,但是在列表字符中,您可以设置一个字符以显示所有但空白。 例如,我的看起来像这样 :set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:< 所以,现在,在您使用之后 :set list 那么,所有没有明确显示为其他内容的东西,实际上就是一个普通的旧空格。 与往常一样,要了解listchars工作原理,请使用帮助。 它提供了有关可以显示哪些字符(例如尾随空格)以及如何执行此操作的重要信息: :help listchars 向其中添加切换可能会有所帮助,以便您可以轻松地在编辑过程中查看更改(来源:VIM:set list!作为.vimrc中的切换): noremap <F5> :set list!<CR> inoremap <F5> <C-o>:set list!<CR> cnoremap <F5> <C-c>:set list!<CR> 回答2 从7.4.710补丁开始,您现在可以使用listchars设置要显示在空间位置的字符! :set listchars+=space:␣ 因此
  • 触摸后保持UIButton处于选中状态(Keeping a UIButton selected after a touch)
    问题 用户单击按钮后,我希望在执行网络操作期间该按钮保持按下状态。 网络操作完成后,我希望按钮返回到其默认状态。 我试过在按钮按下后立即调用- [UIButton setSelected:YES] (并在我的网络操作完成后相应调用- [UIButton setSelected:NO] ),但它似乎无能为力。 如果我调用setHighlighted:同样的事情。 我想我可以尝试换掉背景图像以表示在网络运行期间处于选定状态,但这似乎是一种hack。 还有更好的建议吗? 这是我的代码如下所示: - (IBAction)checkInButtonPushed { self.checkInButton.enabled = NO; self.checkInButton.selected = YES; self.checkInButton.highlighted = YES; [self.checkInActivityIndicatorView startAnimating]; [CheckInOperation startWithPlace:self.place delegate:self]; } - (void)checkInCompletedWithNewFeedItem:(FeedItem*)newFeedItem wasNewPlace:(BOOL)newPlace
  • 如何禁用列表框上的突出显示但保持选择状态?(How to disable highlighting on listbox but keep selection?)
    问题 我在查找如何不允许ListBox突出显示所选项目时遇到了麻烦。 我知道我没有添加触发器来突出显示该项目。 <ListBox Name="CartItems" ItemsSource="{Binding}" ItemTemplate="{StaticResource TicketTemplate}" Grid.Row="3" Grid.ColumnSpan="9" Background="Transparent" BorderBrush="Transparent"> </ListBox> 回答1 答案很晚,但是有一个更好,更简单的解决方案: <ListBox> <ListBox.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" /> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" /> <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" /> </ListBox.Resources> <