تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
مقال- أفكار في الجرافكس ....... الجزء الأول
#1
كاتب الموضوع : silverlight


بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

مقدمـــــة

غالبا ماتكون الأفكار الكبيرة ماهي إلا مجموعة من الأفكار الصغيرة التي تتجمع معا لتشكل هذه الأفكار الكبيرة وفي هذه الأجزاء عن الجرافكس سنحاول أن نغطي مجموعة من الأفكار الصغيرة التي من الممكن أن نستفيد منها لاحقا في بناء فكرة كبيرة

عالم +GDI

المهتمين بالرسم أو بالجرافكس بشكل عام يعلمون جيدا معني كلمة +GDI وأيضا يعلمون جيدا كيف يستخدمون الأوامر الخاصة بمكتبة +GDI لرسم الأشكال الهندسية المختلفة أو رسم الصور أو أي شئ أخر علي الفورم أو علي الكونترول لذلك نحن هنا لن نناقش كيف نرسم بل سوف نناقش كيف نستفيد ونطور من عمليات الرسم المختلفة وبالتالي نستفيد منها في بناء ما نريده

الفكرة الأولي:

الفكرة الأولي التي سوف نتحدث عنها اليوم هي رسم أي شكل هندسي ومن ثم نقوم بتحريك هذا الشكل الهندسي باستخدام الماوس في اي إتجاه نريده والمجموعة التالية من الأمثلة سوف توضح كيفية عمل ذلك

المثال الأول :

لكي نرسم أي شكل هندسي علي الفورم ولنأخذ المستطيل كمثال غالبا ما نحتاج الي تعريف نقطة بداية عملية الرسم وأيضا أبعاد هذا المستطيل اي أننا نحتاج الي تعريف Location وأيضا Size ومن ثم نقوم برسم هذه المستطيل علي سطح الفورم أو الكونترول باستخدام أوامر +GDI وغاليا ما يتم ذلك في الحدث Paint وهذا الحدث موجود في كل من الفورم والكونترول والكود التالي يوضح الفكرة


كود :
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
' تعريف نقطة بداية الرسم
Dim startPoint As Point = New Point(10, 10)
' تعريف أبعاد المستطيل
Dim RectangleSize As Size = New Size(100, 100)
' تعريف المستطيل
Dim Rect As Rectangle = New Rectangle(startPoint, RectangleSize)
' تلوين المستطيل
e.Graphics.FillRectangle(Brushes.Red, Rect)
' رسم المستطيل
e.Graphics.DrawRectangle(Pens.Blue, Rect)
End Sub
أيضا من الممكن الرسم عن طريق عمل Overrides للحدث Paint والكود التالي يوضح الفكرة


كود :
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
' تعريف نقطة بداية الرسم
Dim startPoint As Point = New Point(10, 10)
' تعريف أبعاد المستطيل
Dim RectangleSize As Size = New Size(100, 100)
' تعريف المستطيل
Dim Rect As Rectangle = New Rectangle(startPoint, RectangleSize)
' تلوين المستطيل
e.Graphics.FillRectangle(Brushes.Red, Rect)
' رسم المستطيل
e.Graphics.DrawRectangle(Pens.Blue, Rect)
End Sub
المثال الثاني:

في المثال الأول قمنا بتثبيت القيم الخاصة بالمستطيل مثل بداية نقطة الرسم و أيضا أبعاد المستطيل وبالتالي سيظل هذا المستطيل مرسوما بشكل دائم علي الفورم ولكي نستطيع ان نتحكم في الشكل المرسوم بشكل أفضل نحتاج الي أن يتم تعريف جميع المتغيرات الخاصة به بشكل عام والكود التالي يوضح ذلك


