PDA

View Full Version : سوال: حرکت دادن عکس در محدوده معین



pouyansaraf
سه شنبه 16 آذر 1389, 15:22 عصر
با سلام
من برای حرکت دادن یک PictureBox از قطعه کد زیر که در رویداد MouseMove آن قرار میدهم استفاده میکنم





Private oControlOffsetPoint As Point
Private Sub PictureBox1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
Dim sX As Integer = RectangleToClient(New Rectangle(Windows.Forms.Cursor.Position.X, Windows.Forms.Cursor.Position.Y, 1, 1)).Left - oControlOffsetPoint.X
Dim sY As Integer = RectangleToClient(New Rectangle(Windows.Forms.Cursor.Position.X, Windows.Forms.Cursor.Position.Y, 1, 1)).Top - oControlOffsetPoint.Y
If e.Button = Windows.Forms.MouseButtons.Left Then
sender.Location = New Point(sX, sY)
PictureBox1.Left = sX
PictureBox1.Top = sY
EndIf
End Sub







دو مشکل دارم
1- جایگاه نشانگر موس در هنگام حرکت رضایت بخش نیست (اگر مانند حرکت picturebox خود دات نت باشد عالی است)
2- اینکه اگر بخواهم در محدوده خاص یک PictureBox دیگر آنرا حرکت دهم چه باید بکنم


راستی PictureBox1.Capture = False چه کار میکند؟

pouyansaraf
سه شنبه 16 آذر 1389, 17:02 عصر
خوب با این دستور قشنگ تر شد

موس را وسط عکس متحرک انداختم

ولی باز مال دات نت قشنگتره



oControlOffsetPoint = New Point(PictureBox1.Width / 2, PictureBox1.Height / 2)

Alghoochi
سه شنبه 16 آذر 1389, 20:52 عصر
با سلام
من برای حرکت دادن یک PictureBox از قطعه کد زیر که در رویداد MouseMove آن قرار میدهم استفاده میکنم





Private oControlOffsetPoint As Point
Private Sub PictureBox1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
Dim sX As Integer = RectangleToClient(New Rectangle(Windows.Forms.Cursor.Position.X, Windows.Forms.Cursor.Position.Y, 1, 1)).Left - oControlOffsetPoint.X
Dim sY As Integer = RectangleToClient(New Rectangle(Windows.Forms.Cursor.Position.X, Windows.Forms.Cursor.Position.Y, 1, 1)).Top - oControlOffsetPoint.Y
If e.Button = Windows.Forms.MouseButtons.Left Then
sender.Location = New Point(sX, sY)
PictureBox1.Left = sX
PictureBox1.Top = sY
EndIf
End Sub







دو مشکل دارم
1- جایگاه نشانگر موس در هنگام حرکت رضایت بخش نیست (اگر مانند حرکت picturebox خود دات نت باشد عالی است)
2- اینکه اگر بخواهم در محدوده خاص یک PictureBox دیگر آنرا حرکت دهم چه باید بکنم


راستی PictureBox1.Capture = False چه کار میکند؟

از این کد استفاده کنید. البته کد خود شماست فقط یه سری تغییرات توی اون ایجاد کردم.



Private Laste As Point
Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
Laste = e.Location
Dim _sender = DirectCast(sender, PictureBox)
If Not _sender.Cursor.Equals(Cursors.SizeAll) Then
_sender.Cursor = Cursors.SizeAll
End If
End Sub
Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
Dim sX As Integer = RectangleToClient(New Rectangle(Windows.Forms.Cursor.Position.X, Windows.Forms.Cursor.Position.Y, 1, 1)).Left - Laste.X
Dim sY As Integer = RectangleToClient(New Rectangle(Windows.Forms.Cursor.Position.X, Windows.Forms.Cursor.Position.Y, 1, 1)).Top - Laste.Y
Dim _sender = DirectCast(sender, PictureBox)
If e.Button = Windows.Forms.MouseButtons.Left Then
_sender.Location = New Point(sX, sY)
End If
End Sub

Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
Dim _sender = DirectCast(sender, PictureBox)
If Not _sender.Cursor.Equals(Cursors.Default) Then
_sender.Cursor = Cursors.Default
End If
End Sub


