PDA

View Full Version : چگون یک component را با drop& drag حرکت دهیم؟



mirtalebi
شنبه 12 فروردین 1385, 14:48 عصر
سلام
می خواستم بدانم چه طور می توان component موجود روی فرم را بوسیله عمل drag ,drop حرکت داد؟ به عبارت ساده تر چطوریک component را به کمک Mouse به مکان دلخواه برد؟

meandyouwith2003
شنبه 12 فروردین 1385, 15:51 عصر
عزیز جان من نمی دونم استفاده از Drag&Drop در بقیه کنترلها رو بلد هستی یا نه(فرض می کنم بلدی:d)
بنظر من این طور عمل کنی بهتره : در ایونت MouseDown کنترل کدی بنویس که وقتی روی کنترل Left Click یا Right Click شد ، Location باتون با Location موس یکی بشه ، یعنی X,Y ، موس را در بیاره و X,Y لکیشن باتون را با X,Y موس یکی کنه .
امیدوارم منظورم رو متوجه شده باشی .
موفق باشی

behzad_gh
شنبه 12 فروردین 1385, 15:55 عصر
سلام . یک کنترل دکمه ( به عنوان نمونه ) به فرمت اضافه کن و اسم اون رو btnMove بذار بعد کد زیر رو برنامت اضافه کن.



Public Dragging As Boolean
Public mousex, mousey As Integer
Private Sub btnMove_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnMove.MouseDown
If e.Button = Windows.Forms.MouseButtons.Left Then
Dragging = True
mousex = -e.X
mousey = -e.Y
Dim clipleft As Integer = Me.PointToClient(MousePosition).X - btnMove.Location.X
Dim cliptop As Integer = Me.PointToClient(MousePosition).Y - btnMove.Location.Y
Dim clipwidth As Integer = Me.ClientSize.Width - (btnMove.Width - clipleft)
Dim clipheight As Integer = Me.ClientSize.Height - (btnMove.Height - cliptop)
Windows.Forms.Cursor.Clip = Me.RectangleToScreen(New Rectangle(clipleft, cliptop, clipwidth, clipheight))
btnMove.Invalidate()
End If
End Sub

Private Sub btnMove_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnMove.MouseMove
If Dragging Then
'move control to new position
Dim MPosition As New Point()
MPosition = Me.PointToClient(MousePosition)
MPosition.Offset(mousex, mousey)
'ensure control cannot leave container
btnMove.Location = MPosition
End If
End Sub

Private Sub btnMove_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnMove.MouseUp
If Dragging Then
'end the dragging
Dragging = False
Windows.Forms.Cursor.Clip = Nothing
btnMove.Invalidate()
End If
End Sub

موفق باشی :تشویق:

habedijoo
دوشنبه 14 فروردین 1385, 09:22 صبح
آقای behzad_gh سلام

دست شما درد نکنه . میشه یه توضیح جامع و کامل درباره کد بدید . با تشکر

mirtalebi
دوشنبه 14 فروردین 1385, 13:44 عصر
سلام
آقای behzad_gh از راهنمایی کامل و کارسازتون متشکرم

behzad_gh
سه شنبه 15 فروردین 1385, 15:37 عصر
آقای behzad_gh سلام

دست شما درد نکنه . میشه یه توضیح جامع و کامل درباره کد بدید . با تشکر

سلام آقای habedijoo . من توضیح کد ها رو داخل کد نوشتم . اگر در هر مورد توضیح بیشتری خواستید بفرمایید بیشتر توضیح بدم .



Public Dragging As Boolean
Public mousex, mousey As Integer
Private Sub btnMove_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnMove.MouseDown
If e.Button = Windows.Forms.MouseButtons.Left Then
Dragging = True
'این دو خط مختصات موس را نسبت به گوشه سمت چپ بالای دکمه ذخیره میکنند
mousex = -e.X
mousey = -e.Y
'خطوط زیر برای محاسبه مختصات محیطی از فرم است که هنگام تکان دادن موس تمام دکمه در فرم باشد
Dim clipleft As Integer = Me.PointToClient(MousePosition).X - btnMove.Location.X
Dim cliptop As Integer = Me.PointToClient(MousePosition).Y - btnMove.Location.Y
Dim clipwidth As Integer = Me.ClientSize.Width - (btnMove.Width - clipleft)
Dim clipheight As Integer = Me.ClientSize.Height - (btnMove.Height - cliptop)

'خط زیر محیطی را که در بالا محاسبه شده را برای نشانگر ست میکند
'که نشانگر موس فقط در داخل این محیط قادر به حرکت خواهد بود
Windows.Forms.Cursor.Clip = Me.RectangleToScreen(New Rectangle(clipleft, cliptop, clipwidth, clipheight))
btnMove.Invalidate()
End If
End Sub

Private Sub btnMove_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnMove.MouseMove
If Dragging Then
'خطوط زیر گوشه بالای سمت چپ دکمه را نسبت به مکانی که موس بر روی دکمه قرار گرفته است را محاسبه می کند
Dim MPosition As New Point()
MPosition = Me.PointToClient(MousePosition)
MPosition.Offset(mousex, mousey)
'در این خط مکان جدید دکمه ست می شود
btnMove.Location = MPosition
End If
End Sub

Private Sub btnMove_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnMove.MouseUp
If Dragging Then
'end the dragging
Dragging = False
'خط زیر که در رویداد موس آپ است محیطی که برای محدود کردن حرکت موس تعریف شده بود را پاک می کند
Windows.Forms.Cursor.Clip = Nothing
btnMove.Invalidate()
End If
End Sub

