選択ツール
ここに載せてあるソースコードは、参考のために載せてあります
サンプルコードは、一番下に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 |