ولی کد شما چند ایراد داره:
1. از متغیر oControlOffsetPoint که اصلا به اون مقدار ندادی استفاده کردی.
2.مختصات کنترل رو دوبار تغییر دادی. (اول توسط Location و بعد Left و Top)

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

pouyansaraf
سه شنبه 16 آذر 1389, 23:19 عصر
خیلی ممنون دوست عزیز
حقیقتش این عکسی که فابل حرکت است میبایست فقط در محدوده یک عکس دیگر قابل حرکت باشد.

که احتمالا یک شرط باید بگذاریم.
ولی میخواستم بدونم آیا دستوری هست که ذ=دیگر نیاز به اعمال شرط نباشد
مانند for each in که خودش چک میکند که متغیر من داخل یک رنج خاصی وجود داشته باشد.

یک مشکل اساسی دیگر
عکس قابل حرکت من ترنس پرنت است
برای اینکه ترنس پرنت اعمال شود در فرم لود برنامه دستور
PictureBox1.Parent = PictureBox2
را قرار داده ام
ولی موقع حرکت دادن آن پس زمینه محدوده عکس متحرک نمیدونم چی بگم آهان (شبیه ارواح در فیلم های سینمایی میشه )


دوستدار شما صراف

Alghoochi
چهارشنبه 17 آذر 1389, 13:07 عصر
ولی میخواستم بدونم آیا دستوری هست که ذ=دیگر نیاز به اعمال شرط نباشد
مانند for each in که خودش چک میکند که متغیر من داخل یک رنج خاصی وجود داشته باشد.


من نمی دونم. نمی گم نیست فقط من بلد نیستم.



یک مشکل اساسی دیگر
عکس قابل حرکت من ترنس پرنت است
برای اینکه ترنس پرنت اعمال شود در فرم لود برنامه دستور
PictureBox1.Parent = PictureBox2
را قرار داده ام
ولی موقع حرکت دادن آن پس زمینه محدوده عکس متحرک نمیدونم چی بگم آهان (شبیه ارواح در فیلم های سینمایی میشه )


اگه یه نمونه کد یا عکس بذاری بهتر متوجه میشم. و میتونم کمکت کنم

pouyansaraf
چهارشنبه 17 آذر 1389, 17:03 عصر
با سلام

اگر عکس را با سرعت به این طرف و آنطرف ببرید محدوده پشت ترنس پرنت شده آن گیجی ویلی میره (حالا گیجی ویلی میره یعنی چی جای خود)

فریم ورک 4 است

اینم برای دانلود ممنون
http://www.mediafire.com/?2j65y3euxf9635a

Alghoochi
چهارشنبه 17 آذر 1389, 19:58 عصر
شرمنده. من فریم ورک 4 ندارم. میشه با 3.5 لینک بدید.

pouyansaraf
چهارشنبه 17 آذر 1389, 20:25 عصر
http://www.myfileupload.net/download.php?file=d7725dfb8ce05d252a45b7e3fb262f53

با فزیم ورک 3.5

PictureBox1.Capture = False چه کار میکند؟


قطعه کد زیر هم برای اینکه عکس logo فقط در محدوده عکس background حرکت کنه که درست نیست. وقتی به لبه بالا و چپ میرسه قفل میکنه (یعنی دیگه شرط برقرار نیست) و لبه راست را نیز رد میکنه

حالا سرو کله بزنم ببینم چی میشه
اگر شما هم کمک کنید ممنون



If logo.Location.X + logo.Width < background.Location.X + Width And logo.Location.X > background.Location.X And logo.Location.Y + logo.Height < background.Location.Y + background.Height And logo.Location.Y > background.Location.Y Then
'Move Logo PictureBox cod
If e.Button = Windows.Forms.MouseButtons.Left Then
_sender.Location = New Point(sX, sY)
End If
End If

ali_najari
پنج شنبه 18 آذر 1389, 12:03 عصر
دوست عزيز من يه برنامه براتون آماده كردم اميدوارم كه به دردتون بخوره!
اين رو هم اشاره كنم كه كد بسيار ساده اي داره و علاوه بر اون تصوير رو هم مات نميكنه!

اين كدهاش هستش و برنامه رو هم Attach ميكنم براتون:


Dim x, y As Integer

Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
If e.Button = Windows.Forms.MouseButtons.Left Then
PictureBox1.Cursor = Cursors.SizeAll
x = e.X
y = e.Y
End If
End Sub

Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
If e.Button = Windows.Forms.MouseButtons.Left Then
Application.DoEvents()
PictureBox1.Top = Windows.Forms.Cursor.Position.Y - Me.Top - y
PictureBox1.Left = Windows.Forms.Cursor.Position.X - Me.Left - x
End If
End Sub

Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
PictureBox1.Cursor = Cursors.Default
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
PictureBox1.Parent = PictureBox2
PictureBox1.BackColor = Color.Transparent
End Sub

pouyansaraf
پنج شنبه 18 آذر 1389, 15:06 عصر
در روش قبلی هم تصویر مات نمیشد

ولی مشکل من هنوز پابرجاست

1- پشت زمینه عکس در حال حرکت که ترنس پرنت شده ناموزون که انگار شیشه زیرش است میشود (فقط در حال حرکت سریع)
2- عکس فقط در محدوده عکس زیری حرکت کند

کد آقای نجار هم همون مشکلات رو داره


خوب مشکل مشکل قفل کردن در لبه های بالا و پایین و چپ حل شد
فقط مونده اینکه از لبه راست بیرون نزند

ali_najari
پنج شنبه 18 آذر 1389, 15:19 عصر
منظوزتون از لبه ها بيرون نزنه چيه؟
يعني نميخوايد از حاشيه يا همون محيط تعيين شده بيرون بره؟

pouyansaraf
پنج شنبه 18 آذر 1389, 15:49 عصر
با این کد من میتونم کاری کنم که عکس فقط در مساحت عکس زیرین خودش فقط حرکت کنه



If logo.Left + logo.Width < backgroundpic.Width And logo.Left > backgroundpic.Left And logo.Top + logo.Height < backgroundpic.Height And logo.Top > backgroundpic.Top Then
'Move Logo PictureBox cod
If e.Button = Windows.Forms.MouseButtons.Left Then
_sender.Location = New Point(sX, sY)
End If
End If




If logo.Left <= 0 Then
logo.Location = New Point(1, logo.Location.Y)
End If
If logo.Top <= 0 Then
logo.Location = New Point(logo.Location.X, 1)
End If
If logo.Top + logo.Height >= backgroundpic.Height Then
logo.Location = New Point(logo.Location.X, backgroundpic.Height - logo.Height - 1)
End If
If logo.Left + logo.Width >= backgroundpic.Width Then
MsgBox("")
logo.Location = New Point(backgroundpic.Width - logo.Width - 1, logo.Top)
End If


ولی گفتم شاید دات نت ابزاری داشته باشه شبیه for each که خودش مشخص محدوده استفاده از متغیر ها را معین میکند
ما هم فقط بگوییم فقط میتوانید در محدوده عکس زیر خودش حرکت کند

pouyansaraf
پنج شنبه 18 آذر 1389, 16:51 عصر
خوب دسته همگی درد نکنه تقریبا کامل شد

نهایتا این برنامه شد که برای دانلود گذاشته ام (فریم ورک 3.5)

http://www.mediafire.com/?m1skjmg68h4zanm




