C # WinForms RichTextBox средняя прокрутка мыши: запрет курсора - PullRequest
0 голосов
/ 02 июня 2018

В C # WinForms у меня есть пользовательский RichTextBox, где я сам выполняю прокрутку средней мышью.Когда это будет сделано, я хочу показать свой собственный курсор.Я переключаюсь на этот курсор в событии MouseDown, когда нажата средняя кнопка.

    void richText_MouseDown(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Middle) {
            Cursor.Current = MainForm.cursors["hand_NS"];
        }
    }

Тем не менее, текстовое поле затем мгновенно переключается на курсор Windows «стрелка».Это, кажется, является частью RichTextBox autom.поведение, либо в MouseDown или в MouseMove.Я могу переопределить это, постоянно показывая мой курсор в MouseMove, но это выглядит мерцающим, поскольку два курсора сражаются друг с другом.Могу ли я как-то заблокировать этот автоматический переключатель для курсора «стрелка»?

РЕДАКТИРОВАТЬ: Попробовал установить свойство Cursor:

 void richText_MouseDown(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Middle) {
            richText.Cursor = MainForm.cursors["hand_NS"];
            //Cursor.Current = MainForm.cursors["hand_NS"];
        }
    }

Восстановление курсора двутавровой балки:

void richText_MouseUp(object sender, MouseEventArgs e) {
    if (e.Button == MouseButtons.Middle) {
        richText.Cursor = Cursors.IBeam;
        //Cursor.Current = Cursors.IBeam;
    }

}

1 Ответ

0 голосов
/ 03 июня 2018

Наконец заставил его работать прилично (практически без мерцания), бросая в него всю артиллерию, которую я мог найти.То, что сделано в MouseMove (ниже), также сделано в MouseDown.

    public const uint LVM_SETHOTCURSOR = 4158;
    [DllImport("user32.dll")]
    public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);


    void richText_MouseMove(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Middle) {
                this.TopLevelControl.Cursor = Cursors.PanNorth;
                richText.Cursor = Cursors.PanNorth;
                SendMessage(richText.Handle, LVM_SETHOTCURSOR, IntPtr.Zero, Cursors.PanNorth.Handle);
                Cursor.Current = Cursors.PanNorth;
         }
    }

Переопределение сообщения SETCURSOR в элементе управления RTB:

    [DllImport("user32.dll")]
    public static extern int SetCursor(IntPtr cursor);
    private const int WM_SETCURSOR = 0x20;

    protected override void WndProc(ref System.Windows.Forms.Message m) {
        if (m.Msg == WM_SETCURSOR) {
            SetCursor(Cursors.PanNorth.Handle);
            m.Result = new IntPtr(1);
            return;
        }
        base.WndProc(ref m);
    }

Источники:

Изменение и мерцание курсора ListView

Курсор мыши мигает над выделенным текстом - как это предотвратить?

...