كود :
Public Class Form1
Private startPoint As Point = New Point(10, 10)
Private RectangleSize As Size = New Size(100, 100)
Private Rect As Rectangle

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
' تعريف المستطيل
Rect = New Rectangle(startPoint, RectangleSize)
' تلوين المستطيل
e.Graphics.FillRectangle(Brushes.Red, Rect)
' رسم المستطيل
e.Graphics.DrawRectangle(Pens.Blue, Rect)
End Sub
End Class
أيضا من الممكن الرسم عن طريق عمل Overrides للحدث Paint والكود التالي يوضح الفكرة


كود :
Public Class Form1

Private startPoint As Point = New Point(10, 10)
Private RectangleSize As Size = New Size(100, 100)
Private Rect As Rectangle

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
' تعريف المستطيل
Rect = New Rectangle(startPoint, RectangleSize)
' تلوين المستطيل
e.Graphics.FillRectangle(Brushes.Red, Rect)
' رسم المستطيل
e.Graphics.DrawRectangle(Pens.Blue, Rect)
End Sub

End Class
المثال الثالث:

في هذا المثال سنحاول تحريك المستطيل عن طريق استخدام الماوس ولكي نفعل ذلك نحتاج الي تعريف بعض المتغيرات الإضافية حتي نستطيع أن نقوم بعمل إرتباط بين المستطيل ومكان الماوس علي الفورم أو علي الكونترول

والكود التالي يوضح المتغيرات التي نحتاجها مع توضيح للهدف من كل من متغير قمنا بتعريفه
بالإضافة الي كيفية استخدام كل متغير في ألأحداث الخاصة بالفورم مثل الحدث Paint و MouseDown و MouseMove وأيضا MouseUp


كود :
Public Class Form1

' نقطة بداية الرسم
Private startPoint As Point = New Point(10, 10)
' أبعاد المستطيل
Private RectangleSize As Size = New Size(100, 100)
' تعريف المستطيل
Private Rect As Rectangle
' تعريف نقطة سوف تستخدم لتحديد مكان نقطة تحريك المستطيل
Private emptyPoint As Point = Point.Empty
' تعريف متغير رقمي يشير الي نقطة رسم المستطيل في الاتجاه الأفقي أثاء حركة الماوس
Private x As Integer = startPoint.X
' تعريف متغير رقمي يشير الي نقطة رسم المستطيل في الاتجاه الرأسي أثناء حركة الماوس
Private y As Integer = startPoint.Y

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
Rect = New Rectangle(x, y, RectangleSize.Width, RectangleSize.Height)
Using lgb As New Drawing2D.LinearGradientBrush(Rect, Color.FromArgb(255, Color.DarkBlue), Color.FromArgb(255, Color.Cyan), 90, True)
e.Graphics.FillRectangle(lgb, Rect)
End Using
End Sub

Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
MyBase.OnMouseDown(e)
If e.Button = Windows.Forms.MouseButtons.Right Then Return
' تمرير قيمة للمتغير الذي يشير الي مكان أو نقطة تحريك المستطيل عن طريق ربطها مع الماوس
emptyPoint.X = e.Location.X
emptyPoint.Y = e.Location.Y
End Sub

Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
MyBase.OnMouseMove(e)
' هنا نتأكد أن المتغير الذي يشير الي نقطة تحريك الماوس بالفعل يمتلك بعض القيم
If emptyPoint = Point.Empty Then Return
' هما نمرر قيم جديدة لنقطة بداية رسم المستطيل في الاتجاه الأفقي
x = e.X - emptyPoint.X + startPoint.X
' هنا نمرر قيم جديدة لنقطة بداية رسم المستطيل في الاتجاه الرأسي
y = e.Y - emptyPoint.Y + startPoint.Y
' هنا نطلب من الفورم أن يعيد رسم المستطيل
Me.Invalidate()
End Sub

Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
MyBase.OnMouseUp(e)
' هنا نتأكد بأن المستخدم قام باستخدام الباتون الخاص بيسار الماوس
If e.Button = Windows.Forms.MouseButtons.Right Then Return
' هنا نمرر قيمة جديدة الب نقطة باية رسم المستطيل
startPoint.X += e.X - emptyPoint.X
startPoint.Y += e.Y - emptyPoint.Y
' هنا نعيد المتغير الذي يشير الي مكان تحريك المستطيل الي قيمته الأصلية وهي لا شئ
emptyPoint = Point.Empty
End Sub

End Class

المثال الرابع:

تحريك المستطيل في الاتجاه الأفقي فقط والكود التالي يوضح ذلك


كود :
Public Class Form1

' نقطة بداية الرسم
Private startPoint As Point = New Point(10, 10)
' أبعاد المستطيل
Private RectangleSize As Size = New Size(100, 100)
' تعريف المستطيل
Private Rect As Rectangle
' تعريف نقطة سوف تستخدم لتحديد مكان نقطة تحريك المستطيل
Private emptyPoint As Point = Point.Empty
' تعريف متغير رقمي يشير الي نقطة رسم المستطيل في الاتجاه الأفقي أثاء حركة الماوس
Private x As Integer = startPoint.X

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
Rect = New Rectangle(x, startPoint.Y, RectangleSize.Width, RectangleSize.Height)
Using lgb As New Drawing2D.LinearGradientBrush(Rect, Color.FromArgb(255, Color.DarkBlue), Color.FromArgb(255, Color.Cyan), 90, True)
e.Graphics.FillRectangle(lgb, Rect)
End Using
End Sub

Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
MyBase.OnMouseDown(e)
If e.Button = Windows.Forms.MouseButtons.Right Then Return
' تمرير قيمة للمتغير الذي يشير الي مكان أو نقطة تحريك المستطيل عن طريق ربطها مع الماوس
emptyPoint.X = e.Location.X
End Sub

Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
MyBase.OnMouseMove(e)
' هنا نتأكد أن المتغير الذي يشير الي نقطة تحريك الماوس بالفعل يمتلك بعض القيم
If emptyPoint = Point.Empty Then Return
' هما نمرر قيم جديدة لنقطة بداية رسم المستطيل في الاتجاه الأفقي
x = e.X - emptyPoint.X + startPoint.X
' هنا نطلب من الفورم أن يعيد رسم المستطيل
Me.Invalidate()
End Sub

Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
MyBase.OnMouseUp(e)
' هنا نتأكد بأن المستخدم قام باستخدام الباتون الخاص بيسار الماوس
If e.Button = Windows.Forms.MouseButtons.Right Then Return
' هنا نمرر قيمة جديدة الب نقطة باية رسم المستطيل
startPoint.X += e.X - emptyPoint.X
' هنا نعيد المتغير الذي يشير الي مكان تحريك المستطيل الي قيمته الأصلية وهي لا شئ
emptyPoint = Point.Empty
End Sub

End Class
المثال الخامس:

تحريك المستطيل في الاتجاه الرأسي فقط والكود التالي يوضح ذلك


كود :
Public Class Form1

