C# RichTextBox странное поведение курсора над текстом

195
17 апреля 2018, 01:40

Имею простое приложение c# Windows form. Далее есть единственная форма с контролом richtextbox, который закреплен на всей форме(по размеру). В боксе есть три строки. При запуске приложения выделяю весь текст мышью, и провожу курсором над текстом. Появляются лаги непонятного происхождения (и курсор вечно обновляется). Код выложу по надобности, ибо его там нет, как такового. Это нормально? И как исправить лаги? Форма имеет задний буфер. Код:

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.richTextBox1.Text = "testtesttesttesttesttesttesttesttesttesttesttesttesttesttest\n" +
                "testtesttesttesttesttesttesttesttesttesttesttesttesttesttest\n" +
                "testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttest";
        }
    }
}

И это всё. Вот видео, там видно, как моргает курсор: https://youtu.be/AUeUUw8Pt2M Повторюсь, видно плохо, но видно. Я не знаю, как ещё показать. P.S.: кода просто больше нет. Это всё.

Answer 1

Итак, код, который поможет исправить эту проблему:

        private bool isRichTextBox;
        public Form1()
        {
            InitializeComponent();
            this.richTextBox1.Text = "testtesttesttesttesttesttesttesttesttesttesttesttesttesttest\n";
            isRichTextBox = false;
        }

        [DllImport("user32.dll")]
        public static extern int SetCursor(IntPtr cursor);
        private int WM_SETCURSOR = 0x0020;
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_SETCURSOR && this.isRichTextBox)
            {
                SetCursor(Cursors.IBeam.Handle);
                m.Result = new IntPtr(1); // возврат истины
                return;
            }
            base.WndProc(ref m);
        }
        private void richTextBox1_MouseLeave(object sender, EventArgs e)
        {
            SetCursor(Cursors.Arrow.Handle);
            this.isRichTextBox = false;
        }
        private void richTextBox1_MouseMove(object sender, MouseEventArgs e)
        {
            this.isRichTextBox = true;
        }

Мы отлавливаем событие изменения курсора в оконной процедуре и "не даём" менять курсор(вызываем WinAPI функцию для смены курсора на IBeam), а также возвращаем истину. Также, я добавил событие при выходе курсора за границы контрола(чтобы курсор менялся на Arrow). Также, член isRichTextBox следит за тем, чтобы курсор не обновлялся за границами контрола. Теперь всё работает. P.S.: но самое интересное, почему это вообще происходит - мною не было найдено. На 5 ПК, что я тестировал, но одном всплыла эта проблема. И не ясно почему. Поэтому, если кто-то знает - дополните ответ, буду только рад.

READ ALSO
Entity-framework анонимные объекты

Entity-framework анонимные объекты

Есть 2 моделькиКоманда и тренер

185
Изменение размера иконки svg через css

Изменение размера иконки svg через css

Есть сайт на WordPress и тема AppointmentДля того чтобы вставить свои иконки вместо Font-Awesome использовал следующий код в таблице стилей, но изменить...

278
CSS на мобильной версии сайта. Ошибка

CSS на мобильной версии сайта. Ошибка

Доброго времени сутокПытаюсь перенести сайт с конструктора на хостин, все вроде скопировал, немного видоизменил но возникла проблема, с боковым...

218
Блоки ходят сами собой [требует правки]

Блоки ходят сами собой [требует правки]

Ребят, есть блок с пельменями https://pilmenitabsgame

199