SOLO.NET

معلومة/Programing GDI+ with VB.NET

37 ردود في هذا الموضوع

مقدمة

GDI+ هى الجيل الجديد من تقنية GDI (graphics deviceinterface) وهى عبارة عن مجموعة من المكتبات تزودنا بواجهه لانشاء تطبيقات مختلفية سواء تطبيقات ويندوز او ويب تلك التطبيقات الى تتفاعل مع اجهزة العرض المختلفة كالطابعات او الشاشات او الملفات

GDI+ هى مجموعة من المكتبات مكتوبة بلغة C++ توجد فى الملف المسمىGdiplus.dll وهذا الملف ياتى ضمنا مع ملفات تشغيل WindowsXPوWindows Server 2003

بالامكان استخدام GDI+ على انظمة اخرى خلاف XP وذلك بنسخ الملف Gdiplus.dllالى مجلد النظام

وبمجرد تحميل .NET FrameWork يتم نسخ هذا الملف اتوماتيكيا

ذكرنا قبل قليل ان GDI+ مكتوب بلغة C++ وبهذا يعتبر استخدامه بهذه اللغة كود غير مدار Unmanaged Code

فكيف يتم التعامل معه من خلال الدوت نت,الدوت نت يغلف هذه الفئات ويقدمها فى اطار دوت نت ككود مدار

ومكتبة الفئات المدارة فى الدوت نت تقع فى الملف System.Drawing.dll

يمكن تفسيم وظائف GDI+ الى ثلاث اقسام وهى 2D vector graphics, imaging, and typography

هذه فضاءات الاسماء التى تقع فيها فئات GDI+

System.Drawing, System.Drawing.Design, System.Drawing.Drawing2D, System.Drawing.Imaging, System.Drawing.Printing, and System.Drawing.Text

لمزيد من التفاصيل حول هذه الفضاءات وما تحتويه من فئات راجع MSDN

مفاهيم اساسية

اى برنامج رسم يشمل ثلاثة مكوّنات مشتركة: مسطح للرسم , فرشاة أو قلم، عملية.

1-مسطح الرسم هو المساحة التى سيتم الرسم عليها,فمثلا فى تطبيقات ويندوز يعتبر الفورم مكان للرسم.

2-الفرشاة أو القلم يمثّل الخام( لون، وعرض الهدف الذى سيرسم على المكان)

3 -العملية تصف كيف يرسم الهدف على المكان

على سبيل المثال لرسم مربع او خط انت بحاجة الى قلم او فرشاة مع تحديد مواصفاته(الخامtexture) و عملية تصف فيها كيف يتم الرسم ومكان ترسم عليه

GDI+يزودنا بثلاث انواع من اسطح الرسم هى:

1-النوافذFORMS + الادوات CONTROLS

2-الطابعاتPRINTERS

3-الصورBITMAPS

ولكل اسطح الرسم اربع خصائص مشتركة هى:

الطول والعرضwidth and height:وهى تمثل حجم مسطح الرسم ويتم تحديدها بعدد من البكسلPIXEL افقيا وعموديا

الدقةresolution:وهى تمثل مقياس جودة المخرجات لكائن الرسم او الصورة. مجموعة نقاط لكل انشDPI)),فمثلا الدقة 72 تعنى انه يوجد فى كل انش 72 بكسل افقيا وعموديا

عمق اللونcolor depth:هو عدد الالوان المستخدمة لتمثيل كل بكسل

تعريف البكسلPixel: يمكن تعريفه على انه اصغر عنصر مشارك فى عمليه الرسم لعرض كائن الرسم او الصورة على الشاشة.

نظام الاحداثيات(X,Y) فى GDI+

تختلف الاحداثيات السينية والصادية فى GDI+ عن الاحداثيات فى النظام الديكارتى فهى تبداء من الزاوية العليا على اليسار(يسار الشاشة)حيث فيها تكون قيم(X,Y) (0,0) والمحور السينى يكون باتجاه اليمين والمحور الصادى لللاسفل

كائنات GDI+

كائن اللون Color Object:

وهو عبارة عن تركيبةStructur تمثل الالوان من عناصرها الاساسية ARGB

A(ALPHA) ويمثل شفافية اللون

R(RED) اللون الاحمر

G(GREEN) اللون الاخضر

B(BLUE) اللون الازرق

حيث ان اى لون هو عبارة عن خليط من الالوان السابقة وكل لون ياخذ من القيمة 0 الى 255 اى بايت واحد

والقيمة 255 تمثل اشباع اللون

يمكن الحصول على اى لون عن طريق الخاصية Color والتى تعود باحدى قيم المرقم Color متمثلا فى اسم اللون

Dim color As Color = color.Blue

الطريقة FromArgb تستخدم لتكوين لون بتمرير القيم للالوان الاساسية

Dim color As Color = color.FromArgb(255, 0, 0, 255) 'return blue

كائن النقطةPoint Object

وهو عبارة عن هيكلية تمثل الاحداثيات السينية والصادية ويمكن انشاء مثيل من هذه التركيبة باستخدام الكلمة المحجوزة new ومنشئ الفئة تم اعادة تعريفة ثلاث مرات حيث يمكن انشاءه من قيمة واحدة(عدد صحيح) او من كائن الحجم Size Object او من قيمتين تمثلان الاحداثى السينى والصادى

