DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ComboBoxに送られたWM_MOUSEWHEELでフォームをスクロールするには

環境/言語:[XP, Visucal C# 2005]
分類:[.NET]

Visual C#2005でアプリケーションを作成しています。

フォーム上にComboBoxやNumericUpDownがあります。
フォームは
AutoScroll=trueになっており、
スクロールバーが表示されています。

NumericUpDownにフォーカスがあるとき、
ホイールを動かすと数値が変化しました。
このアプリケーションでは
ホイールはフォームのスクロールに使用したいため、
OnMouseWheelをオーバーライドしました。

ComboBoxにフォーカスがあるときも同様に
OnMouseWheelをオーバーライドしたましたが、
うまく行きませんでした。

OnMouseWheelが呼び出される前に
選択項目が変わってしまっているようなので、
WndProcをオーバーライドし、
WM_MOUSEWHEELを破棄するようにしました。

それにより選択項目は変わらなくなったのですが、
フォームをスクロールさせる方法がわかりません。

どのようにすればよいのでしょうか?
よろしくお願いします。
2009/07/02(Thu) 15:04:31 編集(投稿者)
2009/07/02(Thu) 15:04:20 編集(投稿者)

自己レスです。

以下のようにしたら一応動いたのですが、
もっといい方法がありますでしょうか?

[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern Int32 SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);


SendMessageParent.Handle, m.Msg, m.WParam, m.LParam);
こんにちは。

comboBoxを継承したクラスを作成して、その中でホイールを禁止するのはどうでしょうか?

public class ComboBoxEx : ComboBox
{
public ComboBoxEx()
{
}

protected override void WndProc(ref Message m)
{
const int WM_MOUSEWHEEL = 0x20a;
if (m.Msg != WM_MOUSEWHEEL)
{
base.WndProc(ref m);
}
}
}
こんにちは。
回答ありがとうございます。

> comboBoxを継承したクラスを作成して、その中でホイールを禁止するのはどうでしょうか?

単に禁止するだけだと、
フォームのスクロールができないのですが、
スクロールさせたいです。

WndProcへ上記のようにメッセージを送信するコードを書いたところ、
一応希望した動作にはなったのですが、
APIを使わなきゃいけないのでしょうか?

DOBON.NET | プログラミング道 | プログラミング掲示板