選択ツール

<戻る

ここに載せてあるソースコードは、参考のために載せてあります

サンプルコードは、一番下にLZHとしてあります

使いやすく関数にしました(コントロールなどの名前の修正が必要ですが




Option Explicit

Type type_Select
    Flg As Boolean
    Left As Single
    Top As Single
    Width As Single
    Height As Single
    SpanWidth As Single
    SpanHeight As Single
End Type

Type type_User
    Select As type_Select
End Type

Enum Enum_MouseEvents
    mDown = 1
    mMove
    mUp
End Enum

'グローバル変数です
'保守性も保つためにPrivateにしています(Publicでもよい
Private User As type_User

'使いやすくした選択ツールです
Sub Tool_Select(ByVal X As Single, ByVal Y As Single, ByVal MEFlg As Enum_MouseEvents, ByVal Button As Integer)
    
    With User.Select
        
        '左クリックの場合、選択ツールを使えるようにします
        If Button = vbLeftButton Then
            '選択状態と非選択状態の処理を分けます
            If User.Select.Flg = False Then
                '非選択状態のときの処理です
                
                'マウスダウンイベント処理です
                If MEFlg = mDown Then
                    .Left = X
                    .Top = Y
                    .Width = 0
                    .Height = 0
                    
                'マウスムーブイベント処理です
                ElseIf MEFlg = mMove Then
                    
                    '表示をクリアにします
                    Form1.picView.Picture = Form1.picImage.Image
                    
                    '選択範囲を指定する線を引きます
                    Form1.picView.Line (.Left, .Top)-Step(X - .Left - 1, Y - .Top - 1), , B
                    Form1.picView.Refresh
                    
                'マウスアップイベント処理です
                ElseIf MEFlg = mUp Then
                    
                    .Width = Abs(X - .Left)
                    .Height = Abs(Y - .Top)
                    
                    If .Width = 0 Or .Height = 0 Then
                        '選択状態ではないことを示します
                        .Flg = False
                    Else
                        
                        '選択状態を示すフラグを立てます
                        .Flg = True
                        
                        'XがLeftよりも左に行った場合のLeft値の制御をします
                        If X < .Left Then
                            .Left = X - 1
                            .Width = .Width + 2
                        End If
                        
                        'YがTopよりも上に行った場合のTop値の制御をします
                        If Y < .Top Then
                            .Top = Y - 1
                            .Height = .Height + 2
                        End If
                        
                        '表示をクリアにします
                        Form1.picView.Picture = Form1.picImage.Image
                        
                        '選択領域を保存します
                        Form1.picSelect.Cls
                        Form1.picSelect.Move 0, 0, .Width, .Height
                        Form1.picSelect.PaintPicture Form1.picView.Image, 0, 0, , , .Left, .Top, .Width, .Height, vbSrcCopy
                        
                        '選択領域をクリアにします
                        Form1.picView.ForeColor = Form1.picView.BackColor
                        Form1.picImage.Line (.Left, .Top)-Step(.Width - 1, .Height - 1), Form1.picImage.BackColor, BF
                        Form1.picView.Picture = Form1.picImage.Image
                        Form1.picView.ForeColor = Form1.picView.FillColor
                        
                        '選択領域を描画します
                        Form1.picView.PaintPicture Form1.picSelect.Image, .Left, .Top, .Width, .Height, 0, 0, , , vbSrcCopy
                        Form1.picView.Line (.Left, .Top)-Step(.Width - 1, .Height - 1), , B
                        Form1.picView.Refresh
                        
                    End If
                End If
                
            ElseIf User.Select.Flg = True Then
                '選択状態のときの処理です
                
                'マウスダウンイベント処理です
                If MEFlg = mDown Then
                    
                    'マウスが選択領域内で押されたかを調べます
                    If .Left < X And .Top < Y And .Left + .Width > X And .Top + .Height > Y Then
                        
                        '選択領域内を押したときの処理です
                        
                        'マウスの位置と選択領域(LeftとTop)のずれの保存をします
                        .SpanWidth = X - .Left
                        .SpanHeight = Y - .Top
                        
                    Else
                        '選択領域外を押したときの処理です
                        
                        'バックイメージと選択領域イメージを連結します
                        Form1.picImage.PaintPicture Form1.picSelect.Image, .Left, .Top, , , 0, 0, .Width, .Height, vbSrcCopy
                        
                        '表示をクリアにします
                        Form1.picView.Picture = Form1.picImage.Image
                        
                        '非選択状態にします
                        .Flg = False
                        
                        'Flg=Falseのマウスムーブやマウスアップイベントに備える
                        .Left = X
                        .Top = Y
                        .Width = 0
                        .Height = 0
                    End If
                'マウスムーブイベント処理です
                ElseIf MEFlg = mMove Then
                    
                    'マウスの位置から選択位置を計算します
                    .Left = X - .SpanWidth
                    .Top = Y - .SpanHeight
                    
                    '表示をクリアにします
                    Form1.picView.Picture = Form1.picImage.Image
                    
                    '選択領域を描画します
                    Form1.picView.PaintPicture Form1.picSelect.Image, .Left, .Top, .Width, .Height, 0, 0, , , vbSrcCopy
                    Form1.picView.Line (.Left, .Top)-Step(.Width - 1, .Height - 1), , B
                    Form1.picView.Refresh

                'マウスアップイベント処理です
                ElseIf MEFlg = mUp Then
                    
                End If
                
            End If
        End If
    End With
End Sub



<戻る

Sample47.lzh


http://www.vector.co.jp/authors/VA015521/