tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルはじめまして
記事No3748
投稿日: 2006/05/28(Sun) 00:06
投稿者
参照先http://ykbys.fc2web.com/
[OSのVer]:WindowsXP  [VBのVer]:VS.NET 2005 Standard Academic  
はじめまして、突然すみませんが、ひとつ聞きたいことがあります。
今、図面関連のソフトを作っているのですが、スクロールがうまくいきません。
下や、右には行くのですが、上や、左には動きません。どうしたらいいのでしょうか?
一応コード書いておきます。突然ですがご指導の方お願いできたらと思います。

Private Sub PictureBox1_MouseMove(ByVal sender As System.Object, ByVal _
    e As System.Windows.Forms.MouseEventArgs) _
    Handles PictureBox1.MouseMove
        Dim setting As Integer = Panel2.Width - e.X
        Dim mepos As String = Me.Bottom
        Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)
        Dim asbpen As Pen
        asbpen = New Pen(Color.Black, 1.5)
        asbpen.DashStyle = Drawing2D.DashStyle.Dash

        If e.Button = Windows.Forms.MouseButtons.Left And RadioButton1.Checked = True Then
            PictureBox1.CreateGraphics.DrawLine(asbpen, c.X, c.Y, e.X, e.Y)
            PictureBox1.CreateGraphics.Dispose()
            PictureBox1.Refresh()
            If e.X >= Panel2.Width Then
                PictureBox1.Refresh()
                Panel2.AutoScrollPosition = New Point(-Panel2.AutoScrollPosition.X + 50, _
                -Panel2.AutoScrollPosition.Y)
            End If
            If e.Y >= Panel2.Height Then
                PictureBox1.Refresh()
                Panel2.AutoScrollPosition = New Point(-Panel2.AutoScrollPosition.X, _
                -Panel2.AutoScrollPosition.Y + 50)
            End If
            If e.X <= Panel2.Location.X Then
                PictureBox1.Refresh()
                Panel2.AutoScrollPosition = New Point(Panel2.AutoScrollPosition.X _
                - 50, -Panel2.AutoScrollPosition.Y)
            End If
            If e.Y <= Panel2.Location.Y Then
                PictureBox1.Refresh()
                Panel2.AutoScrollPosition = New Point(Panel2.AutoScrollPosition.X, _
                -Panel2.AutoScrollPosition.Y - 50)
            End If
            If _
            Not e.X >= Panel2.Width Or Not e.Y >= Panel2.Height Or Not_
e.X<=Panel2.Location.X _
            Or Not e.Y <= Panel2.Location.Y Then
                Exit Sub
            End If
        End If
            End Sub

一部関係のないものがありますが、ご了承ください。

[ツリー表示へ]
タイトルRe: はじめまして
記事No3749
投稿日: 2006/05/28(Sun) 13:16
投稿者YAS

申し訳ありませんが,どういう動作を望んでいるのかわかりにくいので,そのコードで何をしたいのか
もう少し詳しく教えてくれませんか?

[ツリー表示へ]
タイトルRe^2: はじめまして
記事No3750
投稿日: 2006/05/28(Sun) 18:52
投稿者
参照先http://ykbys.fc2web.com/
すみません。
えっと前のレスにも書きました図面関係のソフトを作っており(CADSystemといった方ですかね・・・)
panelコントロールの中に、pictureboxを入れており、pictureboxのほうがpanelより大きいためpanelの
オートスクロールをtrueにしています。
どういう動作を望んでいるのかというと、線を書けるようにするのに、ポインタが、panel領域をはみ出
したときに、はみ出した方向に動かしたいのです。
それで、上に書いた動作をするのに自力で作った結果、最初のレスのようなコードになりました。
いちおう右、下にはみ出したときは、右、下にそれぞれ動くのですが、上、左にはまったく動きませ
ん。
こう長々と説明しましたが、
簡潔に言うと、「範囲選択(実際は、直線などさまざま)した際に領域からはみ出したときに、
はみ出した方向にスクロールすると言った、動作にしたいわけです。
理解いただけたでしょうか?

[ツリー表示へ]
タイトルRe^3: はじめまして
記事No3751
投稿日: 2006/05/29(Mon) 00:32
投稿者YAS
>If e.X <= Panel2.Location.X Then
>If e.Y <= Panel2.Location.Y Then

上,左に動かないのは上の条件が間違っているからです。
e.XはPictureBox1のクライアント領域の座標を返します。しかし,PictureBox1はスクロールしています
ので,単純にIf e.X <=0 then としても動きません。e.Xをスクリーン座標に変換して,さらにパネルの
クライアント座標に変換して比較する必要があると思います。

単に画像をスクロールさせるだけなら以下のような方法もあると思います。
コピー&ペーストで動作します。参考にしてください。

Public Class Form1

    Dim img As New Bitmap("c:\xxxxxx.JPG")
    Dim offset As New Point
    Dim WithEvents ExPanel1 As New ExPanel

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles MyBase.Load
        Me.ExPanel1.Location = New Point(10, 10)
        Me.ExPanel1.Size = New Size(Me.ClientSize.Width - 20, Me.ClientSize.Height - 20)
        Me.Controls.Add(Me.ExPanel1)
        Dim g As Graphics = Graphics.FromImage(img)
    End Sub

    Private Sub Panel1_MouseMove(ByVal sender As Object, _
    ByVal e As System.Windows.Forms.MouseEventArgs) Handles ExPanel1.MouseMove
        If e.Button <> Windows.Forms.MouseButtons.Left Then Return
        If e.X > Me.ExPanel1.Width Then offset.X += 50
        If e.X < 0 Then offset.X -= 50
        If e.Y > Me.ExPanel1.Height Then offset.Y += 50
        If e.Y < 0 Then offset.Y -= 50
        Me.ExPanel1.Refresh()
    End Sub

    Private Sub Panel1_Paint(ByVal sender As Object, _
    ByVal e As System.Windows.Forms.PaintEventArgs) Handles ExPanel1.Paint
        e.Graphics.TranslateTransform(-offset.X, -offset.Y)
        e.Graphics.DrawImage(img, 0, 0)
    End Sub

End Class

Public Class ExPanel
    Inherits Panel
    Public Sub New()
        Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
    End Sub
End Class

[ツリー表示へ]
タイトルありがとうございました
記事No3766
投稿日: 2006/05/30(Tue) 21:44
投稿者
参照先http://ykbys.fc2web.com/
ありがとうございました。
解決しました。
今後も、お世話になるときがあると思うので、これからもよろしくお願いします。

[ツリー表示へ]