none
MouseWheelイベントが効かない RRS feed

  • 質問

  • VS2005のC#でGUIアプリを作成しています。

    Formに直接PictureBoxコントロールを貼り付けて、

    public partial class Form1 : Form {
      public Form1() {
        this.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
        …
      }
      void Form1_MouseWheel(object sender, MouseEventArgs e) { ... }
    }

    のようにFormにマウスホイールのイベントを付けるとOKなのですが、
    Form上にSplitContainerを貼り付けて、SplitContainer上にPictureBoxを貼り付けると
    マウスホイールイベントが効かなくなります。

    SplitContainerにマウスホイールイベントを付けても、PictureBoxに付けても同様にダメです。
    SplitContainerのSplitterPanelの境界線をクリックしてActive?な状態にすると
    マウスホイールイベントがとれるのですが、何か回避策はあるのでしょうか?

    何かヒントでも良いので分かる方、よろしくお願いします。

    2009年8月17日 3:04

回答

  • PictureBox で MouseWheelイベントが発生しないのは、入力フォーカスを受け取れないコントロールだからだと思いますが、SplitContainer や Form では MouseWheel イベントが発生するはずです。

    .Designer.cs も含めてソースコードを提示してもらえると、回答が付くかもしれません。


    Control.MouseWheel イベント (System.Windows.Forms)

    引用:"コントロールにフォーカスがあるときに マウス ホイールが動くと発生します。"


    PictureBox クラス (System.Windows.Forms)

    引用:"PictureBox は選択可能なコントロールではないため、入力フォーカスを受け取ることもできません。 "
    2009年8月17日 4:11
  • パネルにたいしてイベントを登録する

    public Form1()
    {
        InitializeComponent();
    
        this.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
        this.splitContainer1.Panel1.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
        this.splitContainer1.Panel2.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
    }
    
    void Form1_MouseWheel(object sender , MouseEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString() + " " + sender.ToString());
    }
    2009年8月17日 4:12
  • TreeViewにフォーカスがあるから拾えないだけです。
    #はじめからToolStripやTeeViewもあると書いてください。

    InitializeComponent()でまだ隠してる部分があるようですが、何か他のものがあればそちらにもフォーカスが移動します。

    public Form1()
    {
        InitializeComponent();
    
        this.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
    
        this.splitContainer1.Panel1.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
        this.splitContainer1.Panel2.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
    
        this.treeView1.MouseWheel += delegate(object sender , MouseEventArgs e) { MessageBox.Show("TreeViewにフォーカスがあるよ!"); };
    }
    2009年8月17日 5:31

すべての返信

  • PictureBox で MouseWheelイベントが発生しないのは、入力フォーカスを受け取れないコントロールだからだと思いますが、SplitContainer や Form では MouseWheel イベントが発生するはずです。

    .Designer.cs も含めてソースコードを提示してもらえると、回答が付くかもしれません。


    Control.MouseWheel イベント (System.Windows.Forms)

    引用:"コントロールにフォーカスがあるときに マウス ホイールが動くと発生します。"


    PictureBox クラス (System.Windows.Forms)

    引用:"PictureBox は選択可能なコントロールではないため、入力フォーカスを受け取ることもできません。 "
    2009年8月17日 4:11
  • パネルにたいしてイベントを登録する

    public Form1()
    {
        InitializeComponent();
    
        this.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
        this.splitContainer1.Panel1.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
        this.splitContainer1.Panel2.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
    }
    
    void Form1_MouseWheel(object sender , MouseEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString() + " " + sender.ToString());
    }
    2009年8月17日 4:12
  • J.Hashimotoさん、ご回答ありがとうございます。   

    少し長いですが、.Designer.csの関係ありそうな箇所のコードは以下のようになっています。

    partial class Form1 {
         private void InitializeComponent() {
                this.components = new System.ComponentModel.Container();
                System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
                this.pictureBox1 = new System.Windows.Forms.PictureBox();
                this.timer1 = new System.Windows.Forms.Timer(this.components);
                this.toolStrip1 = new System.Windows.Forms.ToolStrip();
                this.toolStripButton1 = new System.Windows.Forms.ToolStripButton();
                this.toolStripButton2 = new System.Windows.Forms.ToolStripButton();
                this.toolStripButton3 = new System.Windows.Forms.ToolStripButton();
                this.toolStripButton4 = new System.Windows.Forms.ToolStripButton();
                this.toolStripButton7 = new System.Windows.Forms.ToolStripButton();
                this.toolStripButton8 = new System.Windows.Forms.ToolStripButton();
                this.toolStripButton9 = new System.Windows.Forms.ToolStripButton();
                this.toolStripButton5 = new System.Windows.Forms.ToolStripButton();
                this.toolStripButton6 = new System.Windows.Forms.ToolStripButton();
                this.splitContainer1 = new System.Windows.Forms.SplitContainer();
                this.treeView1 = new System.Windows.Forms.TreeView();
                ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
                this.toolStrip1.SuspendLayout();
                this.splitContainer1.Panel1.SuspendLayout();
                this.splitContainer1.Panel2.SuspendLayout();
                this.splitContainer1.SuspendLayout();
                this.SuspendLayout();
                //
                // pictureBox1
                //
                this.pictureBox1.Location = new System.Drawing.Point(110, 102);
                this.pictureBox1.Name = "pictureBox1";
                this.pictureBox1.Size = new System.Drawing.Size(344, 271);
                this.pictureBox1.TabIndex = 0;
                this.pictureBox1.TabStop = false;
                this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseMove);
                this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
                this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);
                this.pictureBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseUp);
                …
                //
                // splitContainer1
                //
                this.splitContainer1.Location = new System.Drawing.Point(0, 28);
                this.splitContainer1.Name = "splitContainer1";
                //
                // splitContainer1.Panel1
                //
                this.splitContainer1.Panel1.Controls.Add(this.treeView1);
                //
                // splitContainer1.Panel2
                //
                this.splitContainer1.Panel2.Controls.Add(this.pictureBox1);
                this.splitContainer1.Size = new System.Drawing.Size(713, 536);
                this.splitContainer1.SplitterDistance = 145;
                this.splitContainer1.TabIndex = 2;
                //
                // treeView1
                //
                this.treeView1.Location = new System.Drawing.Point(12, 102);
                this.treeView1.Name = "treeView1";
                this.treeView1.Size = new System.Drawing.Size(121, 271);
                this.treeView1.TabIndex = 0;
                this.treeView1.BeforeCheck += new System.Windows.Forms.TreeViewCancelEventHandler(this.treeView1_BeforeCheck);
                //
                // Form1
                //
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(713, 570);
                this.Controls.Add(this.splitContainer1);
                this.Controls.Add(this.toolStrip1);
                this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
                this.KeyPreview = true;
                this.Name = "Form1";
                this.Text = "Squid";
                ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
                this.toolStrip1.ResumeLayout(false);
                this.toolStrip1.PerformLayout();
                this.splitContainer1.Panel1.ResumeLayout(false);
                this.splitContainer1.Panel2.ResumeLayout(false);
                this.splitContainer1.ResumeLayout(false);
                this.ResumeLayout(false);
                this.PerformLayout();
         }
         …
    }

    デザイナの画面からSplitContainerを選択しても、MouseWheelというイベントが見つからないため、直接コードに自前で、Form1.csに
    this.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
    というコードを書いてしまっています。
    これが問題なのでしょうか?しかし、回避策が分かりません。

    よろしくお願いします。
    2009年8月17日 4:42
  • gekkaさん、ご回答ありがとうございます。

    パネルに対してイベント登録してみましたが、残念ながらダメでした。

    よろしくお願いします。
    2009年8月17日 4:46
  • TreeViewにフォーカスがあるから拾えないだけです。
    #はじめからToolStripやTeeViewもあると書いてください。

    InitializeComponent()でまだ隠してる部分があるようですが、何か他のものがあればそちらにもフォーカスが移動します。

    public Form1()
    {
        InitializeComponent();
    
        this.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
    
        this.splitContainer1.Panel1.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
        this.splitContainer1.Panel2.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
    
        this.treeView1.MouseWheel += delegate(object sender , MouseEventArgs e) { MessageBox.Show("TreeViewにフォーカスがあるよ!"); };
    }
    2009年8月17日 5:31
  • gekkaさん、ご回答ありがとうございます。

    >#はじめからToolStripやTeeViewもあると書いてください。

    すみません。
    関係していると思っていなかったので、書いていませんでした。

    >TreeViewにフォーカスがあるから拾えないだけです。

    サンプルの通りで、イベントをとることができました。
    ありがとうございます。

    これで解決できました。
    ありがとうございました。
    2009年8月17日 5:44
  • こんにちは、フォーラムオペレーターの高橋春樹です。

    J.Hashimotoさん、gekkaさん、アドバイス有難うございました。
    また、サンプルコードも投稿して頂き、有難うございます。初心者の方にも、わかり易くなるので大変助かります。

    morchinさん、こんにちは。イベントが取れるようになって良かったです。
    問題が解決したようなので、大丈夫と思いますが、アドバイスをして頂いたJ.Hashimotoさん、gekkaさんの投稿に、回答マークを付けさせて貰いました。
    次回は、morchinさんの方で、回答マークを付けてくと大変助かります。仕組みが分かり難くてすみません(^-^;)

    今後ともMSDNフォーラムを宜しくお願いします。


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    2009年9月2日 6:02