【问题标题】:RichTextBox Selection HighlightRichTextBox 选择突出显示
【发布时间】:2015-12-12 00:15:09
【问题描述】:

是否有可能在用户选择后,每个选择的字母都显示它的原始颜色?而且默认情况下并不总是白色?

我想实现这样的目标 可以在写字板中看到。

而不是您在RichTextBox 中看到的

【问题讨论】:

  • 我知道为不同的部分着色很热门,但我希望在选择时看到它。
  • richTextBox1.SelectionColor = System.Drawing.Color.Red; 也许当你选择颜色时,你会随之改变。
  • 不,这样不行。如果没有选择,它将更改所选文本的颜色或当前插入符号位置的文本,但不会影响选择中文本的颜色。
  • 你称之为哪个事件?也许你在选择时没有刷新。
  • 我不认为你理解我。我不需要调用事件,因为它只是我以编程方式进行的选择。所以我只是选择 - 仅此而已。更重要的是,刷新没有意义。请仔细阅读我的问题。选择后选择文本的更改工作正常。选择文本 WHILE 的颜色始终为白色,就像我附加的屏幕一样。

标签: c# .net winforms selection richtextbox


【解决方案1】:

您可以使用最新版本的RichTextBoxRICHEDIT50W,为此您应该继承标准RichTextBox 并覆盖CreateParams 并将ClassName 设置为RICHEDIT50W

代码

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class ExRichText : RichTextBox
{
    [DllImport("kernel32.dll", EntryPoint = "LoadLibraryW", 
        CharSet = CharSet.Unicode, SetLastError = true)]
    private static extern IntPtr LoadLibraryW(string s_File);
    public static IntPtr LoadLibrary(string s_File)
    {
        var module = LoadLibraryW(s_File);
        if (module != IntPtr.Zero)
            return module;
        var error = Marshal.GetLastWin32Error();
        throw new Win32Exception(error);
    }
    protected override CreateParams CreateParams
    {
        get
        {
            var cp = base.CreateParams;
            try
            {
                LoadLibrary("MsftEdit.dll"); // Available since XP SP1
                cp.ClassName = "RichEdit50W";
            }
            catch { /* Windows XP without any Service Pack.*/ }
            return cp;
        }
    }
}

截图

注意:

  • 感谢这个古老有用的视觉工作室工具,我可以看到使用 Spy++ 的写字板 RichTextBox 类。

  • 如果你的操作系统中RICHEDIT50W有任何问题,你可以打开Spy++WordPad,然后选择其中的RichTextBox,看看类名是什么。

  • 当我搜索有关将RICHEDIT50W 类应用于我的控件时,我找到了@Elmue 的this 很棒的帖子,感谢他。

【讨论】:

  • 非常感谢!现在,选择时颜色的可见性完美!
  • @Reza Aghaei,我在我的项目中应该把这个类放在哪里?因为我以不止一种形式使用richtextbox?
  • 当你将类添加到你的项目中,如果你关闭所有的设计器并重新构建项目,ExRichText会出现在工具箱中,你可以把它放到表单上。
  • @Reza Aghaei,但是当我将它拖到我的用户控件时,我得到了这个错误:imgur.com/YAoGPyw,请告诉我如何解决它?
【解决方案2】:

对于任何有 Visual Studio 2019 问题和 Hunar 评论中提到的异常“类已存在”的人,我稍微修改了代码以仅加载一次库,这为我解决了问题。

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;

[DesignerCategory("Code")]
public class RichTextBox5 : RichTextBox
{
    [DllImport("kernel32.dll", EntryPoint = "LoadLibraryW", CharSet = CharSet.Unicode, SetLastError = true)]
    private static extern IntPtr LoadLibraryW(string s_File);

    private static readonly object libraryLoadLock = new object();
    private static bool libraryLoadFlag;

    public static IntPtr LoadLibrary(string s_File)
    {
        var module = LoadLibraryW(s_File);
        if (module != IntPtr.Zero)
        {
            return module;
        }
        var error = Marshal.GetLastWin32Error();
        throw new Win32Exception(error);
    }

    protected override CreateParams CreateParams
    {
        get
        {
            var cp = base.CreateParams;
            try
            {
                lock (libraryLoadLock)
                {
                    if (!libraryLoadFlag)
                    {
                        LoadLibrary("MsftEdit.dll"); // Available since XP SP1
                        libraryLoadFlag = true;
                    }
                }
                cp.ClassName = "RichEdit50W";
            }
            catch { /* Windows XP without any Service Pack.*/ }
            return cp;
        }
    }
}

很抱歉以这种方式回答,但由于声誉积分不足,我只能发布答案。

【讨论】:

猜你喜欢
  • 2017-01-28
  • 1970-01-01
  • 2011-08-26
  • 2017-03-18
  • 2012-12-15
  • 1970-01-01
  • 2012-07-23
  • 2011-08-06
  • 1970-01-01
相关资源
最近更新 更多