Dim pt1 As Point = New Point(10)
Dim pt2 As Point = New Point(New Size(20, 20))
Dim pt3 As Point = New Point(30, 30)

كما يوجد ايضا الكائن PointF وهو مشابه للكائن الاول الا انه يختلف عنه بانه له منشئ واحد كما انه ياخذ قيم من النوع الحقيقى قيمتين تمثلا الاحداثى السينى والصادى

Dim pt As PointF = New PointF(10.5F, 10.5F)

الخاصية IsEmpty تعود بالقيمة True اذا كانت النقطة خالية اى قيمة x,y تساوى صفر ولانشاء نقطة خالية

Dim pt As Point = Point.Empty

كائن المستطيل Rectangle and RectangleF

وهو عبارة عن مستطيل تخزن به قيم الزاوية العليا اليسرى والعرض والارتفاع

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

يوجد لهذا الكائن خصائص التى التى تعود بقيم الاحداثيات

Dim pt As Point = New Point(10, 10)
       Dim sz As Size = New Size(20, 20)
       Dim rect As Rectangle = Rectangle.Empty
       rect.Location = pt
       rect.Width = sz.Width
       rect.Height = sz.Height
       '***************************
       Dim rect1 As Rectangle = New Rectangle(10, 10, 20, 20)

وطبعا الكائن RectangleF هو نفس Rectangle ولكن الفرق عنه انه ياخذ قيم من النوع الحقيقى ولا تنسى استخدام pointF,sizeF معه

كائن الحجم Size and SizeF

ويتم انشاءه من التركيبة SIZE تمثل الحجم (الراتفاع والعرض) والفرق بينهم الاول ياخذ ارقام من النوع INTEGER والثانى REAL

Dim sz As Size = Size.Empty
       sz = New Size(10, 10)

كائن الرسم Graphics

لرسم اى شئ لابد من وجود كائن الرسم فهو يحتوى على جميع الطرق للازمة للرسم وتعبئة الاشكال ..الخ ويتم انشاءه من الفئة Graphic ولكن لا يمكن انشاءه مباشرة باستخدام الكلمة المحجوزه new ولكن يوجد العديد من الطرق للحصول على كائن الرسم منها

استخدام الحدث Paint للفورم

حيث يمكن الحصول عليه من الخاصية Graphics لـPaintEventArgs فى حدث رسم الفورم

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
       Dim g As Graphics = e.Graphics
   End Sub

اعادة قيادة الطريقةOnPaint للفورم

ايضا يتم الحصول عليه من الوسيط PaintEventArgs كما فى الحدث Paint

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
       Dim g As Graphics = e.Graphics
   End Sub

طرق اخرى لانشاء كائن الرسم

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

والتى تعود بكائن رسم CreateGraphics تحتوى على الطريقةFormالفئة

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim g As Graphics = Me.CreateGraphics
       g.Dispose()
   End Sub

End Sub

هذه الطريقة موجوده فى معظم الادواتCreateGraphics

dispose()تذكر استدعاء الطريقة لانشاء كائن الرسم CreateGraphicsعند استخدام الطريقة لتحرير ه

كما يمكن انشاء كائن الرسم من الطرق FromImage, FromHwnd, and FromHdc وهى طرق مشتركة للفئة Graphics

Dim bmb As Bitmap = New Bitmap(600, 400, System.Drawing.Imaging.PixelFormat.Format32bppPArgb)
       Dim g As Graphics = Graphics.FromImage(bmb)
       Dim g1 As Graphics = Graphics.FromHwnd(Me.Handle)

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

رسم الاشكال:

رسم الخطوط :

ويتم ذلك باستخدام الطريقة DrawLine وهى تقوم برسم خط بين نقطتين وهذه الطريقة تم اعادة تعريفها overloads اربع مرات المعامل الاول لهذه الطريقة هو كائن القلم pen وسنتحددث عليه لاحقا ويمكن ان ياخذ معاملين اخرين من الكائن poit او pointf او يمكنك تمرير اربع قيم من النوع integer او النوع real تمثل الاحداثيات لنقطة البداية والنهاية

DrawLine(Pen, Point, Point)
DrawLine(Pen, PointF, PointF)
DrawLine(Pen, int, int, int, int)
DrawLine(Pen, float, float, float, float)

الكود التالى يرسم خطان على الفورم

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
       'انشاء كائنان  قلم بالوان مختلفة وعرض مختلف
       Dim redPen As Pen = New Pen(Color.Red, 1)
       Dim bluePen As Pen = New Pen(Color.Blue, 2)
       'رسم خط بتمرير الاحداثيات
       e.Graphics.DrawLine(redPen, 10, 10, 200, 10)
       'رسم خط بتمرير كائن نقطة
       Dim pt1 As Point = New Point(10, 10)
       Dim pt2 As Point = New Point(10, 200)
       e.Graphics.DrawLine(bluePen, pt1, pt2)

   End Sub

فى بعض الاحيان تحتاج الى رسم خطوط متصله فلا داعى لاستخدام الطريقة DrawLineعدة مرات لعمل ذلك الطريقة DrawLines توفر عليك العناء وهذه الطريقة تاخذ معاملين الاول هو القلم الذى سترسم به والثانى مصفوفة من point,pointf

