6

ピクチャーボックス(またはすべての写真とメインフォーム)にカーソルを合わせ、マウスホイールを使用してスクロールします。しかし、私には運がありません。私はpictureBox1.MouseWheelを作成し、デルタをチェックしました。!= 0の場合にブレークポイントを設定しました。これまでのところ、何をしても何も起こらなかった。mousemoveも試しましたが、うまくいきませんでした。ただし、ifステートメントを壊すと機能します。私はただ車輪を動かすことができません。

ピクチャーボックス(またはフォーム内のコントロール)にマウスホイールイベントを呼び出させるにはどうすればよいですか?

-編集-気にしないでください。ほとんどの場合、イベントが発生するオブジェクトにイベントを追加しました。それはかなりうまくいきます。この質問を書く前に、なぜこれを考えなかったのかわかりません。私はまだマウスオーバー+ホイールソリューションを受け入れています。

4

5 に答える 5

13

Windowsは、ホバーされたコントロールにマウススクロールメッセージを送信せず、フォーカスのあるコントロールに移動します。あなたはすでにフォーカスを修正する方法を知っています。

この動作は、ブラウザとOfficeプログラムの動作方法が原因で直感的ではなくなりつつあります。これを変更するコードは、このスレッドの私の回答にあります。アプリのどのウィンドウでも機能することに注意してください。望ましくない場合は、ハンドル値にフィルタリングを追加する必要があります。


更新:この動作はWin10で変更されました。「非アクティブなウィンドウにカーソルを合わせるとスクロールする」という名前の新しいシステム設定があり、デフォルトでオンになっています。そのため、フォーカスは重要ではなくなり、ブラウザでの動作と非常によく似た動作をするようになりました。アプリのテストは重要です。システムオプションを一時的に無効にすることで、古いバージョンのWindowsで何が起こるかを確認できます。

于 2010-08-03T20:09:19.753 に答える
2

この答えはそれを行う方法を説明しています。つまり、画像ボックスに焦点を合わせるだけのMouseEnterイベントを画像ボックスに作成します。その後、ピクチャーボックスはMouseWheelイベントを問題なく受信します。

于 2014-01-23T23:19:12.953 に答える
0

ここでの答えは私にはうまくいきません。スクロール可能なペインにピクチャーボックスがあり、正しく機能するために行う作業はほとんどありません。

あなたがしなければならないことはOnMouseWheel()、フォームの関数を上書きすることです。そこでホイールイベントが発生し、マウスがピクチャーボックス内にあるかどうかを確認する必要があります。しかし、それだけでは十分ではありません。画像のごく一部のみを表示するスクロール可能なペイン内に5000x5000ピクセルの画像を表示していると想像してください。次に、マウスがペインとそのすべての親の上にあるかどうかも確認する必要があります。以下のコードは、pictureBoxの親コントロールのスクロールバーのスクロール位置とは関係なく機能します。

/// <summary>
/// This must be overridden in the Form because the pictureBox never receives MouseWheel messages
/// </summary>
protected override void OnMouseWheel(MouseEventArgs e)
{
    // Do not use MouseEventArgs.X, Y because they are relative!
    Point pt_MouseAbs = Control.MousePosition; 
    Control i_Ctrl = pictureBox;
    do
    {
        Rectangle r_Ctrl = i_Ctrl.RectangleToScreen(i_Ctrl.ClientRectangle);
        if (!r_Ctrl.Contains(pt_MouseAbs))
        {
            base.OnMouseWheel(e);
            return; // mouse position is outside the picturebox or it's parents
        }
        i_Ctrl = i_Ctrl.Parent;
    }
    while (i_Ctrl != null && i_Ctrl != this);

    // here you have the mouse position relative to the pictureBox if you need it
    Point pt_MouseRel = pictureBox.PointToClient(pt_MouseAbs);

    // Do your work here
    ....
}
于 2015-05-20T17:45:49.393 に答える
0

FormのMouseWheelをオーバーライドして、eXとeYがPictureBoxのロケーション領域内にあるかどうかを確認するだけです。

  protected override void OnMouseWheel(MouseEventArgs e)
    {
        if (e.X >= soundGraph.Location.X && e.X <= soundGraph.Location.X + soundGraph.Width
            &&
            e.Y >= soundGraph.Location.Y && e.Y <= soundGraph.Location.Y + soundGraph.Height)
        { // do what you have to
        }
        base.OnMouseWheel(e);
    }
于 2019-03-09T21:36:28.073 に答える
0

これは、画像ボックスがフォームの0,0の位置にない場合にも機能します。

' =====================================================================================
'  Windows10 has a new system setting 
'   named "Scroll inactive windows when I hover over them", turned on by default.
' -------------------------------------------------------------------------------------
'  The following correction does the same for Windows 8 / 7 / XP
' =====================================================================================
Protected Overrides Sub OnMouseWheel(ByVal e As MouseEventArgs)
    Dim p As Point
    p = pbox_Graph.PointToClient(Me.PointToScreen(e.Location))
    If pbox_Graph.ClientRectangle.Contains(p) Then
        pbox_TimeGraph_MouseWheel(Me, e)
    Else
        MyBase.OnMouseWheel(e)
    End If
End Sub
于 2020-05-02T09:46:15.163 に答える