1

ScrollBars が None に設定された RichTextBox があります。MSDNによると

DefWindowProc 関数は、ウィンドウの親にメッセージを伝達します。DefWindowProc はメッセージを処理するウィンドウが見つかるまでメッセージを親チェーンに伝達するため、メッセージの内部転送はありません。

これは、メッセージ ポンプ ( IMessageFilter ) にフックして、リッチテキスト ボックスを含む親フォームに WM_MOUSEWHEEL イベントを手動で転送する必要はないと解釈します。RichTextBox 内でマウス スクロールを実行すると、フォームがスクロールしません。なぜだめですか?フォームをスクロールするにはどうすればよいですか?

RichTextBox ではスクロールバーが none に設定され、フォームでは有効になっていることに注意してください。では、フォームがスクロール イベントを受け取らないのはなぜでしょうか。

public partial class Form4 : Form
{
    public Form4()
    {
        InitializeComponent();
        this.AutoScroll = true;
        richTextBox1.ScrollBars = RichTextBoxScrollBars.None;
    }
}
4

2 に答える 2

4

派生した TextBox では、上記のようにマウス ホイールを無視するのではなく、それを親コントロールに渡したいと思いました。派生した TextBox の WndProc に入れているものは次のとおりです。

switch (m.Msg)
{
    case 0x020A: // WM_MOUSEWHEEL
    case 0x020E: // WM_MOUSEHWHEEL
        if (this.ScrollBars == ScrollBars.None && this.Parent != null)
            m.HWnd = this.Parent.Handle; // forward this to your parent
        base.WndProc(ref m);
        break;

    default:
        base.WndProc(ref m);
        break;
}
于 2012-11-08T16:35:38.727 に答える
1

DefWindowProcRichTextBox は WM_MOUSEWHEEL 自体を処理し、それを親に転送する呼び出しを行わないため、フォームはスクロールしません。スクロールバーを無効にしても、明らかにそれは変わりません。

IMessageFilterしたがって、次のように WM_MOUSEWHEEL を転送する RichTextEdit のサブクラスを実装または作成する必要があります

public class NoScrollRichTextBox : RichTextBox
{
   const int WM_MOUSEWHEEL = 0x020A;

   protected override void WndProc(ref Message m)
   {
      // This will completely ignore the mouse wheel, which will disable zooming as well
      if (m.Msg != WM_MOUSEWHEEL)
         base.WndProc(ref m);
   }
}
于 2012-09-21T14:33:57.043 に答える