mirtalebi
شنبه 19 فروردین 1385, 07:46 صبح
سلام
اگر بخواهیم برای component یی که در حین اجرای برنامه بصورت پویا ایجاد میشه این کد رو بنویسیم به جای btnmove باید اسم component جدید قرار بگیره. اما نمی تونیم اون رو به عنوان پارامتر به این توابع ارسال کنیم. چرا که این توابع از قبل 2 پارامتر دیگر هم دارند و موقع addhandler کردن باید مقدار آنها را نیز ( علاوه بر پارامتر سوم که خودمان تعریف کرده ایم بفرستیم )پارامتر sender هم مشکل رو حل نمی کنه .

habedijoo
شنبه 19 فروردین 1385, 08:56 صبح
دست درد نکنه ممنون .

behzad_gh
یک شنبه 20 فروردین 1385, 08:27 صبح
سلام
اگر بخواهیم برای component یی که در حین اجرای برنامه بصورت پویا ایجاد میشه این کد رو بنویسیم به جای btnmove باید اسم component جدید قرار بگیره. اما نمی تونیم اون رو به عنوان پارامتر به این توابع ارسال کنیم. چرا که این توابع از قبل 2 پارامتر دیگر هم دارند و موقع addhandler کردن باید مقدار آنها را نیز ( علاوه بر پارامتر سوم که خودمان تعریف کرده ایم بفرستیم )پارامتر sender هم مشکل رو حل نمی کنه .

سلام
برای ایجاد کامپوننت در حین اجرای برنامه حتما نیاز نیست پارامتری رو به این توابع ارسال کنی .
من کد رو به صورت زیر تغییر دادم که دو دکمه در حین اجرا اضافه می‌کنه . اون متغییری ( پارامتر سوم که خودمات تعریف کرده‌ایم ) نیاز به فرستادن ندارد . چون هر زمان که موس بر روی یکی از دکمه ها فشار داده میشود این متغییر ست می‌شود.



Public Dragging As Boolean
Public mousex, mousey As Integer
Private Sub btnMove_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
Dragging = True
'این دو خط مختصات موس را نسبت به گوشه سمت چپ بالای دکمه ذخیره میکنند
mousex = -e.X
mousey = -e.Y
'خطوط زیر برای محاسبه مختصات محیطی از فرم است که هنگام تکان دادن موس تمام دکمه در فرم باشد
Dim clipleft As Integer = Me.PointToClient(MousePosition).X - sender.Location.X
Dim cliptop As Integer = Me.PointToClient(MousePosition).Y - sender.Location.Y
Dim clipwidth As Integer = Me.ClientSize.Width - (sender.Width - clipleft)
Dim clipheight As Integer = Me.ClientSize.Height - (sender.Height - cliptop)

'خط زیر محیطی را که در بالا محاسبه شده را برای نشانگر ست میکند
'که نشانگر موس فقط در داخل این محیط قادر به حرکت خواهد بود
Windows.Forms.Cursor.Clip = Me.RectangleToScreen(New Rectangle(clipleft, cliptop, clipwidth, clipheight))
sender.Invalidate()
End If
End Sub

Private Sub btnMove_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If Dragging Then
'خطوط زیر گوشه بالای سمت چپ دکمه را نسبت به مکانی که موس بر روی دکمه قرار گرفته است را محاسبه می کند
Dim MPosition As New Point()
MPosition = Me.PointToClient(MousePosition)
MPosition.Offset(mousex, mousey)
'در این خط مکان جدید دکمه ست می شود
sender.Location = MPosition
End If
End Sub

Private Sub btnMove_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If Dragging Then
'end the dragging
Dragging = False
'خط زیر که در رویداد موس آپ است محیطی که برای محدود کردن حرکت موس تعریف شده بود را پاک می کند
Windows.Forms.Cursor.Clip = Nothing
sender.Invalidate()
End If
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim btn As New Button
btn.Size = New Size(50, 50)
btn.Location = New Point(150, 150)
AddHandler btn.MouseDown, AddressOf btnMove_MouseDown
AddHandler btn.MouseMove, AddressOf btnMove_MouseMove
AddHandler btn.MouseUp, AddressOf btnMove_MouseUp
Me.Controls.Add(btn)

Dim btn2 As New Button
btn2.Size = New Size(50, 50)
btn2.Location = New Point(150, 150)
AddHandler btn2.MouseDown, AddressOf btnMove_MouseDown
AddHandler btn2.MouseMove, AddressOf btnMove_MouseMove
AddHandler btn2.MouseUp, AddressOf btnMove_MouseUp
Me.Controls.Add(btn2)

End Sub

موفق باشی :لبخند:

coder
دوشنبه 21 فروردین 1385, 08:01 صبح
میتونی برای کنترلهایی که با کد به فرم اضافه میشوند با دستور AddHandeller بصورت زیر :
AddHandler CurElement.MouseDown, AddressOf E_MouseDown
عمل کنی. CurElement همون کنترل جدید و E_MouseDown اسم روال سرویس دهنده به رویداد موس دان هست.
در واقع باید سه روال سرویس دهنده برای MouseDown و MouseMove و MouseUp مشابه روشی که دوستان گفته اند بنویسی. البته چون اینها روالهای کلی هستند کلمه Handles ControlName.MouseMove رو باید از خط اول اونها حذف کنی. بعد از اون برای هر چند تا کنترل که موقع اجرا به فرم اضافه میشن با دستور فوق امکان درگ کردن ایجاد میشه.