tagCANDY CGI VBレスキュー(花ちゃん) - ピクチャーボックスのサイズをマウスのドラッグで変更する(VB.NET) - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
ピクチャーボックスのサイズをマウスのドラッグで変更する(VB.NET)
元に戻る スレッド一覧へ 記事閲覧
このページ内の検索ができます。(AND 検索や OR 検索のような複数のキーワードによる検索はできません。)

ピクチャーボックスのサイズをマウスのドラッグで変更する(VB.NET) [No.181の個別表示]
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
日時: 2009/12/26 21:08
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[コントロール共通][マウス][]                                        *
* キーワード:PictureBox,移動,サイズ変更,幅を変更,                                *
***********************************************************************************
記事No : 7164
投稿日 : 2008/03/08(Sat) 08:14
元質問 : ゆうき  

マウスのドラッグで、ペイントのようにPictureBoxのサイズを変更したいのですが、
http://hanatyan.sakura.ne.jp/samplepic/vb8_239.htm
を参考に、幅を変更するのは実装できました。

しかし、たてを別のラベルで同じようにやろうとすると、ラベルをドラッグしたときに、
PictureBoxがどこかへ行ってしまいます

-----------------------------------------------------------------------------------
回答者 : 花ちゃん
-----------------------------------------------------------------------------------
ペイントの白いキャンパスの部分のようにサイズ変更ができます。
サンプルですので2ヶ所しか設定しておりませんので、PictureBox 上にマウスが
ある場合だけ、Label を表示するとか工夫してください。
又、http://hanatyan.sakura.ne.jp/samplepic/vb6_151.htm のような方法もあります。

Public Class Form1
Private Posx1 As Integer
Private Posy2 As Integer

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
                                       System.EventArgs) Handles MyBase.Load
   With Label1
      .Size = New Size(4, 4)
      .Location = New Point(148, 60)
      .AutoSize = False
      .Text = ""
      .BackColor = Color.Black
      .Cursor = Cursors.SizeWE
   End With
   With Label2
      .Size = New Size(4, 4)
      .Location = New Point(98, 108)
      .AutoSize = False
      .Text = ""
      .BackColor = Color.Black
      .Cursor = Cursors.SizeNS
   End With

   With PictureBox1
      .Size = New Size(100, 100)
      .Location = New Point(50, 10)
      .BackColor = Color.White
   End With
End Sub

Private Sub Label1_MouseDown(ByVal sender As Object, ByVal e As _
                     System.Windows.Forms.MouseEventArgs) Handles Label1.MouseDown
   If e.Button = System.Windows.Forms.MouseButtons.Left Then
      Posx1 = e.X
   End If
End Sub

Private Sub Label1_MouseMove(ByVal sender As Object, ByVal e As _
                        System.Windows.Forms.MouseEventArgs) Handles Label1.MouseMove
   If e.Button = System.Windows.Forms.MouseButtons.Left Then
      Dim X1 As Integer = Posx1 - e.X
      Label1.Left -= X1
      Label2.Left = (PictureBox1.Width \ 2) + PictureBox1.Left
      PictureBox1.Width -= X1
      Me.Refresh()
   End If
End Sub

Private Sub Label2_MouseDown(ByVal sender As Object, ByVal e As _
                     System.Windows.Forms.MouseEventArgs) Handles Label2.MouseDown
   If e.Button = System.Windows.Forms.MouseButtons.Left Then
      Posy2 = e.Y
   End If
End Sub

Private Sub Label2_MouseMove(ByVal sender As Object, ByVal e As _
                        System.Windows.Forms.MouseEventArgs) Handles Label2.MouseMove
   If e.Button = System.Windows.Forms.MouseButtons.Left Then
      Dim Y2 As Integer = Posy2 - e.Y
      Label2.Top -= Y2
      Label1.Top = (PictureBox1.Height \ 2) + PictureBox1.Top
      PictureBox1.Height -= Y2
      Me.Refresh()
   End If
End Sub
End Class

上記実行図
 http://hanatyan.sakura.ne.jp/samplepic/vb8_239.htm
メンテ

Page: 1 |

ピクチャーボックスのサイズをマウスのドラッグで変更する(VB.NET)  (No.1の個別表示) [スレッド一覧へ]
日時: 2010/03/08 21:06
名前: 魔界の仮面弁士

***********************************************************************************
* カテゴリー:[コントロール共通][マウス][]                                        *
* キーワード:PictureBox,移動,サイズ変更,幅を変更,                                *
***********************************************************************************

WM_NCHITTEST メッセージを処理して、コントロールのサイズを可変にしてみました。
コントロール周辺を掴むとドラッグ可能です。

Public Class Form1
    Private WithEvents PictureBox1 As PictureBox
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        PictureBox1 = New ResizablePictureBox()
        PictureBox1.SetBounds(15, 20, 276, 110)
        PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
        Controls.Add(PictureBox1)

        PictureBox1.LoadAsync("http://www.google.co.jp/intl/ja_jp/images/logo.gif")
    End Sub
End Class


Public Class ResizablePictureBox
    Inherits PictureBox
    Const WM_NCHITTEST As Integer = &H84

    Protected Overrides Sub WndProc(ByRef m As Message)
        MyBase.WndProc(m)
        If m.Msg = WM_NCHITTEST Then
            Dim xy As Point = PointToClient(New Point(m.LParam.ToInt32()))

            Dim Border As Size = SystemInformation.FrameBorderSize
            Const BoxSize As Integer = 16

            m.Result = New IntPtr(HitTest.Caption)  'ドラッグ移動可能
            'm.Result = New IntPtr(HitTest.Client)  'ドラッグ移動不可

            Dim rect As Rectangle = Me.DisplayRectangle

            If xy.X <= Border.Width Then
                m.Result = New IntPtr(HitTest.Left)
                If xy.Y <= BoxSize Then
                    m.Result = New IntPtr(HitTest.TopLeft)
                ElseIf xy.Y + BoxSize >= ClientRectangle.Height Then
                    m.Result = New IntPtr(HitTest.BottomLeft)
                End If
            ElseIf xy.X + Border.Width >= ClientRectangle.Width Then
                m.Result = New IntPtr(HitTest.Right)
                If xy.Y <= BoxSize Then
                    m.Result = New IntPtr(HitTest.TopRight)
                ElseIf xy.Y + BoxSize >= ClientRectangle.Height Then
                    m.Result = New IntPtr(HitTest.BottomRight)
                End If
            ElseIf xy.Y <= Border.Height Then
                m.Result = New IntPtr(HitTest.Top)
                If xy.X <= BoxSize Then
                    m.Result = New IntPtr(HitTest.TopLeft)
                ElseIf xy.X + BoxSize >= ClientRectangle.Width Then
                    m.Result = New IntPtr(HitTest.TopRight)
                End If
            ElseIf xy.Y + Border.Height >= ClientRectangle.Height Then
                m.Result = New IntPtr(HitTest.Bottom)
                If xy.X <= BoxSize Then
                    m.Result = New IntPtr(HitTest.BottomLeft)
                ElseIf xy.X + BoxSize >= ClientRectangle.Width Then
                    m.Result = New IntPtr(HitTest.BottomRight)
                End If
            End If
        End If
    End Sub

    Enum HitTest
        [Error] = -2       'デスクトップ上にあり、警告音を鳴らす
        Transparent = -1   '同じスレッドの別のウィンドウの下にある
        NoWhere = 0        'デスクトップ上にある
        Client = 1         'クライアント領域内にある
        Caption = 2        'キャプションバー上にある
        SysMenu = 3        'システムメニュー内にある
        Size = 4           'サイズボックス内にある
        GrowBox = Size
        Menu = 5           'メニューバー内にある
        HScroll = 6        '水平スクロールバー内にある
        VScroll = 7        '垂直スクロールバー内にある
        MinButton = 8      'アイコン化ボタン上にある
        MaxButton = 9      '最大化ボタン上にある
        Left = 10          '可変枠の左辺境界線上にある
        Right = 11         '可変枠の右辺境界線上にある
        Top = 12           '可変枠の上辺境界線上にある
        TopLeft = 13       '可変枠の左上隅にある
        TopRight = 14      '可変枠の右上隅にある
        Bottom = 15        '可変枠の下辺境界線上にある
        BottomLeft = 16    '可変枠の左下隅にある
        BottomRight = 17   '可変枠の右下隅にある
        Border = 18        '可変枠を持たない境界線上にある
    End Enum
End Class
メンテ

Page: 1 |

 投稿フォーム               スレッド一覧へ
題  名 スレッドをトップへソート
名  前
パスワード (記事メンテ時に使用)
投稿キー (投稿時 投稿キー を入力してください)
コメント

   クッキー保存   
スレッド一覧へ