الكود التالى يرسم مثلث وذلك برسم عدة خطوط متصله

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
       Dim redPen As Pen = New Pen(Color.Red, 5)
       Dim ptArray As PointF() = {New PointF(20.0F, 20F), New PointF(20.0F, 200.0F), New PointF(200.0F, 200.0F), New PointF(20.0F, 20.0F)}
       e.Graphics.DrawLines(redPen, ptArray)
   End Sub

رسم المستطيل:

الطريقة DrawRectangle هى المسؤلة عن رسم المستطيل وكل ما عليك هو اعطائها احداثيات بداية الرسم واالعرض والارتفاع ايضا هذه الطريقة تم اعادة تعريفها وهى تاخذ المعاملات فى الصيغ التالية:

DrawRectangle(Pen, Rectangle)
DrawRectangle(Pen, int, int, int, int)
DrawRectangle(Pen, float, float, float, float)

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
       Dim redPen As Pen = New Pen(Color.Red, 5)
       Dim rect As Rectangle = New Rectangle(10, 10, 100, 100)
       e.Graphics.DrawRectangle(redPen, rect)
       e.Graphics.DrawRectangle(redPen, 20, 20, 80, 80)
   End Sub

كما توجد الطريقة DrawRectangles والتى تستخدم لرسم سلسلة من المستطيلات فهى تاخذ مصفوفة من المستطيلات

رسم الشكل البيضاوى:

ويتم ذلك بالطريقة DrawEllipse فلرسم شكل بيضاوى ما عليك الا استدعاء هذه الطريقة وتمرير مستطيل الذى سيتم الرسم فيه ايضا هذه الطريقة تم اعادة تعريفها اربع مرات وهى تاخذ معاملات بالشكل التالى

