9

グラフィックオブジェクトを使用して、ピクチャボックスコントロール内に画像を描画するために、一連のグラフィックオーバーレイを使用しています。パネル内にピクチャボックスを配置し、パネルを自動スクロールに設定しました。ここで知っておくべきことは、マウスのスクロール ホイールを使用して、描画される画像の品質を維持しながら、画像のサイズを少しずつ拡大することです。誰でもこれを行う方法を知っていますか?

以下の Abdias Software コードで更新すると、picturebox の Sizemode プロパティが StretchImage に設定されていると、画像が小さくなります。マウスのパン機能があり、このコードが正しく動作しないようにするのを妨げている可能性があります。何か案は?これが適切に機能しない原因は何ですか?

解決した

このコードは、以下の 2 つよりもはるかにうまく機能しました。

Private Sub PictureBox_MouseWheel(sender As System.Object,
                             e As MouseEventArgs) Handles PictureBox1.MouseWheel
    If e.Delta <> 0 Then
        If e.Delta <= 0 Then
            If PictureBox1.Width < 500 Then Exit Sub 'minimum 500?
        Else
            If PictureBox1.Width > 2000 Then Exit Sub 'maximum 2000?
        End If

        PictureBox1.Width += CInt(PictureBox1.Width * e.Delta / 1000)
        PictureBox1.Height += CInt(PictureBox1.Height * e.Delta / 1000)
    End If

End Sub
4

3 に答える 3

8

このコードを試すことができます。フォーム上 ( with内) にPanel1とが存在し、 にイメージが設定されていることを前提としています。PictureBox1PictureBox1Panel1Panel1.AutoScroll = TruePictureBox

コードはズームの中心点を計算しませんが、そのために e.Location (または eX/eY) を使用できます。

更新 - これは、以前のものよりも堅牢な (はずの) 新しいコードです (下を参照)。

Public Class Form1

    Private _originalSize As Size = Nothing
    Private _scale As Single = 1
    Private _scaleDelta As Single = 0.0005

    Private Sub Form_MouseWheel(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel

        'if very sensitive mouse, change 0.00005 to something even smaller   
        _scaleDelta = Math.Sqrt(PictureBox1.Width * PictureBox1.Height) * 0.00005

        If e.Delta < 0 Then
            _scale -= _scaleDelta
        ElseIf e.Delta > 0 Then
            _scale += _scaleDelta
        End If

        If e.Delta <> 0 Then _
        PictureBox1.Size = New Size(CInt(Math.Round(_originalSize.Width * _scale)), _
                                    CInt(Math.Round(_originalSize.Height * _scale)))

    End Sub

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage

        'init this from here or a method depending on your needs
        If PictureBox1.Image IsNot Nothing Then
            PictureBox1.Size = Panel1.Size
            _originalSize = Panel1.Size
        End If

    End Sub

End Class

古いコード - 動作しますが、おそらく Scale() の丸め誤差が原因で、大きな変更で不安定になります:

Public Class Form1

    Private _scale As New SizeF(1, 1)
    Private _scaleDelta As New SizeF(0.01, 0.01) '1% for each wheel tick

    Private Sub Form_MouseWheel(sender As System.Object, 
                                e As MouseEventArgs) Handles Me.MouseWheel
'count incrementally 
        _scale.Height = 1
        _scale.Width = 1

        If e.Delta < 0 Then
            _scale += _scaleDelta
        ElseIf e.Delta > 0 Then
            _scale -= _scaleDelta
        End If

        If e.Delta <> 0 Then _
        PictureBox1.Scale(_scale)

    End Sub

    Private Sub Form1_Load(sender As System.Object, 
                           e As EventArgs) Handles MyBase.Load

        PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage

        'init picturebox size = image size
        If PictureBox1.Image IsNot Nothing Then
            PictureBox1.Scale(New SizeF(1, 1))
            PictureBox1.Size = PictureBox1.Image.Size
        End If

    End Sub

End Class
于 2012-11-21T16:59:45.720 に答える
0

基本的に、画像ビューアが必要です。以前はこれを使用していました: http://cyotek.com/blog/creating-a-scrollable-and-zoomable-image-viewer-in-csharp-part-4

それはうまくいきます。ただし、これはユーザー コントロールです。

ピクチャーボックスの場合、画像からグラフィックスを作成し、それを補間する必要があります。ここに例があります: http://www.dotnetcurry.com/ShowArticle.aspx?ID=196

私はこれをチェックしませんでしたが、動作するようです。

于 2012-11-21T15:57:20.493 に答える