- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 WinForms 程序,每当您更改选择时,RichTextBox 都需要更改某些其他文本的颜色。为此,它必须选择该文本,因此我失去了当前的选择。
我可以保存和加载 SelectionStart 和 SelectionLength 属性,但我无法保持“选择方向”:如果用户从光标向前或向后突出显示。
关于如何在不更改选择的情况下保存选择方向或为文本着色的任何想法?
最佳答案
我刚刚遇到了同样的问题,现在我使用 EM_EXSETSEL 解决了这个问题。当 cpMin > cpMax 时,它的工作方式类似于“向后选择”(所选文本开头的插入符号)。然而我还没有找到任何其他方法来找出当前的选择方向(EM_EXGETSEL 总是返回 cpMin < cpMax)但是在 SelectionStart/Length 变化之后......
编辑:
这就是我用来解决这个问题的方法。可能有一些更简单的方法,但至少以下方法对我有用。
using System.Runtime.InteropServices;
//********************
//SendMessage stuff for EM_EXSETSEL
//********************
[StructLayout(LayoutKind.Sequential)]
public struct CHARRANGE
{
public int cpMin;
public int cpMax;
}
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, ref CHARRANGE lParam);
private const UInt32 WM_USER = 0x0400;
private const UInt32 EM_EXSETSEL = WM_USER + 55;
private const UInt32 EM_EXGETSEL = WM_USER + 52;
//********************
//event handlers
//********************
//locking variable to avoid stack overflow while setting selection in code
private bool richTextBox1_SelectionChanged_lock = false;
//handler for richTextBox selection change event
private void richTextBox1_SelectionChanged(object sender, EventArgs e)
{
if (richTextBox1_SelectionChanged_lock) return;
richTextBox1_SelectionChanged_lock = true;
//detect selection changes and store information needed for restoring
TrackRTBSelection(richTextBox1.SelectionStart, richTextBox1.SelectionLength);
//here do whatever you want with selection (some analysis to show font name in font selection comboBox etc.)
//...
//restore selection from saved informations
SetRTBSelectionBasedOnTracking();
richTextBox1_SelectionChanged_lock = false;
}
//sample button click handler for changing fore color of selected text
private void buttonSetForeColor_Click(object sender, EventArgs e)
{
if (colorDialog1.ShowDialog() == DialogResult.Cancel)
return;
//prevent selection change events while we are changing font colors
if (richTextBox1_SelectionChanged_lock) return;
richTextBox1_SelectionChanged_lock = true;
//save selection parameters for use in loop
int selStart = richTextBox1.SelectionStart;
int selLength = richTextBox1.SelectionLength;
for (int i = 0; i < selLength; i++)
{
richTextBox1.SelectionLength = 1;
richTextBox1.SelectionStart = selStart + i;
richTextBox1.SelectionColor = colorDialog1.Color;
}
//restore selection from saved informations
SetRTBSelectionBasedOnTracking();
richTextBox1_SelectionChanged_lock = false;
}
//********************
//selection tracking utilities
//********************
//false - caret at the beginning; true - caret at the end
private bool caretPosition = false;
private int lastSelectionStart = -1;
private int lastSelectionLength = -1;
//initialize selection informations. this must be called during Form_Load
private void InitRTBSelection()
{
richTextBox1.SelectionStart = 0;
richTextBox1.SelectionLength = 0;
caretPosition = false;
lastSelectionStart = 0;
lastSelectionLength = 0;
//force "selection changed" to detect "selection changes" for the first time
richTextBox1_SelectionChanged(richTextBox1, new EventArgs());
}
//this method detects changes in selection, based on selection parameters received from richTextBox
private void TrackRTBSelection(int newSelectionStart, int newSelectionLength)
{
int condition = 0;
int s_change = (newSelectionStart - lastSelectionStart > 0) ?
1 :
(newSelectionStart - lastSelectionStart < 0) ? -1 : 0;
int l_change = (newSelectionLength - lastSelectionLength > 0) ?
1 :
(newSelectionLength - lastSelectionLength < 0) ? -1 : 0;
//these conditions where created over change table for all user-achievable scenarios
condition = (newSelectionLength == 0 ||
(l_change == 1 && s_change == -1) ||
(l_change == -1 && s_change == 1 && caretPosition == false)) ? 1 : condition;
condition = (s_change == 0 && (l_change == 1 || (caretPosition == true && l_change == -1))) ? 2 : condition;
switch (condition)
{
case 1: caretPosition = false; break;
case 2: caretPosition = true; break;
default: break; //if no condition was satisfied then maintain current information
}
lastSelectionStart = newSelectionStart;
lastSelectionLength = newSelectionLength;
}
//set richTextBox selection using EM_EXSETSEL
private void SetRTBSelectionBasedOnTracking()
{
CHARRANGE chrrange = new CHARRANGE
{
cpMin = caretPosition ? lastSelectionStart : lastSelectionStart + lastSelectionLength,
cpMax = caretPosition ? lastSelectionStart + lastSelectionLength : lastSelectionStart
};
SendMessage(richTextBox1.Handle, EM_EXSETSEL, IntPtr.Zero, ref chrrange);
}
关于c# - RichTextBox保存 "Selection Direction",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3801293/
我对 RichTextBox 控件感到困惑。 我的 WinForm 有一个 RichTextBox 控件,宽度为 100px。我想动态创建一个然后引用实例。 因此,假设在我的 Form 上我有一个名为
MouseDown 事件处理程序的 KeyDown 事件处理程序中 e.Handled = true 的等价物是什么?我不希望鼠标事件对 RichTextBox 有任何影响(完全禁用鼠标与 RichT
我有一个 richtextbox,它的文本是特定表格中一些单词的串联。 (表格列是'word','translate'和'id') 我需要当用户将鼠标悬停在每个单词上时,相关的翻译会显示在单词的工具提
您好,我在将 richtextbox 中的数据显示或传输到其他 richtextbox 时遇到问题... richtextbox1.Document = richtextbox2.Document;
我正尝试在我的 Windows Phone 8 应用程序中使用 RichTextBox。用户需要能够选择文本并将其复制到剪贴板。用户不需要编辑文本,只需选择它。但是,我似乎无法在 Windows Ph
我有一个 Winforms 项目,我可以在其中将文本写入 RichTextBox,还有一些控件可以设置所写文本的字体格式。我能够将文本保存并附加到 RTF 文件,但我在保留每个 RichTextBox
假设我有以下内容:
我需要一些具有富文本编辑功能的基本 CMS 功能。在 stack overflow 上有一个常规的文本区域编辑控件,支持 Markdown 样式语法格式。那将超出我的用户范围,所以我想要一个类似丰富的
显示图像: 复制代码代码如下: Image img = Image.FromFi
我遇到过 RichTextBox 的一些奇怪行为。我希望它是readonly,但是当我使用时它不显示图像richTextBox.LoadFile(path) 方法加载.rtf 文件。当它不是reado
我需要将 ScrollBars 设置为 ForcedBoth 但我还想知道 ScrollBars 的句柄何时可见并且用户可以滚动。 两个滚动条的 bool 值都可以 这里用户不能滚动: 在这里他们可以
我正在开发根据正则表达式模式在 RichTextBox 中突出显示文本的应用程序。 它工作正常,除了性能,即使对于小文本(大约 500 个字符),它也会挂起一段时间,这对用户是可见的。 我在 Flow
我在我的 WPF richtextbox 上启用了拼写,我想在显示带有拼写建议的上下文菜单之前在当前插入符号位置获取拼写错误的单词。 最佳答案 新方式 void richTextBox1_Pr
我在 .NET Windows 窗体应用程序中使用 RichTextBox 控件。我允许用户在文本框本身内按 TAB 键。但是,当我将 .Text 值保存在文本框中时,它将显示如下: "This[]i
我在 MS Word 中创建了带有超链接的 rtf 文件并将其加载到 RichTextBox 中。 RichTextBox 中的超链接不起作用。 RichTextBox 和 MS Word 使用不同的
有没有办法改变 RichTextBox 中下划线的颜色? ? 我试过 this但它似乎不起作用。有人知道这些枚举值是从哪里来的吗?没有看到它的任何文档。 谢谢。 最佳答案 枚举值是将消息传递给控件时的
这是交易:我有一个 RichTextBox 控件,它工作正常。问题是有一个“插入当前日期时间”按钮,它将当前日期时间添加/注入(inject)到 RichTextBox 中。用户可以在插入符号指向的任
我正在编写一个小应用程序,我可以在其中加载文本文件以匹配正则表达式: 我根据匹配行的长度更改前景色文本, 问题是,如果一行是多行,那么它不会按预期工作并且只选择该行的一半,例如以“title”开头的第
我有一个 RichTextBox在我的应用程序中,它正在获取有关某些事件的新内容。 添加新内容时,我想滚动到底部,仅当 卷轴在底部 之前 . 我该怎么做呢? 更具体地说,给我带来麻烦的部分是确定滚动位
当加载 50KB 的文本文档时,WPF 的 RichTextBox 控件的性能确实很慢。滚动滞后并按 Ctrl-A 选择所有文本需要 10 多秒钟。 (这在记事本上是瞬时的)。 我没有做任何花哨的位图
我是一名优秀的程序员,十分优秀!