У меня есть дисплей, который настраивает текст, и по мере того, как пользователь настраивает его, я хочу, чтобы текст отображался. Одна из доступных настроек — это «x-out», при которой на всех 5 символах текста должен отображаться большой «X». Поэтому, когда флажок «X-Out» установлен, текст должен обновиться следующим образом:

На это:

Само поле представляет собой RichTextBox, содержащийся в Panel. Я пробовал использовать событие Paint на панели, но оно рисует его под RichTextBox (это маленькие красные линии по углам). Я также пробовал использовать собственный элемент управления RichTextBox, как на этом веб-сайте. Этот код работает, но только если я не устанавливаю текст и цвет в RichTextBox. Если я устанавливаю текст и цвет, а затем устанавливаю флажок, метод WndProc не вызывается. Как запустить метод WndProc с помощью Message.msg 15? Вот код:
Форма
публичный частичный класс ButtonDataForm: Форма { Кнопка CustomRichTextBox1; общедоступная форма ButtonDataForm() { ИнициализироватьКомпонент() } void OnFormLoad (отправитель объекта, EventArgs e) { cstmRichTextBox = новый CustomRichTextBox(richTextBox1); } недействительный OnXOutChecked() { cstmRichTextBox.IsChecked = xoutCheckbox.Checked; cstmRichTextBox.ParentTex.Refresh(); // Это не вызывает сообщение WndProc в cstmRichTextBox } } CustomRichTextBox
публичный класс CustomRichTextBox: NativeWindow { общественный RichTextBox ParentTextBox {получить; частный набор; } Графика textBoxGraphics; общественный bool IsChecked {получить; набор; } общедоступный CustomRichTextBox (RichTextBox tb) { РодительскийTextBox = ТБ; textBoxGraphics = Graphics.FromHwnd(tb.Handle); AssignHandle(ParentTextBox.Handle); } защищенное переопределение void WndProc(ref Message m} { переключатель(м.Сообщение) { случай 15: родительскийТекстБокс.Инвалидате(); base.WndProc(ref m); DrawXOut(); перерыв; по умолчанию: base.WndProc(ref m); перерыв; } } недействительный DrawXOut() { если (проверено) { Pen xpen = новое перо(ParentTextBox.ForeColor, 3); Точка topLeft = ParentTextBox.Location; int x1 = topLeft.X + ParentTextBox.Width; int y1 = topLeft.Y + ParentTextBox.Height; Точка topRight = новая точка(x1, topLeft.Y); Точка BottomLeft = новая точка(topLeft.X, y1); Точка нижняя правая = новая точка(x1, y1); textBoxGraphics.DrawLine(xpen, topLeft, BottomRight); textBoxGraphics.DrawLine(xpen, BottomLeft, TopRight); } } } РЕДАКТИРОВАТЬ:
Я попробовал разместить прозрачную панель на нижней панели и рисовать внутри нее, когда сработало событие Paint. Событие срабатывает, но на панели ничего не отображается. Я неправильно рассчитал местоположение?
void OnXOutChecked() { панель1.Обновить(); } void OnPanel1Paint (отправитель объекта, PaintEventArgs e) { Pen xpen = новое перо(Цвет.Красный, 3); Точка topLeft = Panel1.Location; int x1 = topLeft.X + Panel1.Width; int y1 = topLeft.Y + Panel1.Height; Точка topRight = новая точка(x1, topLeft.Y); Точка BottomLeft = новая точка(topLeft.X, y1); Точка нижняя правая = новая точка(x1, y1); e.Graphics.DrawLine(xpen, topLeft, BottomRight); e.Graphics.DrawLine(xpen, BottomLeft, TopRight); }
