VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

メニューへ戻ります。 マウス関係のメニュー
1.マウスに関する操作色々
2.マウス操作の自動化(SendInput 関数使用例)
3.マウスのドラッグでコントロールを移動
4.マウスのドラッグで範囲選択枠をトップレベルで表示
5.
6.
7.
8.
9.
10.
11.
12.
 .
20.その他、当サイト内に掲載のマウスに関するサンプル


4.マウスのドラッグで範囲選択枠をトップレベルで表示(37_Mos_04) (旧、SampleNo.000)
1.はじめに
2.マウスのドラッグで範囲選択枠をトップレベルで表示
3.
4.
5.
6.

 下記プログラムコードに関する補足・注意事項 
動作確認:Windows 8.1 (Windows 7) / VB2013 (VB2010) / Framework 4.5.1 / 対象の CPU:x86
Option :[Compare Text] [Explicit On] [Infer On] [Strict On]
Imports :追加なし
参照設定:
追加なし
使用コン:Form1 / Form2 / PictureBox1 / PictureBox1 上にコントロールを配置(下図参照)
トロール:
このサンプル等の内容を無断で転載、掲載、配布する事はお断りします。(私の修正・改訂・削除等が及ばなくなるので)
必要ならリンクをはるようにして下さい。(引用の場合は引用元のリンクを明記して下さい)
このページのトップへ移動します。 1.はじめに
マウスのドラックで範囲を選択 - 貴将 15/03/26-10:10No.11372
上記、掲示板の質問に答えて試しに作って見たもので、当サイトに記載のマウスのドラッグで範囲を選択し画像を取得して他のピクチャーボックスに表示 や microsoft のサイトに記載の透過に対応したユーザーコントロールを作成する方法 では、下記のようにコントロール類が背面に隠れてしまったり、コントロール上には描画できなかったりしますのでそれではまずいということで、いろいろ試した結果下記のような方法が一番簡単ではないかと思い作ったサンプルです。

 図1.上記 MS のサンプルでのテスト結果
 vb2013mouse04_01

このページのトップへ移動します。 2.マウスのドラッグで範囲選択枠をトップレベルで表示
下記コードは、当サイトに掲載中のサンプルをつなぎ合わせたものです。

---------- Form1 上のコード ----------

Public Class Form1

Private f2 As Form2
'下記、ドラッグ中の赤枠の表示のコードは、マウスのドラッグで範囲を選択し画像を取得して他のピクチャーボックスに表示(31_Gra_03)を利用
' http://hanatyan.sakura.ne.jp/vb2005/vb2013graphics03.htm
Private sPos As MouseEventArgs  'マウスのドラッグの開始点
Private ePos As MouseEventArgs  'マウスのドラッグの終了点
Private oPos As MouseEventArgs  '前回のマウス位置

Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
    If e.Button = System.Windows.Forms.MouseButtons.Left Then
        If Not (f2 Is Nothing) Then
            f2.Close()
        End If
        '開始点の取得
        sPos = e
        ePos = e
        oPos = e
    End If
End Sub

Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
    'マウスのドラッグで線を引く
    If e.Button = System.Windows.Forms.MouseButtons.Left Then
        Using g As Graphics = PictureBox1.CreateGraphics()
            Using BPen As New Pen(Color.Red, 1)
                BPen.DashStyle = Drawing2D.DashStyle.Solid
                If (oPos.X <> e.X) Or (oPos.Y <> e.Y) Then
                    Dim nLoca As New Point
                    Dim nSize As New Size
                    'Location Point を変換(どの方向から描画しても表示できるように)
                    If sPos.X <= e.X Then
                        nLoca.X = sPos.X
                    Else
                        nLoca.X = e.X
                    End If
                    If sPos.Y <= e.Y Then
                        nLoca.Y = sPos.Y
                    Else
                        nLoca.Y = e.Y
                    End If
                    nSize = New Size(Math.Abs(e.X - sPos.X), Math.Abs(e.Y - sPos.Y))

                   '-------- 赤枠を描画する替わりに Form2 を表示する --------
                    'PictureBox1 のスクリーン座標を求める
                    Dim Cpos As Point = PictureBox1.ClientRectangle.Location
                    Dim SCpos As Point = PictureBox1.PointToScreen(Cpos)
                    'f2 が複数起動されないように設定
                    If f2 Is Nothing OrElse f2.IsDisposed Then
                        'f2 = New myShape1
                        f2 = New Form2
                    End If
                    f2.FormBorderStyle = Windows.Forms.FormBorderStyle.None
                    f2.ShowInTaskbar = False
                    f2.Show()
                    'f2 を表示してから位置とサイズを指定の事
                    f2.Location = New Point(SCpos.X + nLoca.X, SCpos.Y + nLoca.Y)
                    f2.Size = nSize
                    '------------------------------------------------------------
                    ePos = e
                    oPos = e
                End If
            End Using
        End Using
    End If
End Sub

Private Sub Form1_Move(sender As Object, e As EventArgs) Handles Me.Move
'Form1 が移動された場合、f2 を閉じる
    If Not (f2 Is Nothing) Then
        f2.Close()
    End If
End Sub

End Class


---------- Form2 上のコード ----------
Public Class Form2

Private Sub Form2_Resize(sender As Object, e As EventArgs) Handles Me.Resize
    If Me.Width > 2 And Me.Height > 2 Then
        '四角形と円形を描画のコードを流用
        'http://www.hanatyan.sakura.ne.jp/vb2005/vb2013graphics01.htm#no3
        Dim meRect As Rectangle = New Rectangle(New Point(2, 2), New Size(Me.Width - 4, Me.Height - 4))
        Dim bmp As Bitmap = New Bitmap(Me.Width, Me.Height)
        Using g As Graphics = Graphics.FromImage(bmp)
            'Form の外形に赤枠(四角形)を表示
            g.DrawRectangle(New Pen(Color.Red, 3), meRect)
        End Using
        Me.BackgroundImage = bmp
        'Form の背景色を透明に設定(コントロールの背景を透明にする(14_Ctr_03)のコードを流用)
        'http://www.hanatyan.sakura.ne.jp/vb2005/vb2013controlcommon03.htm
        Me.TransparencyKey = ColorTranslator.FromWin32(Microsoft.VisualBasic.RGB(254, 254, 254))
        Me.BackColor = ColorTranslator.FromWin32(Microsoft.VisualBasic.RGB(254, 254, 254))
        Me.TopMost = True
    End If
End Sub

'複数フォームの上下(Zオーダー)を保つ方法(VB.NET)を流用
'http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=290&no=0

Private Declare Function GetForegroundWindow Lib "user32" () As IntPtr

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
   Select Case m.Msg
      Case &H6, &H1C
         Dim hActv As IntPtr = GetForegroundWindow()
         If hActv = Form1.Handle Or hActv = Me.Handle Then
            Me.TopMost = True
         Else
            Me.TopMost = False
         End If
      Case Else
   End Select
   MyBase.WndProc(m)
End Sub

End Class

 図2.上記実行結果
 vb2013mouse04_02

尚、別途、境界線のないフォームでサイズ変更及び移動可能に設定(34_Frm_11) (旧、SampleNo.296) のコードを追加使用すると枠を描画後、サイズ変更及び枠のドラッグでの移動もできます。(37_Mos_09 の実サンプルではそのように設定しております。)

このページのトップへ移動します。 3.


このページのトップへ移動します。 4.


このページのトップへ移動します。 5.


このページのトップへ移動します。 6.


このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)





このページのトップへ移動します。