Курсор RichTextBox постоянно меняется на IBeam - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть только для чтения RichTextBox с курсором, установленным на Arrow.Тем не менее, при наведении курсора курсор мигает и очень быстро переключается между Arrow и IBeam.Как я могу сделать так, чтобы он оставался на Arrow и не мерцал?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Ответ Джими хорошо работает, чтобы прекратить мерцание, но у меня нет хорошего ощущения при захвате мыши при движении мыши.Например, одна проблема, которую я вижу в этом решении, заключается в том, что если вы устанавливаете захват при перемещении мыши, то сочетания клавиш, такие как Alt + F4 или Alt + Пробел перестанет работать.

Я бы предпочел обработать WndProc и установить курсор при получении WM_SETCURSOR:

using System.Windows.Forms;
public class ExRichTextBox : RichTextBox
{
    const int WM_SETCURSOR = 0x0020;
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_SETCURSOR)
            Cursor.Current = this.Cursor;
        else
            base.WndProc(ref m);
    }
}

Прекращает мерцание.Не идеальное решение, но по крайней мере эти важные ярлыки будут продолжать работать.

0 голосов
/ 08 февраля 2019

Я предполагаю, что это WinForms RichTextBox, потому что у WPF нет этой проблемы .

RichTextBox обрабатывает WM_SETCURSOR сообщений, чтобы изменить курсор на Cursors.Hand если указатель мыши оказывается на ссылке.Примечание от разработчиков:

RichTextBox использует сообщение WM_SETCURSOR по ссылкам, чтобы мы могли изменить курсор на руку.Это происходит посредством синхронного уведомления.Таким образом, мы должны сначала передать сообщение в DefWndProc, а затем, если мы получим сообщение с уведомлением за это время (на что указывает изменение «LinkCursor»), мы установим его на руку. В противном случае мы вызываем реализацию WM_SETCURSOR в Controlчтобы установить его на выбор пользователя для курсора RichTextBox.

Вы можете установить Capture, когда Мышь входит в границы элемента управления, а затем отпустить его, когда указатель мыши покинет область. Захват должен бытьВ противном случае при первом щелчке по другому элементу управления курсор будет установлен в RichTextBox:

private void richTextBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (!richTextBox1.ClientRectangle.Contains(e.Location))
    {
        richTextBox1.Capture = false;
    }
    else if (!richTextBox1.Capture)
        richTextBox1.Capture = true;
}
...