none
MDIフォームによるスクロールバーのマウスホイール制御 RRS feed

  • 質問

  • お世話になります。

     

    現在、C#にてMDIフォームにてスクロールバーのスクロールをマウスホイールイベントでも行えるようにしたいと思っています。

    SendMessageを用いてスクロールさせることに成功したのですが、一部動作がおかしくなる場合があります。

    具体的には、スクロールバーが表示されていない状態でMDI子フォームを表示し、マウスホイールイベントを行うとMDI子フォームが消えてしまいます。

    また、いちどMDI子フォームが消えた状態で再度他の子フォームを表示させるとスクロールバーが正しく描画出来無くなります。

    何かご存知の方がいればアドバイスを頂けるとありがたいです。

    以下、コード内容です。

            private const int WM_SCROLL = 276; // Horizontal scroll
            private const int WM_VSCROLL = 277; // Vertical scroll
            private const int SB_LINEUP = 0; // Scrolls one line up
            private const int SB_LINEDOWN = 1; // Scrolls one line down

            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
            private void MenuForm_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
            {
                //MdiClientの取得
                System.Windows.Forms.MdiClient mc = GetMdiClient(this);

                if (0 < e.Delta)
                {
                    SendMessage(mc.Handle, WM_VSCROLL, (IntPtr)SB_LINEUP, IntPtr.Zero);
                }
                else if (e.Delta < 0)
                {
                    SendMessage(mc.Handle, WM_VSCROLL, (IntPtr)SB_LINEDOWN, IntPtr.Zero);
                }
            }

            /// <summary>
            /// フォームのMdiClientコントロールを探して返す
            /// </summary>
            /// <param name="f">MdiClientコントロールを探すフォーム</param>
            /// <returns>見つかったMdiClientコントロール</returns>
            public static System.Windows.Forms.MdiClient
                GetMdiClient(System.Windows.Forms.Form f)
            {
                foreach (System.Windows.Forms.Control c in f.Controls)
                    if (c is System.Windows.Forms.MdiClient)
                        return (System.Windows.Forms.MdiClient)c;
                return null;
            }

    2010年8月2日 9:46

回答

すべての返信

  • 手元に環境が無いので試してはいませんが、別の掲示板で過去に同じような質問があったので紹介します。

    http://soudan1.biglobe.ne.jp/qa5089250.html

    上記ページの回答が参考になるかもしれません。


    なかむら(http://d.hatena.ne.jp/griefworker)
    • 回答の候補に設定 山本春海 2010年8月26日 6:37
    • 回答としてマーク 山本春海 2010年8月30日 6:48
    2010年8月3日 0:25
  • こんにちは、tomox1001 さん。

    その後いかがでしょうか。なかむら さんからの情報は確認されましたか。なかむら さん、情報ありがとうございます。
    なかむら さんからの情報は参考になる情報かと思われますので、勝手ながら私のほうで回答としてマークさせていただきました。

    今後同じような問題でこのスレッドを参照される方に参考になる情報や、解決に役立った情報がわかりやすくなるかと思いますので、有効な情報には回答としてマークすることをお願いしています。

    お時間のある時にでも、その後の状況をお知らせくださいね。また、問題が解決していない場合には、ご質問続けていただいて問題ないので、ご連絡くださいね。
    今後とも、MSDN フォーラムのご利用をよろしくお願いいたします。それでは。
                                                        
    マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2010年8月30日 6:47