内の溶液で私を助けてください、私は(cellSize
は、各セルが正方形であると仮定して、コントロールが「スナップ」になると「解像度」である)だと思います。
前提条件:フォームに移動したいPictureBox
(または他のコントロール)が必要です。以下のサンプルコードをフォームのコードに置き、そのコントロールのMouseDown
,MouseMove
およびMouseUp
イベントをこれらのイベントハンドラに添付します。プロパティグリッドを使用してイベントをアタッチすることができます(イベントボタンをクリックし、イベントを選択し、コンボボックスを使用して対応するイベントハンドラを選択します)。
VB.NET:
Private Sub SetControlPosition(ByVal control As Control, ByVal targetPoint As Point, ByVal cellSize As Integer)
Dim roundedLocation As New Point(CInt((Math.Round(CSng(targetPoint.X)/cellSize) * cellSize)), CInt((Math.Round(CSng(targetPoint.Y)/cellSize) * cellSize)))
control.Location = roundedLocation
End Sub
あなたがコントロールの場所はいくつかの特定の事前定義された位置にスナップしたい場合は、代わりにこの(_allowedLocations
が2許可された場所を定義します。x=50, y=50
とx=500, y=500
)のように行うことができます。
Private _allowedLocations As Point() = {New Point(50, 50), New Point(500, 500), New Point(700, 100)}
Private Sub SetControlPosition(ByVal control As Control, ByVal targetPoint As Point, ByVal cellSize As Integer)
Dim shortestDistance As Integer = Integer.MaxValue
Dim nearestLocationIndex As Integer = -1
For i As Integer = 0 To _allowedLocations.Length - 1
Dim width As Integer = targetPoint.X - _allowedLocations(i).X
Dim height As Integer = targetPoint.Y - _allowedLocations(i).Y
Dim distance As Integer = CInt(Math.Sqrt(Math.Pow(width, 2) + Math.Pow(height, 2)))
If distance < shortestDistance Then
shortestDistance = distance
nearestLocationIndex = i
End If
Next
control.Location = _allowedLocations(nearestLocationIndex)
End Sub
(マウスでコントロールを移動含む)メソッドを呼び出すコード例:
Private _mouseDownLocation As Point = Point.Empty
Private Sub PictureBox_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
If (e.Button And MouseButtons.Left) = System.Windows.Forms.MouseButtons.Left Then
_mouseDownLocation = e.Location
End If
End Sub
Private Sub PictureBox_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
If (e.Button And MouseButtons.Left) = System.Windows.Forms.MouseButtons.Left Then
Dim target As Control = DirectCast(sender, Control)
target.Location = New Point(target.Location.X + e.Location.X - _mouseDownLocation.X, target.Location.Y + e.Location.Y - _mouseDownLocation.Y)
End If
End Sub
Private Sub PictureBox_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs)
If (e.Button And MouseButtons.Left) = System.Windows.Forms.MouseButtons.Left Then
Dim target As Control = DirectCast(sender, Control)
' Snap the control in place, to nearest 100x100 corner '
SetControlPosition(target, target.Location, 100)
End If
End Sub
(エクストラボーナスなど)C#でSetControlPosition方法:
private void SetControlPosition(Control control, Point targetPoint, int cellSize)
{
Point roundedLocation = new Point(
(int)(Math.Round((float)targetPoint.X/cellSize) * cellSize),
(int)(Math.Round((float)targetPoint.Y/cellSize) * cellSize)
);
control.Location = roundedLocation;
}
@avrohom:そのことについて申し訳ありません; o)の私は、コードは今OKだと思います(、周りVB.NET環境を持って変換されていませんコード例:http://www.developerfusion.com/tools/convert/csharp-to-vb/) –
投稿例:o) –
これは奇妙なことですが、投稿する前にコード(C#バリアント)をテストしました。あなたは私のサンプルのイベントハンドラにあなたの画像ボックスからマウスイベントを接続しましたか? –