ویژگی ها:
پیکچر باکس با نام logo فقط در مساحت پیکچر باکس زیرینش با نام BackgroundPic حرکت میکند
اگر logo به لبه های BackgroundPic رسید با فراخوانی تابع CorectPosition یک پیکسل به سمت داخل Backgroundpic فرستاده میشود تا بازهم برای حرکت آماده باشد و شرط را نقض نکند
به علت اینکه backgroundpic ، مساحت مشخصی ندارد (به علت Anchor و یا Dock) بعد از تغییر سایز فرم نیز تابع corectposition باز هم باید فراخوانی شود
نقاط ضعف
به علت اینکه logo ترنس پرنت است باید از پیکچر باکس زیرینش خواص بک گراندش را به ارث ببرد که با کد logo.backcolor=backgroundpic این عمل انجام میشود ولی این عمل باعث میشود که پشت زمینه شفاف logo در حال حرکت مقداری ریپ بزند
از دوستان عزیز که من را راهنمایی کرده اند ممنونم Alghoochi و ali_najari



(این نقطه ضعف اگر حل شود این شب جمعه ای دعاتون میکنم.)

Alghoochi
پنج شنبه 18 آذر 1389, 20:43 عصر
دوست عزیز تو این تاپیک mani_rf در مورد مکانیزم transparent توضیح دادن.
دیدنش خالی از لطف نیست.

http://barnamenevis.org/showthread.php?259048-%D8%A8%D8%B1%D8%AF%D8%A7%D8%B4%D8%AA%D9%86-%D8%B1%D9%86%DA%AF-%D9%BE%D8%B3-%D8%B2%D9%85%DB%8C%D9%86%D9%87-%D9%84%DB%8C%D8%A8%D9%84%D9%87%D8%A7&p=1153974&viewfull=1#post1153974

pouyansaraf
پنج شنبه 18 آذر 1389, 21:19 عصر
mani_rf transparent سرچ زدم همه مشکل transparentداشتن

فقط یکی مشکل من رو داشت با لینک http://barnamenevis.org/showthread.php?184742-کار-با-گرافیک-و-لایه-Transparent

حالا مشکل اینجاست که موقع حرکت PictureBox دوم در لایه Transparent یه لرزشی ایجاد میشه که میخوام این لرزش رو حذف کنم...



حالا ازش سوال کردم ببینم چی میشه



دوست عزیز تو این تاپیک mani_rf در مورد مکانیزم transparent توضیح دادن.
دیدنش خالی از لطف نیست.
راستی لینک یادتون رفت بدید

Alghoochi
جمعه 19 آذر 1389, 15:12 عصر
mani_rf transparent سرچ زدم همه مشکل transparentداشتن

فقط یکی مشکل من رو داشت با لینک http://barnamenevis.org/showthread.php?184742-کار-با-گرافیک-و-لایه-Transparent



حالا ازش سوال کردم ببینم چی میشه

راستی لینک یادتون رفت بدید

لینک اضافه شد. عذر می خوام.

Alghoochi
جمعه 19 آذر 1389, 15:15 عصر
آخرین فعالیت mehrnoosh_al62 تو تاریخ سه شنبه 09 شهریور 1389 08:44 صبح بوده. فکر نمی کنم اصلا تاپیک شما رو بخونه.

pouyansaraf
جمعه 17 دی 1389, 04:27 صبح
سلام

به قول ارشمیدس یافتم ... یافتم
الان ساعت 5 صبح. :قلب:
اگر doublebuffered فرم را True کنیم مشکل حل میشود.

البته اگر عکس را خیلی کشیده در حالت زوم بگذاریم باز او حالت پیش میاد ولی اصلا عکس به آن بزرگی نیاز نیست

جالبه وقتی پیدا کردم دیدم در فروم خودمان هم در قسمت دلفی هم همچین مشکلی داشته اند.
البته نوش دارو بعد از مرگ سهراب بود.
ولی در هر صورت مشکل حل شد.