DrawEllipse(Pen, Rectangle)	
DrawEllipse(Pen, RectangleF)
DrawEllipse(Pen, int, int, int, int)
DrawEllipse(Pen, float, float, float, float

الكود التالى يقوم برسم مستطيلين

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
       Dim redPen As Pen = New Pen(Color.Red, 5)
       Dim rect As Rectangle = New Rectangle(10, 10, 250, 100)
       e.Graphics.DrawEllipse(redPen, rect)
       e.Graphics.DrawEllipse(redPen, 20, 20, 150, 80)
   End Sub

رسم النصوص:

ويتم ذلك باستخدام الطريقة DrawString وهذه الطريقة تم اعادة تعريفها باشكال عدة

اقصاها تاخذ هذه المعاملات text, font, brush, starting location, and string format.

وابسطها ياخذ هذه المعاملات string, Font, Brush, PointF

DrawString(string, Font, Brush, RectangleF)
DrawString(string, Font, Brush, PointF, StringFormat)
DrawString(string, Font, Brush, RectangleF, StringFormat)
DrawString(string, Font, Brush, float, float)
DrawString(string, Font, Brush, float, float, StringFormat)

StringFormat ياخذ كائن من الفئة StringFormatالمعامل

التى منهها تستطيع تحديد تنسيق النص, الخاصية FormatFlags تاخذ احد قيم المرقم StringFormatFlags القيمة StringFormatFlags.DirectionVertical تمكنك من الكتابة عموديا

الكود التالى يقوم برسم نص افقيا وعموديا

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
       Dim redBrush As SolidBrush = New SolidBrush(Color.Red)
       Dim rect As RectangleF = New RectangleF(90.0F, 80.0F, 250.0F, 100.0F)
       Dim pt As Point = New Point(20, 20)
       Dim str As String = "Hello ArabTeam"
       Dim font As Font = New Font("verdana", 14)
       Dim format As StringFormat = New StringFormat
       format.FormatFlags = StringFormatFlags.DirectionVertical
       e.Graphics.DrawString(str, font, redBrush, 100, 100, format)
       e.Graphics.DrawString("solo.net", New Font("Times New Roman", 12), New SolidBrush(Color.Blue), rect)

   End Sub

مثال تطبيقى:

سنقوم الان بعمل مثال لبرنامج يوضح استخدام الدوال السابقة فى الرسم

البرنامج عبارة عن فورم وبه زر واداة اختيارCheckbox وسنرسم فيه مبدئيا خطا افقيا وخطا عموديا يمثلان المجور السينى والصادى وبعدها يقوم المستخدم برسم خطوط على الفورم بواسطة النقر على الفورم بزر الفأرة الايسرنقطة البداية ستكون هى نقطة تقاطع المحور السينى مع المحور الصادى نهاية الخط سيتم تحديدها بشكل دائرى(الافتراضى) او بشكل مربع صغير وذلك فى حالة جعل قيمة CHECKBOX.CHECKED=TRUE

وفى كل مرة يتم فيها النقر على نقطه جديده على الفورم يتم توصيلها بسابقتها بخط

والان لنرى الكود

فى البداية نحتاج لتعريف متغيرين على مستوى النموذج واعطائهما قيم هى تمثل نقطة البداية والنهاية

كما قلنا نقطة البداية هى نقطة تقاطع المحور السينى مع الصادى

Private startPoint As Point = New Point(50, 217)
   Private endPoint As Point = New Point(50, 217)

الخطوة الثانية هى رسم المحور السينى والصادى مع ترقيمهن ونستخدم فى ذلك طريقة رسم النصوص

هذا الكود نقوم بكتابته فى حدث رسم النموذج(لماذا؟)

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
       Dim g As Graphics = e.Graphics
       Dim drawFont As Font = New Font("verdana", 10, FontStyle.Bold)
       Dim vertBrush As SolidBrush = New SolidBrush(Color.Black)
       Dim horzBrush As SolidBrush = New SolidBrush(Color.Blue)
       Dim vertPen As Pen = New Pen(Color.Black, 2)
       Dim horzPen As Pen = New Pen(Color.Blue, 2)
       'رسم الخط الافقى والراسى
       g.DrawLine(vertPen, 50, 220, 50, 25)
       g.DrawLine(horzPen, 50, 220, 250, 220)
       'ترقيم الاحداثى السينى
       g.DrawString("0", drawFont, horzBrush, 30, 220)
       g.DrawString("1", drawFont, horzBrush, 50, 220)
       g.DrawString("2", drawFont, horzBrush, 70, 220)
       g.DrawString("3", drawFont, horzBrush, 90, 220)
       g.DrawString("4", drawFont, horzBrush, 110, 220)
       g.DrawString("5", drawFont, horzBrush, 130, 220)
       g.DrawString("6", drawFont, horzBrush, 150, 220)
       g.DrawString("7", drawFont, horzBrush, 170, 220)
       g.DrawString("8", drawFont, horzBrush, 190, 220)
       g.DrawString("9", drawFont, horzBrush, 210, 220)
       g.DrawString("10", drawFont, horzBrush, 230, 220)
       'رسم النصوص افقيا
       Dim vertStrFormat As StringFormat = New StringFormat
       vertStrFormat.FormatFlags = StringFormatFlags.DirectionVertical
       g.DrawString("-", drawFont, horzBrush, 50, 212, vertStrFormat)
       g.DrawString("-", drawFont, horzBrush, 70, 212, vertStrFormat)
       g.DrawString("-", drawFont, horzBrush, 90, 212, vertStrFormat)
       g.DrawString("-", drawFont, horzBrush, 110, 212, vertStrFormat)
       g.DrawString("-", drawFont, horzBrush, 130, 212, vertStrFormat)
       g.DrawString("-", drawFont, horzBrush, 150, 212, vertStrFormat)
       g.DrawString("-", drawFont, horzBrush, 170, 212, vertStrFormat)
       g.DrawString("-", drawFont, horzBrush, 190, 212, vertStrFormat)
       g.DrawString("-", drawFont, horzBrush, 210, 212, vertStrFormat)
       g.DrawString("-", drawFont, horzBrush, 230, 212, vertStrFormat)
       'رسم الاحداثى الصادى
       g.DrawString("100-", drawFont, vertBrush, 20, 20)
       g.DrawString("90 -", drawFont, vertBrush, 25, 40)
       g.DrawString("80 -", drawFont, vertBrush, 25, 60)
       g.DrawString("70 -", drawFont, vertBrush, 25, 80)
       g.DrawString("60 -", drawFont, vertBrush, 25, 100)
       g.DrawString("50 -", drawFont, vertBrush, 25, 120)
       g.DrawString("40 -", drawFont, vertBrush, 25, 140)
       g.DrawString("30 -", drawFont, vertBrush, 25, 160)
       g.DrawString("20 -", drawFont, vertBrush, 25, 180)
       g.DrawString("10 -", drawFont, vertBrush, 25, 200)
       'dispose the object
       drawFont.Dispose()
       vertBrush.Dispose()
       horzBrush.Dispose()
       vertPen.Dispose()
       horzPen.Dispose()

   End Sub

يمكن استبدال الكود الذى يقوم برسم – على المحور الافقى بالداله drawline او الدالة drawlines

قلنا ان عملية رسم الخطوط ستتم بنقر زر الماوس الايسر من قبل المستخدم اذا انسب حدث لكتابة كود الرسم هذا هو الحدث MouseDown فى اول مرة ينقر فيها المستخدم تعتبر نقطة البداية هى نقطة تقاطع المحور السينى والصادى واول مكان ينقر فيه المستخدم هو نقطة النهاية بعد ذلك نعتبر ان نقطة النهاية هى نقطة البداية لاستكمال رسم الخط ونختبر ايضا ان كانت قيمة check للcheckbox فاذا كانت true نرسم مربع صغير فى نهاية الخط يمثل نقطة التوصيل بين الخطوط واذا كانت false نرسم شكل بيضاوى

ويمكن الحصول على القيم(X,Y) من الخاصيتين X,Y لل MouseEventArgs والتى تمثل موضع نقر المستخدم

Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
       'اختبار ان الزر المظغوط هو الزر الايسر
       If e.Button = MouseButtons.Left Then
           'انشاء كائن الرسم
           Dim g As Graphics = Me.CreateGraphics
           ' انشاء القلم الذى سنرسم به الخطوط
           Dim linePen As Pen = New Pen(Color.Green, 1)
           'انشاء القلم الذى سنرسم به علامة توصيل الخطوط
           Dim ellipsePen As Pen = New Pen(Color.Red, 1)
           'جعل نقطة البداية هى نقطة النهاية السابقة
           Me.startPoint = Me.endPoint
           'نقطة البداية تساوى الموقع الذى نقر فيه بالماوس
           Me.endPoint = New Point(e.X, e.Y)
           'رسم الخط
           g.DrawLine(linePen, Me.startPoint, Me.endPoint)
           'رسم شكل يمثل علامة توصيل الخطوط
           If Me.CheckBox1.Checked Then
               g.DrawRectangle(ellipsePen, e.X - 2, e.Y - 2, 4, 4)
           Else
               g.DrawEllipse(ellipsePen, e.X - 2, e.Y - 2, 4, 4)
           End If
           'dispose the object
           g.Dispose()
           linePen.Dispose()
           ellipsePen.Dispose()

       End If
   End Sub

واخير بقى لدينا الكود الذى سيمسح الخطوط التى رسمناها وكذلك اعادة نقطة البداية والنهاية الى نقطة تقاطع المحورين

ولعمل ذلك نقوم باعادة رسم النموذج وذلك باستدعاء الطريقة Invalidate او Refresh

وهذا الكود

         Me.startPoint.X = 50
       Me.endPoint.X = 50
       Me.startPoint.Y = 217
       Me.endPoint.Y = 217
       Me.Invalidate(Me.ClientRectangle)
'me.Refresh                  

وللموضوع بقية......... :rolleyes:

Line Chart Demo.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله خيرا , بس أنا مش ملاحق علي دروسك , ربنا يوفقك ,

صحيح قوللي عندك نسخه كامله من الكتاب ده :

Apress - GDI+ Programing In C# and VB.NET

لأن كل النسخ الموجوده عباره عن الفصل الخامس فقط :(

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
جزاك الله خيرا , بس أنا مش ملاحق علي دروسك , ربنا يوفقك ,

صحيح قوللي عندك نسخه كامله من الكتاب ده :

Apress - GDI+ Programing In C# and VB.NET

لأن كل النسخ الموجوده عباره عن الفصل الخامس فقط 

واياك كل الخير وللاسف انا ايضا عندى الفصل الخامس بس وجارى البحث عن البقية.... B)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله الف خير موضوع فعلا اكثر من رائع

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

واياك كل الخير اخى كفاح

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

يا سلام وين هالموضوع من زمان ..أنا هوسي شيء اسمه برمجة صور

شكرا لك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

هل طار الموضوع بهذه السهولة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
هل طار الموضوع بهذه السهولة

لا يا اخ اياس الموضوع لم يطير وانا قاعد اعد البقية

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

موضوع رائع اخ solo انا عارف ان الدوت نت امكانياتها رائعة في ال GDI بس انت قويت الاحساس ده :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

نحن بانتظار إبداعك Solo ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

سنكمل هنا ما توقفنا عنه فى المرة السابقة وكنا نتحدث عن الفئة Graphics

رسم الاقواس:

توجد الطريقة DrawArc لرسم الاقواس والقوس يعتبر جزؤ من الشكل البيضاوى ويتم رسم القوس داخل مستطيل مع تحديد زاوية البداية بالدرجات وكذلك زاوية الدوران اذا لرسم قوس نحتاج لتحديد مستطيل حيث بتقسم هذا المستطيل افتراضيا افقيا وعموديا نحصل على الاحدلثيات الديكارتية المتمثله فى المحور السينى والصادى وستكون نقطة تقاطع المحورين هى المركز وللعلم الربع الاول يبداء من الزاوية(0الى 90) والثانى(90الى 180)والثالث (180الى 270) ةالرابع(270 الى 360) فى اتجاه عقارب الساعة

مثلا لرسم دائره تكون زاوية البداية اى زاوية وزاوية الدوران 360 درجة

وهذه الطريقة تم اعادة تعريفها

DrawArc(Pen, Rectangle, float, float)
DrawArc(Pen, RectangleF, float, float)
DrawArc(Pen, int, int, int, int, int, int)
DrawArc(Pen, float, float, float, float, float, float)

يوجد مثال فى المرفقات

رسم المنحنيات:

DrawCurve تستخدم هذه الطريقة لرسم المنحنيات والمنحنى هو عبارة عن مجموعة من النقاط موصولة ببعض مع مع وجود انحناء بين كل نقطه واخرى

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

DrawCurve(Pen, Point[])
DrawCurve(Pen, PointF[])
DrawCurve(Pen, Point[], float)
DrawCurve(Pen, PointF[], float)
DrawCurve(Pen, PointF[], int, int)
DrawCurve(Pen, Point[], int, int, float)
DrawCurve(Pen, PointF[], int, int, float)

فى الاشكال الثلاثة الاخيرة القيمتين من النوع عدد صحيح تمثل مقدار الازاحة وعدد المقاطع على التوالى

مقدار الازاحه هو عدد العناصر التى سيتم تجاهلها فى مصفوفة النقاط ويجب ان يكون على الاقل واحد العنصر الموجود بعد اخر عنصر تم تجاهله يكون هو نقطة البداية

مثال فى المرفقات

توجد ايضا الطريقةDrawClosedCurve وهى تقوم برسم منحنى مغلق اى ان نقطة البداية هى نفسها نقطة النهاية وقد تم اعادة تعريفها بالاشكال التالية

DrawClosedCurve(Pen, Point[])
DrawClosedCurve(Pen, PointF[])
DrawClosedCurve(Pen, Point[], float, FillMode)
DrawClosedCurve(Pen, PointF[], float, FillMode)

المعامل الرابع فى الشكلين الاخيرين ياخذ احدى قيم المرقم FillMode ووظيفته تحديد مسار الاغلاق للمنحى من الداخل

رسم منحنى Bezier :

هو منحنى يتم تحديده باربع نقاط نقطتين تمثلان البداية والنهاية ونقطتين للتحكم فى درجة الانحناء وقد اخذ الاسم Bezier من اسم مطوره

يمكن رسم هذا النوع من المنحنيات باستخدام الطريقة DrawBezier و DrawBeziers الثانية تقوم برسم سلسلة من منحنيات بيزير

مثال فى المرفقات

رسم المضلع:

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

(Pen, Point[]) DrawPolygon
DrawPolygon(Pen, PointF[])

مثال فى المرفقات

رسم الايقونة

توجد الطريقتين DrawIcon و DrawIconUnstretched لرسم الايقونات الاولى تقوم برسم الصورة مع تغيير حجمها ليملاء مساحة كائن الرسم اما الثانية فترسم ايقونة من دون تغيير فى حجمها،هذه الطريقة تاخذ معاملين الاول كائن من النوع ايقونهIcon Object ويتم انشائه من الفئة Icon ومن اهم طرق هذه الفئة هى

وهى لحفظ الايقونة Save

لتحويل كائن الايقون الى كائن من النوع ToBitmap

bitmap

والمعامل الثانى للطريقة DrawIcon كائن مستطيل او قيمتين من النوع integer تمثل الزاوية العليا اليسري للمستطيل

مثال فى المرفقات

رسم مسار رسومات:

مسار الرسومات هو مجموعة من اشكال الرسم معا ويمكن الحصول على مسار الرسومات من الفئة GraphicsPath وهى تحتوى على الطرق AddXXX حيث XXX هى الشكل المراد اضافته لكائن مسار الرسم مثلا AddLine, AddRectangle, AddEllipse ....الخ

وهذه الفئة تقع فى فضاؤ الاسماء System.Drawing.Drawing2D فتذكر اسيراده عند التعامل مع كائن مسار الرسم

الان نعود للفئة Graphics وهى محور حديثنا حيث تحتوى على الطريقة DrawPath وهى تاخذ معاملين الاول قلم الرسم والثانى كائن مسار رسم

اذا كنت تريد رسم مجموعة من الاشكال فى مساحة رسم واحدة عليك بكائن مسار الرسم

مثال فى المرفقات

رسم الصور:

توجد الطريقتان DrawImage and DrawImageUnscaled لرسم الصور الاولى تملاء مساحة كائن الرسم اما الثانية فلا تغير من ابعاد الصورة وقد تم اعادة تعريفهم باشكال كثيرة المعامل الاول لهذه الطريقة هو كائن من النوع Image ويتم انشاءه من الفئة Image باستدعاء الطريقة FromFile التى تاخذ مسار ملف الصورة كمعامل لها وسنتحدث عن هذه الفئة لاحقا فى هذه السلسله

والمعامل الثانى هو مستطيل يمثل مساحة كائن الرسم

مثال فى المرفقات

اخر طريقة لرسم الاشكال للفئة graphics هى الطريقة DrawPie وهى تستخدم لرسم شريحة

هذه الشريحة تكون كجزء من دائرة (كقطعة البتزا) وهى تستخدم غالبافى الرسوم البيانيّة التي توضّح النسب كشرائح ملوّنة من دائرة

هذه الطريقة تاخذ فى معاملاتها قلم الرسم ومستطيل يمثل مساحة الرسم وزاوية البداية وزاوية الدوران

DrawPie(Pen, Rectangle or RectangleF, startAngle, sweepAngle)

مثال فى المرفقات

,وبهذا نكون قد انتهينا من الدوال الخاصة برسم الاشكال

الطرق المستخدمه فى ملء الاشكال من الداخل

كل ما عليك لتعبئة شكل من الداخل بلون معين هو استخدام الطرق

حيث هو الشكل المراد تعبئته وطبعا الاشكال المغلقة هى فقط التى يمكن تعبتها من الداخلXXX FillXXX

وهذه الاشكال هى

ClosedCurve, Ellipse, Path, Polygon, Rectangle, Rectangles, Region

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

Region

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

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

الكود التالى يقوم بتعبئة الشكل pie

e.Graphics.FillPie(new SolidBrush(Color.Red),0.0F, 0.0F, 100, 60, 0.0F,90.0F);

والكود التالى يقوم بتعبئة منطقه باللون الاخضر

Dim rect As Rectangle = new Rectangle(20, 20, 150, 100)
Dim rgn As Region = new Region(rect)
e.Graphics.FillRegion(new SolidBrush(Color.Green), rgn)

مثال فى المرفقات

خصائص الفئة Graphics

من اهم الخصائص:

DpiX و DpiY:

تمثّل هاتان الخاصيتان عدد النقاط في كلّ انش Dots per inch (Dpi) أفقيّا (على المحور X) ورأسيّا (على المحور Y).

:وهى تحدد وحدة قياس الصفحة وهى تاخذ احد قيم المرقمPageUnit

وهى فى الوضع الافتراضى تكون بالبكسلGraphicsUnit

وللموضوع بقية باذن الله :rolleyes:

GDI+GraphicObjectDemo.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا لك أخي الكريم ..ولكن ممكن إذا كان في مجال أن نناقش الأمرين التاليين:

- نحن حتى الآن رسمنا الأشكال و حددنا أبعادها من داخل اللغة..ولكن كيف لهذه الأشكال المعقدة ان يقوم المستخدم برسمها بواسطة

الMouse .

- هذه الرسومات غير ثابتة على الصورة ..و كأن الخاصية AutoRedraw=False إذا فهمتني ..يعني كيف نجعل الرسوم ثانيتة

لا تنمحي عند تصغير النافذة مثلا..

وشكرا لك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اكتب كود الرسم في الحدث Paint B)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
شكرا لك أخي الكريم ..ولكن ممكن إذا كان في مجال أن نناقش الأمرين التاليين:

