Превъртете 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
Дублираният въпрос води до връзка. Предпочитам King King отговорът да дава решение веднага.   -  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