' نقطة بداية الرسم
Private startPoint As Point = New Point(10, 10)
' أبعاد المستطيل
Private RectangleSize As Size = New Size(100, 100)
' تعريف المستطيل
Private Rect As Rectangle
' تعريف نقطة سوف تستخدم لتحديد مكان نقطة تحريك المستطيل
Private emptyPoint As Point = Point.Empty
' تعريف متغير رقمي يشير الي نقطة رسم المستطيل في الاتجاه الرأسي أثناء حركة الماوس
Private y As Integer = startPoint.Y

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
Rect = New Rectangle(startPoint.X, y, RectangleSize.Width, RectangleSize.Height)
Using lgb As New Drawing2D.LinearGradientBrush(Rect, Color.FromArgb(255, Color.DarkBlue), Color.FromArgb(255, Color.Cyan), 90, True)
e.Graphics.FillRectangle(lgb, Rect)
End Using
End Sub

Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
MyBase.OnMouseDown(e)
If e.Button = Windows.Forms.MouseButtons.Right Then Return
' تمرير قيمة للمتغير الذي يشير الي مكان أو نقطة تحريك المستطيل عن طريق ربطها مع الماوس
emptyPoint.Y = e.Location.Y
End Sub

Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
MyBase.OnMouseMove(e)
' هنا نتأكد أن المتغير الذي يشير الي نقطة تحريك الماوس بالفعل يمتلك بعض القيم
If emptyPoint = Point.Empty Then Return
' هنا نمرر قيم جديدة لنقطة بداية رسم المستطيل في الاتجاه الرأسي
y = e.Y - emptyPoint.Y + startPoint.Y
' هنا نطلب من الفورم أن يعيد رسم المستطيل
Me.Invalidate()
End Sub

Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
MyBase.OnMouseUp(e)
' هنا نتأكد بأن المستخدم قام باستخدام الباتون الخاص بيسار الماوس
If e.Button = Windows.Forms.MouseButtons.Right Then Return
' هنا نمرر قيمة جديدة الب نقطة باية رسم المستطيل
startPoint.Y += e.Y - emptyPoint.Y
' هنا نعيد المتغير الذي يشير الي مكان تحريك المستطيل الي قيمته الأصلية وهي لا شئ
emptyPoint = Point.Empty
End Sub

End Class
في الكود الخاص بالمثال الثالث الي الخامس أعلاه بعض القصور وهي كالتالي

1- إهتزاز الرسم أثناء عملية تحريك المستطيل
2- عند الضغط علي الفورم في اي ماكن بالمثال الثالث يتم تحريك المستطيل
3- عند الضغط علي الفورم في يمين أو يسار المستطيل بالمثال الرابع يتم تحريك المستطيل
4- عند الضغط علي الفورم في أعلي أو أسفل المستطيل بالمثال الخامس يتم تحريك المستطيل
5- عند تحريك المستطيل خارج أبعاد الفورم يبدأ المستطيل في الاختفاء

حاول عزيزي القارئ أن تجد حلولا لمثل هذه المشاكل وحاول أيضا أن تستخدم شكلا هندسيا أخر غير المستطيل ..... وذلك قبل أن تقرأ المشاركات التالية والخاصة بالفكرة التي نتحدث عنها في هذا الجزء الأول

ملحوظة:

ألا يذكرك الكود الموجود أعلاه بأي كونترول تستخدمه علي سبيل المثال TrackBar أو ScrollBar وهذا يعود بنا إلي بداية المقال وهو أن مجموعة أفكار صغيرة سوف تؤدي الي بناء فكرة كبيرة


مع تحياتي
أخوكم عمر
}}}
تم الشكر بواسطة:
#2
في المشاركات السابقة من الجزء الأول كان هناك بعض القصور في الكود الذي استخدمناه في المثال الثالث الي الخامس وفي المشاركة هذه وأيضا في المشاركات التالية سوف نحاول التخلص من هذا القصور في الكود

1- لكي نتخلص من Flicker أو من الإهتزازات التي نراها أثناء عملية تحريك الشكل الهندسي علينا أن نقوم إما بضبط خاصية DoubleBuffered بحيث نجعل قيمتها تساوي True وهذا يحدث في مرحلة DesignTime أو من الممكن أن نغير القيمة برمجيا

حل أخر وهو أن نستخدم SetStyle لضبط القيم التي تؤثر علي DoubleBuffering والكود التالي يوضح كيفية عمل ذلك


كود :
Public Sub New()
InitializeComponent()

Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.UserPaint, True)

End Sub
}}}
تم الشكر بواسطة:
#3

2- تحريك المستطيل في الاتجاه الأفقي فقط

المثال السادس:

لكي نتخلص من أوجه القصور الموجودة بالمثال الرابع أعلاه يجب علينا أن نعيد صياغة المتغيرات قليلا بحيث تتناسب مع احتتياجات الفكرة التي نتحدث عنها وبالتالي سوف نحتاج الي اضافة متغيرات جديدة وبشكل مختلف قليلا وهذه المتغيرات كالتالي:

1- تعريف متغير يشير الي الشكل المراد تحريكه وهو عبارة عن Rectangle
2- تعريف متغير يشير الي عرض هذه المستطيل وهو عبارة عن Integer
3- تعريف متغير يشير الي ارتفاع المستطيل وهو عبارة عن Integer
4- تعريف متغير يشير الي أقصي مسافة يمكن أن يتحركها المستطيل وهو عبارة عن Integer
5- تعريف متغير يشير الي أقل مسافة يمكن أن يتحركها المستطيل وهو عبارة عن Integer
6- تعريف متغير يشير الي نصف ارتفاع المستطيل وهو سيكون عبارة عن Integer
7- تعريف متغير يشير الي الفارق بين أقصي مسافة يستطيع أن يتحركها المستطيل مطروحا منها عرض المستطيل وهو سيكون عبارة عن Integer
8- تعريف متغير يشير الي أن الماوس موجود بالفعل داخل المستطيل وهو سيكون عبارة عن Boolean
9- تعريف متغير يشير الي أن الماوس علي يمين المستطيل وهو سيكون عبارة عن Boolean
10- تعريف متغير يشير يشير الي أن الماوس علي يمين المستطيل وهو سيكون عبارة عن Boolean

والكود التالي يوضح شكل هذه المتغيرات


كود :
Public Class Form1

Private rect As Rectangle
Private IsMouseInRectLeft As Boolean = False
Private IsMouseInRectRight As Boolean = False
Private IsMouseInsideRect As Boolean = False
Private rectWidth As Integer = 22
Private rectHeight As Integer = 22
Private maximumHorizontal As Integer = 0
Private minimumHorizontal As Integer = 0
Private x As Integer = 0
Private MiddleOfRectWidth As Integer = 0

End Class
الكود التالي يوضح كيفية ربط المتغيرات التي تم تعريفها وإعطاؤها قيما أولية لكي تتم عملية رسم المستطيل بشكل سليم


كود :
Private Sub SetGraphicsData()
rect = New Rectangle(Me.ClientRectangle.X, Me.ClientRectangle.Y, rectWidth, rectHeight)
MiddleOfRectWidth = rectWidth / 2
maximumHorizontal = Me.ClientRectangle.Right
minimumHorizontal = Me.ClientRectangle.X
x = maximumHorizontal - rectWidth
End Sub

نضبط Flicker أو الاهتزازات الناتجة عن تحريك المستطيل كما سبق وأوضحنا في المشاركة السابقة وأيضا نمرر القيم الأولية لكي تحدث عملية الرسم بشكل صحيح والكود التالي يوضح ذلك


كود :
Public Sub New()
InitializeComponent()

Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.UserPaint, True)

SetGraphicsData()

End Sub

نعيد صياغة الكود الخاص بأحداث الماوس وهي MouseDown و MouseUp و MouseMove بحيث نربط المتغيرات التي قمنا بتعريفها مع القيم الخاصة بمكان الماوس علي الفورم والكود يوضح ذلك


كود :
Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
MyBase.OnMouseDown(e)

If rect.Contains(e.Location) Then
IsMouseInsideRect = True
MiddleOfRectWidth = e.Location.X - rect.X
Else
If e.Location.X < Me.rect.X Then
IsMouseInRectLeft = True
Else
IsMouseInRectRight = True
End If
End If

Invalidate()
End Sub

Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
MyBase.OnMouseUp(e)

If IsMouseInsideRect Then
IsMouseInsideRect = False
If e.Location.X > minimumHorizontal + MiddleOfRectWidth And _
e.Location.X < x + MiddleOfRectWidth Then
rect.X = e.Location.X - MiddleOfRectWidth
IsMouseInsideRect = False
End If

ElseIf IsMouseInRectLeft Then
IsMouseInRectLeft = False

ElseIf IsMouseInRectRight Then
IsMouseInRectRight = False
End If

