تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
مقال- أفكار في الجرافكس ..... الجزء الثالث
#1
كاتب الموضوع : 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
في واقع الأمر إن مقدرة المبرمج علي تحويل أجزاء من الكود الي دوال Functions أو الي روتينات Methods/Sub يجعل الكود اسهل وأقصر وأيضا يمكن الاستفادة من مثل هذه الدوال أو الروتينات بشكل عام في اي برامج وبشكل لا يحتاج فيه المبرمج الي إعادة صياغة وكتابة الكود اكثر من مرة لذلك من الأفضل تحويل الكود أعلاه الي دالة Function

الكود التالي يوضح شكل الكود بعد تحويل جزء منه الي دالة أو أكثر

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


كود :
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
المثال الثاني : استخدام الدالة GetRoundedPath لرسم المستطيل بحواف دائرية وبأكثر من أسلوب وفي الكود أدناه تم رسم المستطيل بحيث تكون حوافه اليسري فقط لها شكل دائري



كود :
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
يمكنك عزيزي القارئ أن تجرب تمرير قيم الي الدالة بأن تجعل القيم جميعها صفرا أو تجعل بعضها صفرا ولاحظ الفارق في شكل المستطيل وبالتاكيد ليس شرطا أن تكون قيمة نصف القطر متساوية
حيث يمكنك استخدام ارقام مختلفة لنصف القطر


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

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


الردود في هذا الموضوع
مقال- أفكار في الجرافكس ..... الجزء الثالث - بواسطة Raggi Tech - 05-10-12, 11:39 AM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! أنس محمود 10 8,378 19-07-22, 12:15 AM
آخر رد: StartLight4000
  مقال: الكومبو بوكس ComboBox كيف تضيف أيقونات Blue Sky 1 3,452 30-06-19, 10:41 AM
آخر رد: invocker
  حساب قيمة معادلة(اقصد صيغة دون مجاهيل) مكتوبة بالتكست : الجزء الخامس والاخير محمد شريقي 4 4,827 23-02-18, 10:44 PM
آخر رد: العواد الصغير
  أفكار في الجرافكس AlignRectangle silverlight 0 1,714 14-10-17, 02:02 PM
آخر رد: silverlight
  مقدمة إلي إخفاء المعلومات - الجزء الأول silverlight 5 4,501 07-01-17, 10:44 PM
آخر رد: Basil Abdallah
  مقدمة إلي إخفاء المعلومات - الجزء الثاني silverlight 1 3,209 06-01-17, 11:52 AM
آخر رد: silverlight
  تحويل الفيديو في برامجك-الجزء الثاني( إصلاح للمشاكل + تعديل للروابط + توضيح للأمر ) RaggiTech 1 3,509 10-12-14, 06:37 PM
آخر رد: abulayth
  الجزء الثاني من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج ( العمليات المتعددة)! أنس محمود 0 3,003 22-02-13, 12:39 AM
آخر رد: أنس محمود
  مقال- كيفية الاستغناء عن الداتا بيز التقليدية في برامجنا – ألجزء الأول RaggiTech 1 3,684 06-10-12, 12:23 AM
آخر رد: RaggiTech
  مقال- تطوير الكونترول Property Attributes الجزء الثالث RaggiTech 0 2,472 06-10-12, 12:20 AM
آخر رد: RaggiTech

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


يقوم بقرائة الموضوع: