Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。
.NET環境向けのプログラムを開発することができます。
現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。
0グッド
0クリップ
投稿2021/12/25 02:57
0
0
Visual studio 2017のVBでフォーム内にピクチャボックスを設置し、画像を表示しています。ピクチャボックスはマウスで移動できるようになっています。
下の図で言うと、灰色の部分がフォームの領域で青い部分がピクチャボックスの領域になっており、ピクチャボックスの中にパソコンの画像が表示されています。
ImageRectangleFromSizeMode で、画像の PictureBox におけるクライアント座標が分かるので、
PictureBox の RectangleToScreen メソッドでスクリーン座標に変換し、
Form の RectangleToClient で Form のクライアント座標に変換します。
VB
1Public Class Form1
23 Public Shared Function ImageRectangleFromSizeMode(pbox As PictureBox) As Rectangle
4 Dim result As Rectangle = DeflateRect(pbox.ClientRectangle, pbox.Padding)
5 If pbox.Image IsNot Nothing Then
6 Select Case pbox.SizeMode
78 Case PictureBoxSizeMode.Normal, PictureBoxSizeMode.AutoSize
9 result.Size = pbox.Image.Size
1011 Case PictureBoxSizeMode.StretchImage
1213 Case PictureBoxSizeMode.CenterImage
14 result.X += (result.Width - pbox.Image.Width) / 2
15 result.Y += (result.Height - pbox.Image.Height) / 2
16 result.Size = pbox.Image.Size
1718 Case PictureBoxSizeMode.Zoom
19 Dim imageSize As Size = pbox.Image.Size
20 Dim ratio As Single = Math.Min(pbox.ClientRectangle.Width / imageSize.Width,
21 pbox.ClientRectangle.Height / imageSize.Height)
2223 result.Width = imageSize.Width * ratio
24 result.Height = imageSize.Height * ratio
25 result.X = (pbox.ClientRectangle.Width - result.Width) / 2
26 result.Y = (pbox.ClientRectangle.Height - result.Height) / 2
27 End Select
28 End If
29 Return result
30 End Function
3132 Private Shared Function DeflateRect(rect As Rectangle, padding As Padding) As Rectangle
33 rect.X += padding.Left
34 rect.Y += padding.Top
35 rect.Width -= padding.Horizontal
36 rect.Height -= padding.Vertical
37 Return rect
38 End Function
3940 Private Sub PictureBox1_LocationChanged(sender As Object, e As EventArgs) Handles PictureBox1.LocationChanged
41 Dim pbox As PictureBox = DirectCast(sender, PictureBox)
42 Dim r As Rectangle = ImageRectangleFromSizeMode(pbox)
43 Me.Text = RectangleToClient(pbox.RectangleToScreen(r)).ToString()
44 End Sub
4546 <System.Runtime.InteropServices.DllImport("User32.dll")>
47 Private Shared Function SendMessage(hWnd As IntPtr, uMsg As Integer, wParam As IntPtr, lParam As IntPtr) As IntPtr
48 End Function
4950 <System.Runtime.InteropServices.DllImport("User32.dll")>
51 Private Shared Function SetCapture(hwnd As Integer) As Boolean
52 End Function
5354 <System.Runtime.InteropServices.DllImport("User32.dll")>
55 Private Shared Function ReleaseCapture() As Boolean
56 End Function
5758 Private Const WM_SYSCOMMAND As Integer = &H112
59 Private Const SC_MOVE As Integer = &HF010
6061 Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
62 Dim pbox As PictureBox = DirectCast(sender, PictureBox)
63 SetCapture(pbox.Handle)
64 ReleaseCapture()
65 SendMessage(pbox.Handle, WM_SYSCOMMAND, SC_MOVE Or 2, 0)
66 End Sub
6768End Class
6970PictureBox をドラッグして動かすと Form のタイトルバーに座標が表示されます。