Invalidate()
End Sub

Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
MyBase.OnMouseMove(e)
If IsMouseInsideRect Then
If e.Location.X <= minimumHorizontal + MiddleOfRectWidth Then
rect.X = minimumHorizontal
ElseIf e.Location.X >= x + MiddleOfRectWidth Then
rect.X = x
Else
rect.X = e.Location.X - MiddleOfRectWidth
End If
Invalidate()
End If
End Sub
الأن لنرسم المستطيل علي الفورم من خلالا الحدث Paint ويمكن هنا أن نقوم برسم اي شئ نريده بشرط أن نرسمه قبل أن نرسم المستطيل المراد تحريكه وهنا قمت برسم مستطيل سيعمل كخلفة للمستطيل المراد تحريكه والكود التالي يوضح ذلك


كود :
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)

Dim backRectangle As New Rectangle(Me.ClientRectangle.X, Me.ClientRectangle.Y, Me.Width, rect.Height)
Using lgbBack As New Drawing2D.LinearGradientBrush(backRectangle, Color.Orange, Color.Yellow, 90, True)
e.Graphics.FillRectangle(lgbBack, backRectangle)
End Using

Using lgb As New Drawing2D.LinearGradientBrush(rect, Color.FromArgb(255, Color.Cyan), Color.FromArgb(255, Color.DarkBlue), Drawing2D.LinearGradientMode.Vertical)
e.Graphics.FillRectangle(lgb, rect)
e.Graphics.DrawRectangle(New Pen(Color.DarkBlue, 1.5F), rect)
End Using

End Sub
أخر شئ يجب علينا أن نفعله هو أن نتأكد دائما أن عملية رسم المستطيل ستتم بشكل جيد وذلك عندما تتغير ابعاد الفورم أو الكونترول والحدثان المسئولان عن ذلك هما الحدث OnResize وأيضا الحدث OnSizeChanged والكود التالي يوضح ذلك


كود :
Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
MyBase.OnResize(e)
SetGraphicsData()
Invalidate()
End Sub

Protected Overrides Sub OnSizeChanged(ByVal e As EventArgs)
MyBase.OnSizeChanged(e)
SetGraphicsData()
End Sub

الكود التالي يوضح الكود النهائي والخاص بكيفية تحريك المستطيل في الاتجاه الأفقي



كود :
' Horizontal Movement
Public Class Form1

Private rect As Rectangle
Private IsMouseInRectLeft As Boolean = False
Private IsMouseInRectRight As Boolean = False
Private IsMouseInsideRect As Boolean = False
Private rectWidth As Integer = 22
Private rectHeight As Integer = 22
Private maximumHorizontal As Integer = 0
Private minimumHorizontal As Integer = 0
Private x As Integer = 0
Private MiddleOfRectWidth As Integer = 0

Public Sub New()
InitializeComponent()

Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.UserPaint, True)

SetGraphicsData()

End Sub

Private Sub SetGraphicsData()
rect = New Rectangle(Me.ClientRectangle.X, Me.ClientRectangle.Y, rectWidth, rectHeight)
MiddleOfRectWidth = rectWidth / 2
maximumHorizontal = Me.ClientRectangle.Right
minimumHorizontal = Me.ClientRectangle.X
x = maximumHorizontal - rectWidth
End Sub

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)

Dim backRectangle As New Rectangle(Me.ClientRectangle.X, Me.ClientRectangle.Y, Me.Width, rect.Height)
Using lgbBack As New Drawing2D.LinearGradientBrush(backRectangle, Color.Orange, Color.Yellow, 90, True)
e.Graphics.FillRectangle(lgbBack, backRectangle)
End Using

Using lgb As New Drawing2D.LinearGradientBrush(rect, Color.FromArgb(255, Color.Cyan), Color.FromArgb(255, Color.DarkBlue), Drawing2D.LinearGradientMode.Vertical)
e.Graphics.FillRectangle(lgb, rect)
e.Graphics.DrawRectangle(New Pen(Color.DarkBlue, 1.5F), rect)
End Using

End Sub

Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
MyBase.OnMouseDown(e)

If rect.Contains(e.Location) Then
IsMouseInsideRect = True
MiddleOfRectWidth = e.Location.X - rect.X
Else
If e.Location.X < Me.rect.X Then
IsMouseInRectLeft = True
Else
IsMouseInRectRight = True
End If
End If

Invalidate()
End Sub

Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
MyBase.OnMouseUp(e)

If IsMouseInsideRect Then
IsMouseInsideRect = False
If e.Location.X > minimumHorizontal + MiddleOfRectWidth And _
e.Location.X < x + MiddleOfRectWidth Then
rect.X = e.Location.X - MiddleOfRectWidth
IsMouseInsideRect = False
End If

ElseIf IsMouseInRectLeft Then
IsMouseInRectLeft = False

ElseIf IsMouseInRectRight Then
IsMouseInRectRight = False
End If

Invalidate()
End Sub

Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
MyBase.OnMouseMove(e)
If IsMouseInsideRect Then
If e.Location.X <= minimumHorizontal + MiddleOfRectWidth Then
rect.X = minimumHorizontal
ElseIf e.Location.X >= x + MiddleOfRectWidth Then
rect.X = x
Else
rect.X = e.Location.X - MiddleOfRectWidth
End If
Invalidate()
End If
End Sub

Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
MyBase.OnResize(e)
SetGraphicsData()
Invalidate()
End Sub

Protected Overrides Sub OnSizeChanged(ByVal e As EventArgs)
MyBase.OnSizeChanged(e)
SetGraphicsData()
End Sub

End Class
}}}
تم الشكر بواسطة:
#4
3- تحريك المستطل في الاتجاه الراسي فقط

المثال السابع:

الكود والمتغيرات لا تختلف كثيرا عن الكود الخاص بتحريك الفورم في الاتجاه الأفقي والموجودة بالمثال السادس أعلاه .... عليك عزيزي القارئ أن تلاحظ الفارق فقط في ربط المتغيرات مع حركة الماوس الراسية في أحداث الماوس أو كيفية الرسم في الاتجاه الأفقي أو كيفية ربط أبعاد المستطيل المراد تحريكه مع أبعاد الفورم والكود النهائي لكيفية تحريك المستطيل في الاتجاه الراسي كالتالي


كود :
' Vertical Movement
Public Class Form3

Private rect As Rectangle
Private rectWidth As Integer = 22
Private rectHeight As Integer = 22
Private y As Integer = 0
Private MiddleOfRectHeight As Integer = 0
Private maximumVertical As Integer = 0
Private minimumVertical As Integer = 0
Private IsMouseAboveRectangle As Boolean = False
Private IsMouseUnderRectangle As Boolean = False
Private IsMouseInsideRect As Boolean = False

Public Sub New()
InitializeComponent()

Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.UserPaint, True)

SetGraphicsData()

End Sub

Private Sub SetGraphicsData()
rect = New Rectangle(Me.ClientRectangle.X, Me.ClientRectangle.Y, rectWidth, rectHeight)
MiddleOfRectHeight = rectHeight / 2
maximumVertical = Me.ClientRectangle.Bottom
minimumVertical = Me.ClientRectangle.Y
y = maximumVertical - rectHeight
End Sub

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)

Dim backRectangle As New Rectangle(Me.ClientRectangle.X, Me.ClientRectangle.Y, rect.Width, Me.Height)
Using lgbBack As New Drawing2D.LinearGradientBrush(backRectangle, Color.Orange, Color.Yellow, 180, True)
e.Graphics.FillRectangle(lgbBack, backRectangle)
End Using

Using lgb As New Drawing2D.LinearGradientBrush(rect, Color.FromArgb(255, Color.Cyan), Color.FromArgb(255, Color.DarkBlue), Drawing2D.LinearGradientMode.Horizontal)
e.Graphics.FillRectangle(lgb, rect)
e.Graphics.DrawRectangle(New Pen(Color.DarkBlue, 1.5F), rect)
End Using

End Sub

Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
MyBase.OnMouseDown(e)

If rect.Contains(e.Location) Then
IsMouseInsideRect = True
MiddleOfRectHeight = e.Location.Y - rect.Y
Else
If e.Location.Y < Me.rect.Y Then
IsMouseAboveRectangle = True
Else
IsMouseUnderRectangle = True
End If
End If

Invalidate()
End Sub

Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
MyBase.OnMouseUp(e)

If IsMouseInsideRect Then
IsMouseInsideRect = False
If e.Location.Y > minimumVertical + MiddleOfRectHeight And _
e.Location.Y < y + MiddleOfRectHeight Then
rect.Y = e.Location.Y - MiddleOfRectHeight
IsMouseInsideRect = False
End If

ElseIf IsMouseAboveRectangle Then
IsMouseAboveRectangle = False

ElseIf IsMouseUnderRectangle Then
IsMouseUnderRectangle = False
End If

Invalidate()
End Sub

Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
MyBase.OnMouseMove(e)
If IsMouseInsideRect Then
If e.Location.Y <= minimumVertical + MiddleOfRectHeight Then
rect.Y = minimumVertical
ElseIf e.Location.Y >= y + MiddleOfRectHeight Then
rect.Y = y
Else
rect.Y = e.Location.Y - MiddleOfRectHeight
End If
Invalidate()
End If
End Sub

Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
MyBase.OnResize(e)
SetGraphicsData()
Invalidate()
End Sub

Protected Overrides Sub OnSizeChanged(ByVal e As EventArgs)
MyBase.OnSizeChanged(e)
SetGraphicsData()
End Sub

End Class

بالنسبة لتحريك المستطيل في جميع الاتجاهات سوف اترك ذلك للقارئ ليقوم بكتابة الكود الخاص بذلك وبشكل عام هو سيكون خليطا من الكود المستخدم في المثال السادس بالمشاركة السابقة والمثال السابع أعلاه

وبذلك نكون قد انتهينا من الجزء الأول لهذا المقال

تقبلوا تحياتي
أخوكم عمر
}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! أنس محمود 10 7,825 19-07-22, 12:15 AM
آخر رد: StartLight4000
  مقال: الكومبو بوكس ComboBox كيف تضيف أيقونات Blue Sky 1 3,158 30-06-19, 10:41 AM
آخر رد: invocker
  [درس فيديو] مثال بسيط لبرنامج إجازات فقط لأغراض الشرح (الدرس الأول) عبدالله الدوسري 7 11,537 28-04-18, 06:55 PM
آخر رد: moniam
  حساب قيمة معادلة(اقصد صيغة دون مجاهيل) مكتوبة بالتكست : الجزء الخامس والاخير محمد شريقي 4 4,517 23-02-18, 10:44 PM
آخر رد: العواد الصغير
  أفكار في الجرافكس AlignRectangle silverlight 0 1,557 14-10-17, 02:02 PM
آخر رد: silverlight
  مقدمة إلي إخفاء المعلومات - الجزء الأول silverlight 5 4,151 07-01-17, 10:44 PM
آخر رد: Basil Abdallah
  مقدمة إلي إخفاء المعلومات - الجزء الثاني silverlight 1 3,026 06-01-17, 11:52 AM
آخر رد: silverlight
  تحويل الفيديو في برامجك-الجزء الثاني( إصلاح للمشاكل + تعديل للروابط + توضيح للأمر ) RaggiTech 1 3,276 10-12-14, 06:37 PM
آخر رد: abulayth
  الجزء الثاني من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج ( العمليات المتعددة)! أنس محمود 0 2,818 22-02-13, 12:39 AM
آخر رد: أنس محمود
  مقال- كيفية الاستغناء عن الداتا بيز التقليدية في برامجنا – ألجزء الأول RaggiTech 1 3,426 06-10-12, 12:23 AM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم