Прокрутите RichTextBox

Я хотел бы управлять прокруткой RichTextBox, но не могу найти какой-либо метод для этого в элементе управления.

Причина в том, что я хочу, чтобы прокрутка колесика мыши была эффективной, когда курсор мыши находится над элементом управления RichTextBox (у него нет активного фокуса: событие колеса мыши обрабатывается формой).

Любая помощь приветствуется!


person Martin Delille    schedule 17.10.2013    source источник
comment
Боковое примечание: приложение Windows, которое делает это общесистемным, - это KatMouse. К сожалению, я не знаю, как сделать это самостоятельно в вашей программе.   -  person Ray    schedule 17.10.2013
comment
возможный дубликат Обнаружение колеса мыши над окном без фокуса?   -  person JMK    schedule 17.10.2013
comment
Вы можете установить RichTextBox как выбранный элемент управления при наведении на него указателя мыши.   -  person Max    schedule 17.10.2013
comment
Повторяющийся вопрос ведет к ссылке. Я предпочитаю, чтобы Король Кинг ответил сразу же.   -  person Martin Delille    schedule 17.10.2013


Ответы (1)


С win32 все немного проще. А, вот и ты:

//must add using System.Reflection
public partial class Form1 : Form, IMessageFilter 
{
    bool hovered;
    MethodInfo wndProc;

    public Form1() 
    {
       InitializeComponent();
       Application.AddMessageFilter(this);
       richTextBox1.MouseEnter += (s, e) => { hovered = true; };
       richTextBox1.MouseLeave += (s, e) => { hovered = false; };
       wndProc = typeof(Control).GetMethod("WndProc", BindingFlags.NonPublic | 
                                                      BindingFlags.Instance);
    }

    public bool PreFilterMessage(ref Message m) 
    {
        if (m.Msg == 0x20a && hovered) //WM_MOUSEWHEEL = 0x20a
        {
           Message msg = Message.Create(richTextBox1.Handle, m.Msg, m.WParam, m.LParam);
           wndProc.Invoke(richTextBox1, new object[] { msg });
        }
        return false;
    }
}

ПРИМЕЧАНИЕ. Я использую IMessageFilter, чтобы поймать WM_MOUSEWHEEL сообщение в application-level. Я также использую Reflection для вызова защищенного метода WndProc для обработки сообщения WM_MOUSEWHEEL, вы всегда можете использовать функцию SendMessage win32 для отправки WM_MOUSEWHEEL в richTextBox1, но здесь требуется импорт declaration. Тебе решать.

person King King    schedule 17.10.2013
comment
Спасибо, отлично работает! Я просто использовал метод richTextBox1.Contains, чтобы проверить, наведен ли курсор. - person Martin Delille; 17.10.2013