- نحن حتى الآن رسمنا الأشكال و حددنا أبعادها من داخل اللغة..ولكن كيف لهذه الأشكال المعقدة ان يقوم المستخدم برسمها بواسطة

الMouse .

- هذه الرسومات غير ثابتة على الصورة ..و كأن الخاصية AutoRedraw=False إذا فهمتني ..يعني كيف نجعل الرسوم ثانيتة

لا تنمحي عند تصغير النافذة مثلا..

وشكرا لك

بالنسبة لسؤالك الاول استخدم احداث الظغط على الماوس وقد وضعت مثال يتم فيه رسم خطوط عن طريق الماوس وساقوم بعمل مثال اخر لرسم باقى الاشكال عن طريق الماوس

والسؤال الثانى اجابك عليه الاخ حزووم فعند تكبير او تصغير النموذج يتم اطلاق حدث رسم النموذج فاكتب كودك هناك

تم تعديل بواسطه SOLO.NET
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا لك أخي الكريم حزوم ..و Solo

ولكن الحقيقة يعني معقولة لو ان في برنامج رسم كامل سنضع كل الاكواد في حدث الPaint

:lol:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الفرشBrushes

توجد الفرش فى اطار العمل فى فضائى الاسماءSystem.Drawing و

System.Drawing.Drawing2D

الاول يحتوى على الفرش التاليةBrush, SolidBrush, TextureBrush, Brushes

والثانى توجد به الفرش التاليةHatchBrush and GradientBrush

فلا تنسى استيراد فضاء الاسماء الللازم للتعامل مع كل فرشاة

الفئة Brush

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

الفئةBrushes

هذه الفئة لا يمكن وراثتها ولا يمكن انشاء كائن منها فهى تحتوى على اعضاء مشتركة فقط وهذه الاعضاء كلها خصائص وكل خاصية تمثل لون محدد من الالوان

المعروفة

Dim rect AS Rectangle = new Rectangle(150, 80, 200, 140)
g.FillRectangle(Brushes.Black, rect)

SolidBrush الفئة

تستخدم هذه الفئة لانشاء فرشاه تقوم بملء مساحة الرسم بلون واحد خالص ويتم انشاء كائن من هذه الفرشاة بالكلمة المحجوزة

وتمرير لون فى منشئ الفئة وهو المعامل الوحيد لهاNew

الكود التالى ينشئ ثلاث فرش بلون الاحمر والاخضر والازرق على التوالى

Dim redBrush AS SolidBrush = new SolidBrush(Color.Red)
Dim greenBrush AS SolidBrush = new SolidBrush(Color.Green)
Dim blueBrush AS SolidBrush = new SolidBrush(Color.Blue)

وهى تعود بلون الفرشاةColor وهذه الفئة لها خاصية واحدة هى

HatchBrushالفئة

وهى عبارة عن فرشاه تقوم بملء مساحة الرسم بلون معين مع نقش ويتم انشاء بالشكل التالىnew كائن من هذه الفئة بالكلمة المحجوزة

new HatchBrush(HatchStyle, Color, Color)

المعامل الاول تقوم فيه بتحديد نمط النقش وهو ياخذ احدى قيم المرقم ويوجد به 50 نقش جاهز للاستخدامHatchStyle

المعامل الثانى هو لون خطوط النقش والثالث لون الخلفية

يوجد مثال فى المرفقات يعرض جميع النقوش المتوفرة

TextureBrushالفئة

تمكنك هذه الفئة من استخدام صورة كفرشاة وملء مساحة رسم بهذه الصورة ويتم انشاء كائن من هذه الفئة

وتمرير كائن صورة فى منشئ الفئة

وهى تاخذ قيم من مرقم بنفس الاسم WrapMode ومن اهم خصائص هذه الفئة الخاصية

هذه الخاصية تحدد كيف يغطى كائن الفرشاة منطقة الرسم مثلا القيمة

وهى الافتراضية تقوم بتبليط منطقة الرسم بالصورة وذلك بتكرار الصورة حتى تملاء مساحة الرسمTile

يوجد مثال مرفق يوضح استخدام هذه الفرشاة بطرق مختلفة

LinearGradientBrushالفئة

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

الكود التالى يقوم بانشاء فرشاة للتدريج باللونين الاحمر والخضر

Dim rect1 AS Rectangle = new Rectangle(20, 20, 50, 50)
Dim lgBrush AS LinearGradientBrush = new LinearGradientBrush(rect1, Color.Red, Color.Green, LinearGradientMode.Horizontal)

المعامل الاخير هو عبارة عن مرقم قيمه تحدد اتحاه التدريج

قيم المرقم هى

من الزاوية العليا اليمنى الى الزاوية تحدد اتجاه التدريجBackwardDiagonal

اليسرى السفلى

عكس سابقتهاForwardDiagonal

التدريج يكون افقيا من اليمين لليسارHorizontal

التدريج افقيا من الاعلى للاسفلVertical

خصائص الفئة

وهى تمثل كائن من من فئة بنفس الاسم هذا الكائن يقوم بتحديد موقع Blend

التدريج

وهى تاخذ قيم منطقية فاذا كانت نعم فتكون فعالهGammaCorrection

هى عملية التحكم فى اضاءة الصور حيث تقوم بالتعديل فى قيم الالوان Gamma Correctionوالمقصود بـ

الاساسيه لتصحيحها

وهى تاخذ قيم من مرقم بنفس الاسم وهذه القيم هى:WrapMode

لا يتم التبليطClamp

تبليط مساحة الرسم بالخام او التدريج وذلك بتكرارهTile

عكس اتجاه الخام او التدريج افقيا وبعد ذلك يتم التبليطTileFlipX

عكس اتجاه الخام(الصورة) او التدريج افقيا وبعدها عموديا ومن ثمTileFlipXY

التبليط

عكس الاتجاه عموديا وبعد ذلك يتم التبليطTileFlipY

التحويلات باستخدام الفرش:

عدة طرق للتحويلات المختلفةTextureBrush, LinearGradientBrushلكل من الفئتين

هذه الطرق هى:

وتقوم بتنفيذ التحويل باستخدام مصفوفة التحويلاتMultiplyTransform

تقوم بتدوير الفرشاة بزاوية معينةRotateTransform

تغير من حجم الفرشاه ScaleTransform

تقوم بتحويل الفرشاة من موضعهاTranslateTransform

مثال مرفق يوضح التحويلات

GDI+ObjectDemo.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
ولكن الحقيقة يعني معقولة لو ان في برنامج رسم كامل سنضع كل الاكواد في حدث الPaint

بالتاكيد لا وهناك حلول عديده منها انشاء Buffer تقوم بالرسم فيه وبعدين تعرض النتيجة على الشاشه

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

وساحاول اعمل برنامج رسم بسيط يوضح الفكرة(يعنى برنامج يرسم شوية خطوط ومربعات) :rolleyes:

تم تعديل بواسطه SOLO.NET
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

يوجد مثال فى المرفقات يوضح كيفية الرسم باستخدام الماوس وكذلك الرسم على صورة (كمسطح رسم)

ارجو ان يجيب على تساؤلاتك يا اخ اياس واى استفسار انا حاضر :rolleyes:

Paint.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

يسلموا Solo الحقيقة عمل رائع ..

هو انا عملت الرسم على Picture بس يبدو إني خبصت شوي ... ألف شكر

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
يسلموا Solo الحقيقة عمل رائع ..

هو انا عملت الرسم على Picture بس يبدو إني خبصت شوي ... ألف شكر

العفو اخى اياس وشكرا على التواصل

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اخي الكريم Solo

الحقيقة انا حاولت أن أعمل وحدي مسطح صورة Bitmap فارغة Nothing ولكن لم تنجح معي الطريقة..يعني انت كيف أكسيت الPicturebox هذه الBitmap ورسم عليها ..وشكرالك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
اخي الكريم Solo

الحقيقة انا حاولت أن أعمل وحدي مسطح صورة Bitmap فارغة Nothing ولكن لم تنجح معي الطريقة..يعني انت كيف أكسيت الPicturebox هذه الBitmap ورسم عليها ..وشكرالك

انا لم استخدم الPicturebox ويبدو انك لم تدرس الكود جيدا

راجع دراسة الكود وانا كتبت عليه ملاحظات

وبعدها انا حاضر لاى استفسار :rolleyes:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

لكن المشكلة انا أريد الرسم على Picture box لأن الرسم على النافذة لا يحتاج إنشاء سطح :lol:

شكرا لك ..يا رجل صار معارك في قسم ال++C من اجل هذا الموضوع

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم..

أخي الكريم Solo

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

سلاحظت شيء مهم في طريقتك وهو e.X و e.Y ولم أكن أعرف أنه يطبق على الصور ..و لكن قمت بتطبيق طريقة مشابهة على

الصورة و ليس على الForm ووقعت بخطأ لا حظت انك أنت أيضا وقعت فيه ..وهو رسم المربع لاحظ الكود التالي:

Dim REC As New Rectangle(Sx, sy, Ex - Sx, Ey - sy)

باعتبار SyوSxو ..هي نقاط البداية و النهاية و لكن المشكلة أن المربعلا يأخذ النقاط النهائية و إنما يأخذ الطول و العرض لذلك

سيعتبر أول نقطة هي رأسه العلوي الأيسر و لذلك لن يقبل برسم المربع نحو الأعلى أو رسم مربع خلف النقطة الأولى..

بالنسبة لخطأ رسم المربع خلف النص فانا بعتقد أنه يحب أخذ Sx-Ex بالقيمة المطلقة و بذلك حتى لوكان المستخدم رجع بالمؤشر

للوراء لن يؤثر ذلك على عرض المربع..◘

هل من الممكن التغلب على هذه المشكلة.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا لك على هذه الملاحظة وسوف اراجعها

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .