2009-12-02 5 views
5

私はパネルに20個のピクチャボックスを動的に追加しました。マウスホイールを使用するとパネルのスクロールが見たいです。これを実装するために、パネルコントロールでオートスケールをtrueに設定しようとしました。ここにコードがあります。 = 1整数として私のために 〜20:ダイナミックに追加されたピクチャボックスコントロールを持つパネルのマウスホイールスクロール?

 Dim b As New PictureBox() 
     b.Image = Nothing 
     b.BorderStyle = BorderStyle.FixedSingle 
     b.Text = i.ToString() 
     b.Size = New Size(60, 40) 
     b.Location = New Point(0, (i * b.Height) - b.Height) 
     b.Parent = Panel1 
     Panel1.Controls.Add(b) 
    Next 

私はボタンコントロールと同じことをしたし、それだけで正常に動作します。 100 = 1の整数として、私の場合 :

 Dim b As New Button() 

     b.Text = i.ToString() 
     b.Size = New Size(60, 40) 
     b.Location = New Point(0, (i * b.Height) - b.Height) 
     b.Parent = Panel1 
     Panel1.Controls.Add(b) 
    Next 

それは、「ボタン」コントロールのためではなく、「ピクチャ」や「ラベル」コントロールのために働きますか? 「マウスホイール」を使用してスクロール効果を実装するにはどうすればよいですか?

答えて

6

マウスホイールまたはその中のコントロールにフォーカスがあるとき、パネルがマウスホイールでスクロールします。実行している問題は、ピクチャボックスやパネルをクリックしてもフォーカスが失われないことです。パネル上でselect()に電話をかけると、マウスホイールが再び作動することがわかります。

一つの可能​​な解決策は、マウスカーソルがそれに入るたびControl.MouseEnterイベントを処理することで、パネルを選択するために、次のようになります。

void panel1_MouseEnter(object sender, EventArgs e) 
{ 
    panel1.select(); 
} 
3

「cwick」は、ウィンドウにWM_MOUSWHEEL通知のWindows支柱かなり右ですそれは焦点があります。フォーカスを得ることができるので、パネルにボタンを置くと機能します。次に起こるのは、Windowsがメッセージを受け取るためにParentコントロールを探し続けていることです。ボタンはそれを気にしません、それは親ですパネルとそれはうれしくスクロールし、メッセージを消費します。

子コントロールのフォーカスを取り除く能力を持つ医師以外の人は、それらをオーバーライドしてSetStyle(ControlStyles.Selectable)を呼び出す必要がありますが、このメッセージの処理方法を変更することを検討できます。多くの商用アプリケーションでは、ウィンドウが数個しかないため、この問題(ブラウザ、Officeアプリケーション)は一見できません。 WFアプリは、通常、各コントロールごとに1つ多くあります。それは、集中制御に送信される前に、メッセージを早く処理することによって行います。 IMessageFilterインターフェイスでこれが可能です。

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace WindowsApplication1 { 
    public partial class Form1 : Form, IMessageFilter { 
    public Form1() { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
    } 

    public bool PreFilterMessage(ref Message m) { 
     if (m.Msg == 0x20a) { 
     // WM_MOUSEWHEEL, find the control at screen position m.LParam 
     Point pos = new Point(m.LParam.ToInt32()); 
     IntPtr hWnd = WindowFromPoint(pos); 
     if (hWnd != IntPtr.Zero && hWnd != m.HWnd && Control.FromHandle(hWnd) != null) { 
      SendMessage(hWnd, m.Msg, m.WParam, m.LParam); 
      return true; 
     } 
     } 
     return false; 
    } 

    // P/Invoke declarations 
    [DllImport("user32.dll")] 
    private static extern IntPtr WindowFromPoint(Point pt); 
    [DllImport("user32.dll")] 
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 
    } 
} 

は、このコードはあなたのアプリで任意のウィンドウのアクティブであることに注意してください:このサンプルコードは、マウスの下のコントロールの代わりに、フォーカスを持つコントロールをスクロールします。試してみて、それがユーザーをあまりにも混乱させないことを確認してください。

関連する問題