質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.41%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

680閲覧

クリップボードの画像を拡大縮小して任意の場所に貼り付けたい

sake

総合スコア54

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2023/10/28 09:07

編集2023/10/28 14:56

実現したいこと

画像をクリップボードにコピーするところまではできました。
しかし、PictureBoxに貼り付けるときにPictureBoxに読み込んでいた画像の上に同じサイズで貼り付けてしまいます。
イメージ説明
添付画像のように貼り付けることは可能でしょうか?
Windowsのペイントのように出来ればと思っております。
何方かお力添えお願いします。

下記のように貼り付けています。

vb.net

1Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click 2 'クリップボードにあるデータの取得 3 Dim img As Image = Clipboard.GetImage() 4 If img IsNot Nothing Then 5 'データが取得できたときは表示する 6 PictureBox1.Image = img 7 End If 8End Sub

環境

Windows 11 Pro
Visual Studio 2022 (64 ビット)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2023/10/28 09:42 編集

張り付ける時に別のPictureBoxに張り付けて、それをマウスで移動、サイズ変更できるようにしてはどうですか?
KOZ6.0

2023/10/28 13:20 編集

どのように貼り付けているのかコードを提示してください。任意の場所や倍率はどのように指定しようと考えているのかも記述をお願いします。
sake

2023/10/28 14:09

下記のように貼り付けています。 Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click 'クリップボードにあるデータの取得 Dim img As Image = Clipboard.GetImage() If img IsNot Nothing Then 'データが取得できたときは表示する PictureBox1.Image = img End If End Sub PictureBox1には貼り付けたい元になる画像が読み込まれているので、PictureBox2に貼り付けてやればいいのでしょうか?
KOZ6.0

2023/10/28 14:25 編集

すみません、注意するのを忘れていました。質問は編集できますので、そちらへ書き込んでください。 任意の場所や倍率はどのように指定するのかもお願いします。 現状、どうやって貼り付けていいかわからないといったところでしょうか?
guest

回答1

0

ベストアンサー

方針

  1. メインフォームには Panel と PictureBox と Button を貼り付けます。画像が大きい場合にスクロールできるよう PictureBox は Panel の中に入れます。

  2. クリップボードから画像を取り込んで PictureBox に張り付けるための Form を用意します。これを PictureBox の子コントロールとして貼り付け、位置とサイズの調整を行います。

  3. Form 以外の場所をマウスでクリックすると位置とサイズが確定します。

貼り付け用フォーム

vb

1Imports System.Runtime.InteropServices 2Imports System.ComponentModel 3 4<DesignerCategory("Code")> 5Public Class PasteForm 6 Inherits Form 7 8 Public Sub New(img As Image) 9 Text = String.Empty 10 TopLevel = False 11 ControlBox = False 12 DoubleBuffered = True 13 BackgroundImageLayout = ImageLayout.Stretch 14 BackgroundImage = img 15 Size = img.Size 16 FormBorderStyle = FormBorderStyle.None 17 SetStyle(ControlStyles.ResizeRedraw, True) 18 SetStyle(ControlStyles.SupportsTransparentBackColor, True) 19 BackColor = Color.Transparent 20 End Sub 21 22 Protected Overrides Sub OnMouseDown(e As MouseEventArgs) 23 MyBase.OnMouseDown(e) 24 If e.Button = MouseButtons.Left Then 25 Capture = False 26 SendMessage(Handle, WM_NCLBUTTONDOWN, 27 New IntPtr(HTCAPTION), IntPtr.Zero) 28 End If 29 End Sub 30 31 Protected Overrides Sub OnPaint(e As PaintEventArgs) 32 MyBase.OnPaint(e) 33 e.Graphics.DrawRectangle(Pens.White, 34 New Rectangle(Point.Empty, New Size(Width - 1, Height - 1))) 35 Using pen = New Pen(Color.Black) 36 pen.DashStyle = Drawing2D.DashStyle.Dash 37 e.Graphics.DrawRectangle(pen, 38 New Rectangle(Point.Empty, New Size(Width - 1, Height - 1))) 39 End Using 40 End Sub 41 42 Protected Overrides Sub WndProc(ByRef m As Message) 43 Select Case m.Msg 44 Case WM_NCHITTEST 45 MyBase.WndProc(m) 46 Dim pt = Parent.PointToScreen(Location) 47 Dim dx = SignedLOWORD(m.LParam) - pt.X 48 Dim dy = SignedHIWORD(m.LParam) - pt.Y 49 Const nSize = 4 50 Select Case dy 51 Case -nSize To nSize 52 Select Case dx 53 Case -nSize To nSize 54 m.Result = New IntPtr(HTTOPLEFT) 55 Case Width - nSize To Width + nSize 56 m.Result = New IntPtr(HTTOPRIGHT) 57 Case nSize + 1 To Width - (nSize + 1) 58 m.Result = New IntPtr(HTTOP) 59 End Select 60 Case Height - nSize To Height + nSize 61 Select Case dx 62 Case -nSize To nSize 63 m.Result = New IntPtr(HTBOTTOMLEFT) 64 Case Width - nSize To Width + nSize 65 m.Result = New IntPtr(HTBOTTOMRIGHT) 66 Case nSize + 1 To Width - (nSize + 1) 67 m.Result = New IntPtr(HTBOTTOM) 68 End Select 69 Case nSize + 1 To Height - (nSize + 1) 70 Select Case dx 71 Case -nSize To nSize 72 m.Result = New IntPtr(HTLEFT) 73 Case Width - nSize To Width + nSize 74 m.Result = New IntPtr(HTRIGHT) 75 Case nSize + 1 To Width - (nSize + 1) 76 Cursor = Cursors.Hand 77 m.Result = New IntPtr(HTCLIENT) 78 End Select 79 End Select 80 Case Else 81 MyBase.WndProc(m) 82 End Select 83 End Sub 84 85 Private Const WM_NCHITTEST As Integer = &H84 86 Private Const WM_NCLBUTTONDOWN As Integer = &HA1 87 Private Const HTBOTTOM As Integer = 15 88 Private Const HTBOTTOMLEFT As Integer = 16 89 Private Const HTBOTTOMRIGHT As Integer = 17 90 Private Const HTCAPTION As Integer = 2 91 Private Const HTCLIENT As Integer = 1 92 Private Const HTRIGHT As Integer = 11 93 Private Const HTLEFT As Integer = 10 94 Private Const HTTOP As Integer = 12 95 Private Const HTTOPLEFT As Integer = 13 96 Private Const HTTOPRIGHT As Integer = 14 97 98 <DllImport("user32.dll", CharSet:=CharSet.Auto)> 99 Private Shared Function SendMessage( 100 hWnd As IntPtr, Msg As Integer, 101 wParam As IntPtr, lParam As IntPtr) As IntPtr 102 End Function 103 104 Protected Shared Function SignedHIWORD(n As IntPtr) As Integer 105 Dim tmp As Byte() = BitConverter.GetBytes(n.ToInt64()) 106 Return SignedHIWORD(BitConverter.ToInt32(tmp, 0)) 107 End Function 108 109 Protected Shared Function SignedHIWORD(n As Integer) As Integer 110 Dim tmp As Byte() = BitConverter.GetBytes(n >> 16 And &HFFFF) 111 Return BitConverter.ToInt16(tmp, 0) 112 End Function 113 114 Protected Shared Function SignedLOWORD(n As IntPtr) As Integer 115 Dim tmp As Byte() = BitConverter.GetBytes(n.ToInt64()) 116 Return SignedLOWORD(BitConverter.ToInt32(tmp, 0)) 117 End Function 118 119 Protected Shared Function SignedLOWORD(n As Integer) As Integer 120 Dim tmp As Byte() = BitConverter.GetBytes(n And &HFFFF) 121 Return BitConverter.ToInt16(tmp, 0) 122 End Function 123 124End Class

メインフォーム

vb

1Public Class Form1 2 3 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 4 Panel1.BorderStyle = BorderStyle.Fixed3D 5 Panel1.AutoScroll = True 6 PictureBox1.Location = Point.Empty 7 PictureBox1.Image = New Bitmap(1280, 1024) 8 PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize 9 Panel1.Controls.Add(PictureBox1) 10 ClearImage() 11 End Sub 12 13 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 14 DetermineImage() 15 PasteImage() 16 End Sub 17 18 Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) _ 19 Handles PictureBox1.MouseDown 20 DetermineImage() 21 End Sub 22 23 Private Sub ClearImage() 24 Using g = Graphics.FromImage(PictureBox1.Image) 25 g.Clear(Color.White) 26 End Using 27 PictureBox1.Invalidate() 28 End Sub 29 30 Private Sub PasteImage() 31 If Clipboard.ContainsImage() Then 32 Dim img = Clipboard.GetImage() 33 Dim p As New PasteForm(img) 34 Dim pos = Panel1.AutoScrollPosition 35 p.Location = New Point(-pos.X, -pos.Y) 36 PictureBox1.Controls.Add(p) 37 p.Show() 38 End If 39 End Sub 40 41 Private Sub DetermineImage() 42 If PictureBox1.Controls.Count > 0 Then 43 For Each p As PasteForm In PictureBox1.Controls 44 DetermineImage(p) 45 Next 46 End If 47 End Sub 48 49 Private Sub DetermineImage(p As PasteForm) 50 Using g = Graphics.FromImage(PictureBox1.Image) 51 g.DrawImage(p.BackgroundImage, p.Bounds) 52 End Using 53 p.Parent.Controls.Remove(p) 54 p.BackgroundImage.Dispose() 55 p.Dispose() 56 PictureBox1.Invalidate() 57 End Sub 58 59End Class

イメージ説明

投稿2023/10/28 19:11

編集2023/10/29 03:47
KOZ6.0

総合スコア2668

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KOZ6.0

2023/10/29 02:53

動画を取ってアニメーション GIF にしてみましたが、カーソル位置がずれて見えます。:(
sake

2023/10/29 09:09

細部まで指示していただきありがとうございました。 大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.41%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問