05-10-12, 11:39 AM
كاتب الموضوع : silverlight
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
مقدمـــــة:
في الأجزاء السابقة ناقشنا كيفية الاستفادة من +GDI بأكثر من أسلوب و في الجزء الثاني تحديدا ناقشنا كيفية رسم Glow وفي هذه الجزء سنناقش كيفية رسم Glow بطريقة أخري مختلفة.
ولمن يريد مراجعة الأجزاء السابقة يمكنه مراجعة اللينك التالية:
الجزء الأول : http://vb4arb.com/vb/showthread.php?1175
الجزء الثاني : http://vb4arb.com/vb/showthread.php?1176
الفكرة الثالثة:
رسم Glow بطريقة ثانية مختلفة.
أولا قبل مناقشة كيفية رسم Glow لنناقش بعض الأفكار البسيطة التي ستكون مفيدة بشكل عام لاحقا وسنعطي أمثلة علي ذلك.
من المؤكد أن المهتمين بعمليات الرسم يعلمون جيدا كيف يرسمون مستطيلا له حواف دائرية لذلك فإن الكود التالي ليس جديدا عليهم
المثال الأول : رسم مستطيل له حواف دائرية
كود :
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
' تعريف مستطيل بالأبعاد المناسبة
Dim rect As New Rectangle(10, 10, 100, 100)
' تعريف نصف قطر بشرط عل أن لا يكود دائما أقل من أو يساو صفر
Dim raduis As Integer = 10
' تعريف مسار الرسم
Dim path As New GraphicsPath
' تعريفبعض المتغيرات التي تعبر عن أبعاد المستطيل ومكان بداية المستطيل
Dim x As Integer = rect.X
Dim y As Integer = rect.Y
Dim w As Integer = rect.Width
Dim h As Integer = rect.Height
' رسم قوس في اقصي أعلي يسار المستطيل
path.AddArc(x, y, raduis, raduis, 180.0F, 90.0F)
' رسم قوس في أقصي أعلي يمين المستطيل
path.AddArc(((x + w) - raduis), y, raduis, raduis, 270.0F, 90.0F)
' رسم قوس في اقصي أسفل يمين المستطيل
path.AddArc(((x + w) - raduis), ((y + h) - raduis), raduis, raduis, 0.0F, 90.0F)
' رسم قوس في أقصي اسفل يسار المستطيل
path.AddArc(x, ((y + h) - raduis), raduis, raduis, 90.0F, 90.0F)
' إخفاء التشوهات الناتجة عن الرسم
' لو قمت بإلغاء السطر التالي من الكود ستلاحظ بعض التشوهات في الرسم وتحديدا عند الحواف الدائرية
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias
' في النهاية نرسم المسار بواحدة من الطرق التالية
' الطريقة الأولي
' رسم المسار بإستخدام لون واحد
Using sb As New SolidBrush(Color.Red)
e.Graphics.FillPath(sb, path)
End Using
' الطريقة الثانية
' رسم المسار بإستخدام لونين
Using lgb As New Drawing2D.LinearGradientBrush(rect, Color.DarkRed, Color.Red, 90, True)
e.Graphics.FillPath(lgb, path)
End Using
' الطريقة الثالثة
' رسم المسار باستخدام أكثر من لون
Dim pgb As New Drawing2D.PathGradientBrush(path)
pgb.SurroundColors = New Color() {Color.DarkCyan, Color.RoyalBlue, Color.SteelBlue, Color.Cyan}
pgb.CenterColor = Color.SteelBlue
e.Graphics.FillPath(pgb, path)
path.Dispose()
End Subالكود التالي يوضح شكل الكود بعد تحويل جزء منه الي دالة أو أكثر
وستلاحظون أنه قد تم وضع بعض الشروط لكي نتأكد دائما أن نصف القطر لا يقل عن أو يساوي صفرا
كود :
Public Class Form1
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
' تعريف مستطيل بالأبعاد المناسبة
Dim rect As New Rectangle(10, 10, 100, 100)
' تعريف مسار الرسم
Dim path As GraphicsPath = GetRoundedPath(rect, 10)
' إخفاء التشوهات الناتجة عن الرسم
' لو قمت بإلغاء السطر التالي من الكود ستلاحظ بعض التشوهات في الرسم وتحديدا عند الحواف الدائرية
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias
' في النهاية نرسم المسار بواحدة من الطرق التالية
' الطريقة الأولي
' رسم المسار بإستخدام لون واحد
Using sb As New SolidBrush(Color.Red)
e.Graphics.FillPath(sb, path)
End Using
' الطريقة الثانية
' رسم المسار بإستخدام لونين
Using lgb As New Drawing2D.LinearGradientBrush(rect, Color.DarkRed, Color.Red, 90, True)
e.Graphics.FillPath(lgb, path)
End Using
' الطريقة الثالثة
' رسم المسار باستخدام أكثر من لون
Dim pgb As New Drawing2D.PathGradientBrush(path)
pgb.SurroundColors = New Color() {Color.DarkCyan, Color.RoyalBlue, Color.SteelBlue, Color.Cyan}
pgb.CenterColor = Color.SteelBlue
e.Graphics.FillPath(pgb, path)
path.Dispose()
End Sub
Private Function GetRoundedPath(ByVal rect As Rectangle, _
ByVal TopLeftRaduis As Integer, _
ByVal TopRightRaduis As Integer, _
ByVal BottomLeftRaduis As Integer, _
ByVal BottomRightRaduis As Integer) As GraphicsPath
If ((TopLeftRaduis = 0) OrElse (TopLeftRaduis < 0)) Then
TopLeftRaduis = 1
End If
If ((TopRightRaduis = 0) OrElse (TopRightRaduis < 0)) Then
TopRightRaduis = 1
End If
If ((BottomLeftRaduis = 0) OrElse (BottomLeftRaduis < 0)) Then
BottomLeftRaduis = 1
End If
If ((BottomRightRaduis = 0) OrElse (BottomRightRaduis < 0)) Then
BottomRightRaduis = 1
End If
Dim x As Integer = rect.X
Dim y As Integer = rect.Y
Dim width As Integer = rect.Width
Dim height As Integer = rect.Height
Dim path As New GraphicsPath
path.AddArc(x, y, TopLeftRaduis, TopLeftRaduis, 180.0F, 90.0F)
If (TopRightRaduis <> 1) Then
path.AddArc(((x + width) - TopRightRaduis), y, TopRightRaduis, TopRightRaduis, 270.0F, 90.0F)
Else
path.AddLine((x + width), y, (x + width), width)
End If
If (BottomRightRaduis <> 1) Then
path.AddArc(((x + width) - BottomRightRaduis), ((y + height) - BottomRightRaduis), BottomRightRaduis, BottomRightRaduis, 0.0F, 90.0F)
Else
path.AddLine(CInt((x + width)), CInt((y + height)), CInt((x + width)), CInt((y + height)))
End If
path.AddArc(x, ((y + height) - BottomLeftRaduis), BottomLeftRaduis, BottomLeftRaduis, 90.0F, 90.0F)
path.CloseFigure()
Return path
End Function
Private Function GetRoundedPath(ByVal rect As Rectangle, ByVal radius As Integer) As GraphicsPath
Return GetRoundedPath(rect, radius, radius, radius, radius)
End Function
End Classكود :
Public Class Form1
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
' تعريف مستطيل بالأبعاد المناسبة
Dim rect As New Rectangle(10, 10, 100, 100)
' تعريف مسار الرسم
Dim path As GraphicsPath = GetRoundedPath(rect, rect.Width / 2, 0, rect.Width / 2, 0)
' إخفاء التشوهات الناتجة عن الرسم
' لو قمت بإلغاء السطر التالي من الكود ستلاحظ بعض التشوهات في الرسم وتحديدا عند الحواف الدائرية
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias
' رسم المسار بإستخدام لون واحد
Using sb As New SolidBrush(Color.Red)
e.Graphics.FillPath(sb, path)
End Using
End Sub
End Classحيث يمكنك استخدام ارقام مختلفة لنصف القطر
باق الأمثلة والأفكار سيتم عرضها بالمشاركات التالية وفي النهاية سنعطي مثالا لكيفية استخدام هذه الأفكار في بناء شئ يمكن الاستفادة منه
تقبلوا تحياتي
أخوكم عمر
