- PR -

コンボボックスでマウスのスクロールを抑制したい

投稿者投稿内容
未記人
会議室デビュー日: 2008/09/22
投稿数: 7
投稿日時: 2008-10-17 15:29
引用:

KOH♪さんの書き込み (2008-10-17 14:04) より:
皆様、お知恵をありがとうございます。
WM_MOUSEWHEEL,WndProc,について理解することが出来ました。
実際コーディングしてみましたが、コントロール自体のイベントを止めることは出来ませんでした。(コードのSelectIndexChangedイベントはもちろんフラグなどを立てればとめれますが・・・)
ここからコンボの値を変化させないように応用できますでしょうか。



とりあえずこんな感じでマウスホイールでの項目変更は無視出来ましたけど
もちろんSelectIndexChangedイベントは発生しません。

public partial class ExComboBox : GrapeCity.Win.Editors.GcComboBox
{
  public ExComboBox()
  {
    InitializeComponent();
  }

  protected override void WndProc(ref Message m)
  {
    const int WM_MOUSEWHEEL = 0x020A;

    switch (m.Msg)
    {
      case WM_MOUSEWHEEL:
        System.Diagnostics.Debug.Print("ホイールなんて無視だ!");
        break;

      default:
        base.WndProc(ref m);
        break;
    }
  }
}
未記人
会議室デビュー日: 2008/09/22
投稿数: 7
投稿日時: 2008-10-17 16:04
あ、VBだったね

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
  Const WM_MOUSEWHEEL As Integer = &H20A
  Select Case m.Msg
    Case WM_MOUSEWHEEL
      Debug.Print("ホイールなんてKUSOKURAE!")
    Case Else
      MyBase.WndProc(m)
  End Select
End Sub
KOH♪
会議室デビュー日: 2008/07/31
投稿数: 16
お住まい・勤務地: 名古屋市
投稿日時: 2008-10-17 21:21
書き込みありがとうございます。
早速試してみましたが、コンボボックス内にカーソルを置き
ホイールをまわしてみると値は変化してしまいました。
(コンボボックス以外のコントロールにフォーカスがある場合は
正常にキャッチする事が出来ました・・・。)
コンボボックス内にフォーカスがある場合は、WND_PROCから値を
取得できないということなんでしょうか・・・<m(__)m>
Toshi
ベテラン
会議室デビュー日: 2007/09/18
投稿数: 68
お住まい・勤務地: 関東のどっか
投稿日時: 2008-10-17 21:34
WndProcはどこでoverrideしてます?
Formの継承クラスでしていませんか??
コード:

public partial class ExComboBox : GrapeCity.Win.Editors.GcComboBox


未記入さんが記載しているように、GrapeCityのコンボボックスコントロールの
継承クラスを準備して書いてみてください。

そして今配置しているGrapeCityのコンボボックスコントロールを
継承したコンボボックスに置き換えてください。

ダメであれば、確認したコードを載せてみて下さい。

[ メッセージ編集済み 編集者: Toshi 編集日時 2008-10-17 21:36 ]
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-10-17 21:37
引用:

コンボボックス内にフォーカスがある場合は、WND_PROCから値を
取得できないということなんでしょうか・・・<m(__)m>



のはずですよ。

コンボボックスはその名が示すとおり、複数のコントロールの組み合わせ(テキストボックス+ボタン+リストだっけ?)で出来てるので、台座部分の WndProc でメッセージを捕捉しても、リストやテキストボックス部分のメッセージを捕捉することは出来ません。

やるとしたら、メッセージを捕捉するべきコントロールのウィンドウハンドルを手に入れて、古典的なサブクラス化でホイール関係のメッセージを補足するしかないんじゃないかと。
Toshi
ベテラン
会議室デビュー日: 2007/09/18
投稿数: 68
お住まい・勤務地: 関東のどっか
投稿日時: 2008-10-17 22:23
引用:

渋木宏明(ひどり)さんの書き込み (2008-10-17 21:37) より:
引用:

コンボボックス内にフォーカスがある場合は、WND_PROCから値を
取得できないということなんでしょうか・・・<m(__)m>



のはずですよ。

コンボボックスはその名が示すとおり、複数のコントロールの組み合わせ(テキストボックス+ボタン+リストだっけ?)で出来てるので、台座部分の WndProc でメッセージを捕捉しても、リストやテキストボックス部分のメッセージを捕捉することは出来ません。

やるとしたら、メッセージを捕捉するべきコントロールのウィンドウハンドルを手に入れて、古典的なサブクラス化でホイール関係のメッセージを補足するしかないんじゃないかと。



キー入力とかはとれない気がするのですが、
マウスホイールのアクションはとれませんでしたっけ??

一応手元で以下のコード確認してマウスホイールのメッセージがとれたので、問題ないと思いますが・・・
※ Visual C#2005 Express System.Windows.Forms.ComboBoxの継承クラスで確認
コード:
public partial class MyComboBox : ComboBox
{ 
  private const int WM_MOUSEWHEEL = 0x020A; 
  private const int WM_KEYDOWN = 0x0100; 
  public MyComboBox() 
  { 
    InitializeComponent(); 
  } 

  protected override void WndProc(ref Message m) 
  { 
    switch (m.Msg) 
    { 
      case WM_MOUSEWHEEL: 
        System.Diagnostics.Debug.Print("WM_MOUSEWHEER::"m.Msg.ToString()); 
        break; 
      case WM_KEYDOWN: 
        System.Diagnostics.Debug.Print("WM_KEYDOWN::"m.Msg.ToString()); 
        break; 
      default: 
        base.WndProc(ref m); 
        break; 
    } 
  } 
}

未記人
会議室デビュー日: 2008/09/22
投稿数: 7
投稿日時: 2008-10-17 22:25
引用:

渋木宏明(ひどり)さんの書き込み (2008-10-17 21:37) より:
引用:

コンボボックス内にフォーカスがある場合は、WND_PROCから値を
取得できないということなんでしょうか・・・<m(__)m>



のはずですよ。

コンボボックスはその名が示すとおり、複数のコントロールの組み合わせ(テキストボックス+ボタン+リストだっけ?)で出来てるので、台座部分の WndProc でメッセージを捕捉しても、リストやテキストボックス部分のメッセージを捕捉することは出来ません。

やるとしたら、メッセージを捕捉するべきコントロールのウィンドウハンドルを手に入れて、古典的なサブクラス化でホイール関係のメッセージを補足するしかないんじゃないかと。



えーできたよぅ(´・ω・`)
今ぱぱっと普通のComboBoxで試してみたけどできたよぅ(´・ω・`)

・新規にプロジェクト作成(Windowsアプリ)
・プロジェクトに[追加]-[新しい項目]でカスタムコントロールを追加(ExComboBox.vb)
・デフォルトで継承元がSystem.Windows.Forms.ControlなのでこれをSystem.Windows.Forms.ComboBoxに書き換える(ExComboBox.Designer.vb)
・2008-10-17 16:04のコードをExComboBox.vbに貼り付ける
・ビルドするとツールボックスにExComboBoxが追加されるのでFormに配置
・適当にアイテム追加
・実行→ウマー

DropDownStyleがSimpleでもDropDownでもDropDownListでも補足できました
テキストボックス内にフォーカスがある場合でも、リスト展開時でも補足できました

俺何か勘違いしてる??
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-10-17 23:19
引用:

えーできたよぅ(´・ω・`)



ホイール系のメッセージで試したことないけど、テキストボックス向けのメッセージなんかは横取りできないはずなんだけど?

ホイール系のメッセージに関しては台座部分でとれちゃうのですね。
知りませんでした m(_ _)m

スキルアップ/キャリアアップ(JOB@IT)