مشاهدة النسخة كاملة : [VB.Net] دروس Advanced VisualBasic 2005/2008
SmoothCriminal
08-01-2008, 10:03 AM
بسم الله الرحمن الرحيم
Advanced VisualBasic 2005/2008
الموضوع عبارة عن شرح لعدد من الموضوعات المنفصلة ويتم تجزئتها إلى نقاط وعمل فهرس منفصل لكل مجموعة ويتم إضافتها تباعا وللذهاب إلى أى فهرس إضغط على العنوان باللون الأحمر
المقدمة (http://absba.org/vb/showpost.php?p=5274100&postcount=2)
Graphics Device Interface
+GDI
أولا:الرسم Drawing
1-الخط المستقيم (http://www.absba.org/vb/showpost.php?p=5277829&postcount=12)
2-الشكل المستطيل (http://absba.org/vb/showpost.php?p=5278351&postcount=13)
3-المنحنيات والأقواس (http://absba.org/vb/showpost.php?p=5278551&postcount=14)
4-متوازى المستطيلات المفرغ (http://absba.org/vb/showpost.php?p=5281450&postcount=19)
5-الشكل الاسطوانى (http://www.absba.org/vb/showpost.php?p=5284113&postcount=20)
6-الفرشاة الصلبة SolidBrush (http://absba.org/vb/showpost.php?p=5291101&postcount=22)
7-HatchStyle (http://absba.org/vb/showpost.php?p=5305947&postcount=31)
8- LinearGradientBrush (http://absba.org/vb/showpost.php?p=5319804&postcount=35)
9-PathGradientBrush (http://absba.org/vb/showpost.php?p=5322443&postcount=37)
10-TextureBrush (http://absba.org/vb/showpost.php?p=5324593&postcount=38)
11-التطبيق الأول (http://absba.org/vb/showthread.php?t=569760&page=5)Taher Buttons Model (http://absba.org/vb/showthread.php?t=569760&page=5)
12-التطبيق الثانى التحكم فى الألوان ومعدلات الشفافية الخاصة بالزر (http://absba.org/vb/showpost.php?p=5347228&postcount=57)
13-الرسم باستخدام الماوس (http://absba.org/vb/showpost.php?p=5383437&postcount=75)
ثانيا:التعامل مع الصور
1-البداية فى التعامل مع الصور (http://absba.org/vb/showpost.php?p=5385456&postcount=76)
SmoothCriminal
08-01-2008, 10:05 AM
بسم الله الرحمن الرحيم
المقدمة
يتكون Dotnet Framework من مجموعة كبيرة من Classes وهذة Classes موجودة بصورة مجمعة داخل ما يسمى Namespace و تم تفسيم هذة Namespaces إلى مجموعات طبقا لوظيفتها كالتالى
انواع Classes فى Dotnet
1- Windows FormsWindows Controls Classes
وتتضمن مكونات مثل الفورم والأزرار ومربعات النصوص وبعبارة أخرى التركيبات والتصميمات
2- (Drawing Classes (GDI+ Classes
وتتضمن أدوات الرسم والطباعة وخصائص الخطوط ...الخ
3- DataClasses
والمقصود بها ADO.NET Classesوتتضمن SQL DataAcces Classes و Data Modeling......الخ
4- System Classes
وتتضمن الاتى
System.Collection و System.Diagnostics و System.IO و System.Security و System.Globalization و System.Serializationو Reflection System. و System. COM Compatibility
5- XML Classes
ومنها XSLT و Serilization و XPath
كيفية تحديد الأوضاع الهندسية للكائنات
يتم حساب الأبعاد فى الفيجوال بيسيك طبقا للاتى
-يتم البداء من أعلى نقطة فى الحافة اليسرى هى النقطة 0 ويكون لدينا 2 متجة
-المتجة X ويكون إتجاهة من النقطة 0 متجها إلى اليسار
-المتجة Y ويكون إتجاهة من النقطة 0 متجها إلى الأسفل
-وحدة القياس هى البيكسل
-يتم تعريف نقطة محددة بدلالة كلا من X,Y على الترتيب ويتم كتابتها فى صورة زوج مرتب( X, Y ) ومعنى ذلك أنة إذا كان هناك أحد الأشياء يتواجد على بعد 30 من المحور X و 60 من المحور Y فإنة يكون فى الموضع (60, 30)
http://dawn2.absba.org/teamwork2/569760/1.jpg
ماذا لو كان هناك كائن موجود داخل الإطار مثل التالى؟
http://dawn2.absba.org/teamwork2/569760/2.jpg
إذا كان هناك كائن موجود داخل الإطار فإن إحداثياتة تكون بدلالة كلا من
-وضعة داخل الإطار العام
-وأبعادة من طول وعرض وكذلك الشكل دائرى او مستطيل او مربع ...الخ
-يصبح لة أبعادة الداخلية الخاصة بة بدون النظر إلى أبعاد الإطار العام
مثال
لدينا فورم داخل شاشة العرض ونريد أن نقوم بوصف موضعة وصفا دقيقا
http://dawn2.absba.org/teamwork2/569760/3.jpg
-البعد بين الحافة اليسرى للفورم والحافة اليسرى لشاشة العرض=Form1.Left أو Form1.Location.X
-البعد بين الحافة اليمنى للفورم والحافة اليسرى لشاشة العرض=Form1.Right
-البعد بين الحافة العليا للفورم والحافة العليا لشاشة العرض=Form1.Top أو Form1.Location.Y
-البعد بين الحافة السفلى للفورم والحافةالعليا لشاشة العرض=Form1.Bottom
أما أبعاد هذا الفورم فهى
العرض = Form1.Size.Width أو Form1.Width
الإرتفاع= Form1.Size.High أو Form1.High
ماذا لو كان هناك أحد الكائنات بداخل هذا الفورم
http://dawn2.absba.org/teamwork2/569760/4.jpg
مثل هذا
http://img267.imageshack.us/img267/9986/77867363rd7.jpg
سيصبح لهذا الزر الموجود بداخل الفورم إحداثيات جديدة بدلالة الفورم الذى هو بداخلة
ولكن ماذا عن هذا الزر؟
إن هذا الزر لة أيضا إحداثيات وهى تتمثل فى الشكل بمعنى أنة قد يكون مربع أو مستطيل أو مثلث أو أى شكل هندسى ,كما أنة يمكنك أيضا إضافة بعد اللمسات الجمالية علية فقد يكون مسطحا أو بارزا أو لة حواف بشكل شبة دائرى وقد يكون لة لون أو حتى شفاف أو يأخذ سمة معينة كأن يكون زر لة سمة Style XP أو Style Vista
كيف يتم تكوين الشكل والسمات المذكورة؟
يتم رسمها:eek:
كيف يتم رسمها؟
يمكنكم متابعة الموضوع لمعرفة ذلك
تم رفع صور الشرح علي سيرفر المنتدي بواسطة المشرف العام Master x ..
SmoothCriminal
08-01-2008, 10:08 AM
الموضوع سهل وبسيط
SmoothCriminal
08-01-2008, 10:24 AM
Advanced VisualBasic 2005/2008
SmoothCriminal
08-01-2008, 01:23 PM
Advanced VisualBasic 2005/2008
almstshar
08-01-2008, 01:33 PM
مبدع مبدع
بس موضوع يبيلة جلسة
جزاك الله الف خيير
فلورندا
08-01-2008, 02:42 PM
شكرا يا د.طاهر على هذا الموضوع الرائع وكنا ننتظر منك هذا الموضوع منذ فترة لأهميتة بارك اللة فيك
The_Patriot
08-01-2008, 03:05 PM
بارك الله فيك أخوي
وتسلم على المجهووود المبذووول
الله يوفقك أخوي
بالفعل معلومات مهمه ما كنا نعرفها !
مشكوووووور
وناطر التكمله
تسلم ويعطيك العافية ...
BumFunkMcs
08-01-2008, 05:34 PM
بارك الله فيك كدة ممتاز ان يكون موضوع واحد مجمع لكل النقاط حتى تكون كل المعلومات متماسكة من دون مانتعب فى البحث عنها فى موضوعات أخرى وأنا بتوقع إن موضوعك هذا بيسوى إنقلاب لأن بدايتة توحى بذلك
BoneCrusher
08-01-2008, 05:53 PM
شىء فريد أن نرى شرحا بهذا المستوى نتمنى أن نبداء بسرعة أنا مش ٌادر انتظر
ربنا يبارك فيك
anascoo
08-01-2008, 06:19 PM
جزاك الله الف خيير
SmoothCriminal
09-01-2008, 02:35 AM
الخط المستقيم
الأشياء التى نستطيع تنفيذها والتعامل معها باستخدام+GDI هى
1- الرسومات ثنائية الأبعاد 2D
2-الخطوط والطباعة وإعدادتها Typography
3-التعامل مع الصور Imaging
وطبقا لإمكانيات GDI+ المذكورة بالأعلى فإن Namespaces المسؤلة عن تنفيذ هذة العمليات هى
1- System.Drawing
وهو شىء أساسى عند البداء فى العمل مع GDI+ وهو هنا الرئيس بالنسبة لباقى Namespaces التى سنتعامل معها فى GDI+ وعندما نبداء العمل فيجب أن نقوم بإضافتة إلى Refrences الموجودة داخل المشروع حيث أنة يقوم بتوفير كل الأدوات الازمة للرسم من خطوط وأقلام رسم وكذلك الألوان والأشكال
2- System.Drawing.Drawing2D
3-System.Drawing.Imaging
4-System.Drawing.Text
5-System.Drawing.Printing
واضح وظيفتها من أسمائها
أول شىء سنتعلمة هنا هو الخط المستقيم
الخط المستقيم لة نقطة بداية ولة نقطة نهاية وحتى نستطيع فهم هذة البداية والنهاية نفترض أن لدينا جسم ما قام بالإنتقال من أحد النقاط ولنفترض أنها النقطة Z1 وهى الموجودة عند (x1,y1) ثم توقف عند النقطة Z2 وهى الموجودة عند (x2,y2) وأنة خلال المسار من z1 حتى وصل إلى z2 قام برسم خط مستقيم وعلى ذلك فإن طول و زاوية ميل المستقيم يتم تحديدهما بالتحكم فى قيمة المتغيرات الأربعة x1 ,x2 , y1 ,y2
http://img215.imageshack.us/img215/272/53866543to5.jpg
ولكى نحدد طول واتجاة هذا المستقيم فإنها تساوى (z1,z2) أو (x1,y1,x2,y2)
لذلك فإنة لرسم مستقيم فإن الكود المستخدم يكون فى صورة مثل هذة
Private Sub MyLine(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) _
Handles MyBase.Paint
Dim MyPen As New Pen(Color.Red, 1)
e.Graphics.DrawLine(MyPen, x1 ,y1, x2 ,y2)
End Sub
أعتقد أن الكود بسيط وواضح ومفهوم جدا
مع مراعاة أن قيمة المتغيرات x1 ,x2 , y1 ,y2 لابد وأن تكون Integer و ملاحظة أنة إذا تساوت القيم الأربعة فى المقدار فمعنى ذلك أن الجسم الذى افترضنا أنة تحرك ليرسم المستقيم لم يتحرك وبالتالى لا يوجد هناك أى خط مستقيم ويمكنكم تجربة ذلك بوضع قيمة 40 مثلا للقيم الأربعة كما أن المستقيم يبداء من نقطة الأصل فى حالة واحدة وهى x1 وy1 تساويان صفر ويمكنكم تجربة مزيد من المتغيرات
هذا هو المثال يمكنكم تحميلة من الرابط أدناة
http://www.zshare.net/download/6321275262d907
SmoothCriminal
09-01-2008, 10:45 AM
الشكل المستطيل
لعمل شكل مستطيل فإن x1 و y1 هما الذان يحددان بعد الشكل عن الحواف أما x2 وy2 فهما أبعاد هذا المستطيل يعنى طول وعرض
http://img204.imageshack.us/img204/7828/14533991pm4.jpg
ويمكن استخدام نفس الكود الخاص بالمستقيم مع إحداث تغيير طفيف جدا
Private Sub Myrect(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) _
Handles MyBase.Paint
Dim MyPen As New Pen(Color.Red, 1)
e.Graphics.DrawRectangle(MyPen, 20, 20, 200, 100)
End Sub
وبديهى جدا ان هذا الشكل يصبح مربع عند x2=y2 أى إذا كانت لهما نفس القيمة
إذن الموضوع يعتمد إعتمادا كبيرا على فهم الأبعاد x و y
رابط التحميل
http://www.zshare.net/download/63308267a6d0a3/
SmoothCriminal
09-01-2008, 12:09 PM
المنحنيات والأقواس
بالإضافة إلى المتغيرات X و Y فإننا سنضيف الان متغير جديد لتحديد معدل الدوران أو الإلتفاف وهو المتغير A
وهذا المتغير هو عبارة عن زاوية وحيث أن الأشكال المنحنية تأخذ أحيانا أكثر من زاوية عند إنحناؤها فيصبح لدينا A1 وهى تحدد المنقطة التى سيبداء عندها الشكل فى الانحناء و A2 وهى تحدد معدل التقوس ولإيضاح تأثير الزاوية A1 يمكن ملاحظتها
كما يلى
http://tw.absba.org/teamwork11/569760/66.jpg
وتغيير الزاوية A2 باتجاة الزيادة يؤدى بالشكل إلى أن يتجة إلى إلإغلاق ويصل أقصاة عندما تصبح قيمة A2 فى أقصاها عند 360 درجة ويصبح الشكل شبة دائرى ولكى يصبح كامل الاستدارة فيجب ان تصبح قيمة x1 وy1 متساويتان وعندها يتم إهمال قيمة A1 لأنها تصبح بدون وظيفة فى الشكل الدائرى وهذة ليست الطريقة الوحيدة لرسم الدائرة
إذن تصبح المتغيرات لدينا x1,y1,x2,y2,A1,A2
ويصبح الكود مثل ذلك
Private Sub MyrArc(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) _
Handles MyBase.Paint
Dim MyPen As New Pen(Color.Red, 1)
e.Graphics.DrawArc(MyPen, 20, 20, 200, 200, 270, 90)
End Sub
تحميل المثال
http://www.zshare.net/download/6333132f615b28/
تم رفع الصورة الى سيرفير المنتدى بواسطة moh.robinho
peter_oussa
09-01-2008, 05:03 PM
شكرا جدا علي الموضوع الرائع انت فعلا عبقري و ننتظر المزيد من الدروس و المعرفة منك الف شكر لك........
Alone.1-1
09-01-2008, 08:57 PM
الخط المستقيم
حيث أنة يقوم بتوفير كل الأدوات الازمة للرسم من خطوط وأقلام رسم وكذلك الألوان والأشكال
2- System.Drawing.Drawing2D
3-System.Drawing.Imaging
4-System.Drawing.Text
5-System.Drawing.Printing
Private Sub MyLine(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) _
Handles MyBase.Paint
Dim MyPen As New Pen(Color.Red, 1)
e.Graphics.DrawLine(MyPen, x1 ,y1, x2 ,y2)
End Sub
هذا هو المثال يمكنكم تحميلة من الرابط أدناة
http://www.zshare.net/download/6321275262d907
أولا :ألف شكر يا مبدع البرمجة
ثانيا : طبقت المشروع وكذلك حملت مشروعك والسؤال هو: لماذا لم تستخدم الأشياء التي توفر أدوات الرسم
- System.Drawing.Drawing2D
3-System.Drawing.Imaging
4-System.Drawing.Text
5-System.Drawing.Printing
ولم يظهر خطأ أثناء تركها؟
:::::::::::::
معلومة للأعضاء
Dim MyPen As New Pen(Color.Red, 1)
1 يعني عرض (ثخانة) خط الرسم , بالإمكان زيادته
bufahad
09-01-2008, 08:58 PM
جهد كبير منك بارك الله فيك على ما تقدمه
SmoothCriminal
10-01-2008, 12:01 AM
أولا :ألف شكر يا مبدع البرمجة
ثانيا : طبقت المشروع وكذلك حملت مشروعك والسؤال هو: لماذا لم تستخدم الأشياء التي توفر أدوات الرسم
- System.Drawing.Drawing2D
3-System.Drawing.Imaging
4-System.Drawing.Text
5-System.Drawing.Printing
ولم يظهر خطأ أثناء تركها؟
:::::::::::::
معلومة للأعضاء
Dim
MyPen AsNew Pen(Color.Red, 1)
1 يعني عرض (ثخانة) خط الرسم , بالإمكان زيادته
لأننا لم نحتاج إليها حتى الان فلا تتعجل الأمور
SmoothCriminal
10-01-2008, 12:12 AM
متوازى المستطيلات المفرغ
من خلال ما سبق يتبين لنا أن الأشكال الأساسية هى الخط المستقيم و والخط المنحنى وأى أشكال أخرى فهى مشتقة منهما ويكفى أن نعرف القواعد المستخدمة لإنشائهما حتى نستطيع أن نقوم باشتقاق أشكال جديدة وكذلك عمل أشكال مركبة وقد تكون أيضا معقدة وهذة مجموعة من التركيبات سنحاول تنفيذها.
عندما نقوم برسم شكل رباعى فإنة يصبح لدينا أربع نقاط إرتكاز وهى
( x1,y1) و ( x1,y2) و ( x2,y1) و ( x2,y2)
http://tw.absba.org/teamwork11/569760/77.jpg
سنقوم بعمل متوازى مستطيلات ولتنفيذ ذلك فإننا يجب أن نقوم الان بإنشاء أربعة إمتدادات عند كل نقطة من هذة النقاط الاربع
يمكنكم متابعة خطوات الإنشاء كما يلى
http://tw.absba.org/teamwork11/569760/88.jpg
يمكنكم تجميع الكود من خلال الخطوات الموضحة بالصورة ولكن مهلا فى هذا الكود لدينا عضو جديد
Protected Overrides
يتم استخدام Protected Overrides إذا كنا نريد عمل تغيير فى المحيط Environmental Changes ومعناها أنة على الجميع الإنتباة سنقوم بعمل شىء جديد ويجب على الجميع عدم معارضتة لأنة Protected يعنى عندة حصانة
-قم بفتح مشروع جديد من النوع WindowsControlLibrary ثم قم بكتابة الاكواد وقم بعمل Build ثم احفظ المشروع
-إذهب إلى المجلد Visual Studio 2005\Projects\MyControl\MyControl\bin\Release سوف تجد ملف من النوع dll هذا هو ناتج العمل قم بنسخة إلى أى مسار
- لإعادة استخدام هذا الملف يجب أن نقوم باستيرادة
-قم بفتح مشروع جديد windows Application ثم اذهب إلى ToolBox ثم كليك يمين بالماوس فى أى نقطة ثم اختر Choose Items واذهب إلى Browse وقم بالذهاب إلى المجلد الذى قمت بحفظ ملف dll بة ثم قم باختيارة ثم Open سيتم إدراجة داخل ToolBox قم بإدراجة إلى الفورم
وهذا رابط لملف dll يمكنكم تجربتة
http://www.zshare.net/download/6349555ff2b4c6/
تم رفع الصور الى سيرفير المنتدى بواسطة moh.robinho
SmoothCriminal
10-01-2008, 05:41 PM
الشكل الأسطوانى
هذة هى الإحداثيات
http://tw.absba.org/teamwork11/569760/99.jpg
لعمل شكل اسطوانى سنقوم أولا برسم قطع ناقص Ellipse والقطع الناقص يختلف عن القوس فى أن القوس هو جزء من الدائرة وجميع زواية تخضع لقوانين الدائرة أما القطع الناقص فهو ليس قطاع من الدائرة وقد يكون القطع الناقص مغلقا ويأخذ شكل حلقة أو مفتوحا
وهذا الشكل يوضح نقاط x و y خلال القطع الناقص
http://tw.absba.org/teamwork11/569760/10.jpg
لكى نقوم برسم الإسطوانة سنقوم بإنشاء 2 قطع ناقص ثم نقوم بعمل اتصال بينهما
http://tw.absba.org/teamwork11/569760/12.jpg
ومن الملاحظ هنا أننا لم نستخدم الألوان بالطريقة التى استخدمناها سابقا
فى هذة المرة استخدمنا Color.FromArgb
rgb هى اختصار Red,Green,Blue وهذة هى الألوان الأساسية وكل الأوان عبارة عن تركيب لهذة الألوان الثلاثة بقادير مختلفة وكل لون من هذة الألوان الثلاثة لة قيمة بين 0 و 255 و يتم تركيب اللون بالصيغة التالية(r,g,b) مثال اللون الأسود (0,0,0) والأبيض (255,255,255) إذن نحن الان على وشك الدخول إلى مرحلة أخرى وهى التعامل مع الألوان
تم رفع الصور الى سيرفير المنتدى بواسطة moh.robinho
ASrtre258
10-01-2008, 10:58 PM
شكرا جدا علي الموضوع الرائع انت فعلا عبقري و ننتظر المزيد من الدروس و المعرفة منك الف شكر لك........
شىء رائع شرحك خيالى مشكوووور
SmoothCriminal
12-01-2008, 12:17 PM
SolidBrush
وهى الفرشاة الصلبة ولكن كيف تكون صلبة؟
هى فرشاة تأخذ شكل محدد وتستطيع أن تقوم بتحديد شكل الفرشاة كما لوكنت تقوم برسم أحد الأشكال ووظيفتها أن تقوم بتعبئة شكل محدد باللون مثل التى فى هذا المثال
Private Sub Circular(ByVal sender As Object, ByVal e _
As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim MyBrush As New SolidBrush(Color.FromArgb(255, 0, 255))
Dim MyPen As New Pen(Color.FromArgb(0, 255, 255), 5)
e.Graphics.DrawEllipse(MyPen, 35, 35, 150, 150)
e.Graphics.FillEllipse(MyBrush, 35, 35, 150, 150)
End Sub
فيتم تعبئة الدائرة بالفرشاة
http://img146.imageshack.us/img146/4003/31491038uf5.jpg
ولكن هناك شىء اخر
قم بتنفيذ المثال التالى
Private Sub Form1_Paint(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) _
Handles MyBase.Paint
Dim rect As New Rectangle(25, 25, 150, 150)
Dim MyBrush As New SolidBrush(Color.Orange)
e.Graphics.FillEllipse(MyBrush, rect)
End Sub
ستكون النتيجة غير متوقعة لقد قمنا برسم مربع
Dim rect As New Rectangle(25, 25, 150, 150)
فكان الناتج دائرة
ماهو تفسير ذلك؟
قمنا برسم المربع
http://img244.imageshack.us/img244/428/86233445ec0.jpg
ثم قمنا بعمل الفرشاة
http://img244.imageshack.us/img244/5861/23882602jt9.jpg
يجب أن تقوم الفرشاة بتغطية هذا الجزء داخل المربع
http://tw.absba.org/teamwork11/569760/13.jpg
ولكنها لن تفعل ذلك ستقوم بتخطية المربع قطريا
http://tw.absba.org/teamwork11/569760/14.jpg
يعنى الفرشاة دائرية وسيصبح قطر الدائرة = قطر المربع المرسوم فتبداء فى التمدد
http://tw.absba.org/teamwork11/569760/15.jpg
إلى أن تقوم بالتغطية الكاملة للمربع
http://tw.absba.org/teamwork11/569760/16.jpg
إذن الفرشاة الصلبة لا تعتمد على الشكل الذى ستقوم بتغطيتة ولكن هى تأخذ إحداثياتة من طول وعرض والموضع ولكنها تقوم بتغطيتة حسب شكلها هى وليس حسب الشكل الاخر
تم رفع الصور الى سيرفير المنتدى بواسطة moh.robinho
القلب المهجوور
12-01-2008, 12:29 PM
مشكوور على الجهد الرائع
وبارك الله فيك
armo54879
13-01-2008, 01:54 PM
مشكووور على الشرح
ra3bob
13-01-2008, 06:39 PM
شكراَ على الموضوع الطيب........
ننتظر المزيد
BumFunkMcs
13-01-2008, 11:48 PM
كيف أسوى شكل مثلث أو هرمى مثل هرم أجدادك
sayedxp
14-01-2008, 01:24 AM
موضوع مميز جدا أخي الأستاذ المحترم / طاهر
تقبل مني جزيل الشكر والتحية
almstshar
15-01-2008, 12:33 AM
ما يحتاج
يا اخي ما افهم الا على شرحك
يعطيك الف عافية اخوي
SmoothCriminal
15-01-2008, 12:56 AM
كيف أسوى شكل مثلث أو هرمى مثل هرم أجدادك
تستطيع أن تقوم برسم مثلث أو حتى شكل هرمى لكنك لا تستطيع عمل هرم مثل أهرامات أجدادى خصوصا هرم جدى خوفو :D كما أن هناك شيئا اخر سنقوم بشرحة وهو المنشور الثلاثى
goood man
15-01-2008, 03:13 PM
الله يعطية العافية د.طاهر وجزاك الله خير كفيت ووفيت
SmoothCriminal
16-01-2008, 01:35 AM
HatchStyle
الهاتش هى أنواع فرش إضافية موجودة بداخل Namespace System. Drawing. Drawing2D ويمكن استخدامها لطلاء أحد الأشكال وهى ليست فرشاة صلبة SolidBrush وعددها 56 وأنواعها هى
BackwardDiagonal
Cross
DarkDownwardDiagonal
DarkHorizontal
DarkUpwardDiagonal
DarkVertical
DashedDownwardDiagonal
DashedHorizontal
DashedUpwardDiagonal
DashedVertical
DiagonalBrick
DiagonalCross
Divot
DottedDiamond
DottedGrid
ForwardDiagonal
Horizontal
HorizontalBrick
LargeCheckerBoard
LargeConfetti
LargeGrid
LightDownwardDiagonal
LightHorizontal
LightUpwardDiagonal
LightVertical
Max
Min
NarrowHorizontal
NarrowVertical
OutlinedDiamond
Percent05
Percent10
Percent20
Percent25
Percent30
Percent40
Percent50
Percent60
Percent70
Percent75
Percent80
Percent90
Plaid
Shingle
SmallCheckerBoard
SmallConfetti
SmallGrid
SolidDiamond
Sphere
Trellis
Vertical
Wave
Weave
WideDownwardDiagonal
WideUpwardDiagonal
ZigZag
ويمكن مشاهدتها عند تحميل المثال التالى
http://www.zshare.net/download/6547729f5f6811/
http://img174.imageshack.us/img174/876/75577605ib7.jpg
والمثال التالى فى غاية الأهمية حيث أننا سنقوم فية بعمل تطبيق لأحد فرش HatchStyle بالإضافة لرسم شكل متعدد الأضلاع عن طريق رسم الشكل عن طريق رسم خط مستقيم خلال مسار ثم تكسيرة إلى عدد من الأضلاع وإغلاقة ليصبح كأنة شكل متعدد الأضلاع ثم استخدام فرشاة لتعبئتة
Public Class Form1
Private Const EndPoint As Integer = 9
Private MyPoint(EndPoint) As Point
Private Sub Form1_Load(ByVal sender As System.Object _
, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer
i = 0
MyPoint(i).X = 93
MyPoint(i).Y = 87
i = i + 1
MyPoint(i).X = 93
MyPoint(i).Y = 36
i = i + 1
MyPoint(i).X = 241
MyPoint(i).Y = 36
i = i + 1
MyPoint(i).X = 189
MyPoint(i).Y = 78
i = i + 1
MyPoint(i).X = 263
MyPoint(i).Y = 125
i = i + 1
MyPoint(i).X = 217
MyPoint(i).Y = 203
i = i + 1
MyPoint(i).X = 196
MyPoint(i).Y = 131
i = i + 1
MyPoint(i).X = 122
MyPoint(i).Y = 131
i = i + 1
MyPoint(i).X = 122
MyPoint(i).Y = 196
i = i + 1
MyPoint(i).X = 50
MyPoint(i).Y = 124
i = i + 1
End Sub
Private Sub Form1_Paint(ByVal sender As Object _
, ByVal e As System.Windows.Forms.PaintEventArgs) _
Handles MyBase.Paint
Dim MyBrush As New System.Drawing.Drawing2D.HatchBrush _
(Drawing2D.HatchStyle.Cross, Color.CornflowerBlue, Color.Red)
e.Graphics.FillPolygon(MyBrush, MyPoint)
MyBrush.Dispose()
Dim MyPen As New Pen(Color.Blue, 1)
e.Graphics.DrawPolygon(MyPen, MyPoint)
MyPen.Dispose()
End Sub
End Class
http://img153.imageshack.us/img153/9766/75538442cs6.jpg
باعتقادى أن النقطة الوحيدة التى تحتاج لشرح فى هذا الكود هى لماذا
Private Const EndPoint As Integer = 9
هى تساوى 9 للسبب التالى
عندما نريد أن نقوم برسم شكل متعدد الأضلاع فإن هذة القيمة=عدد أضلاع الشكل-1 يعنى إذا كنت تريد أن تقوم برسم شكل يحتوى على 8 أضلاع فإن القيمة =7 وفى المثال الذى لدينا عدد أضلاع الشكل =10
تحميل المثال
http://www.zshare.net/download/6548387c9ea5e7/
BumFunkMcs
18-01-2008, 02:31 AM
أخيرا استطعت ر سم المثلث
http://img293.imageshack.us/img293/2351/76499318dg5.jpg
Public Class Form1
Private Const EndPoint As Integer = 2
Private MyPoint(EndPoint) As Point
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer
i = 0
MyPoint(i).X = 50
MyPoint(i).Y = 100
i = i + 1
MyPoint(i).X = 150
MyPoint(i).Y = 200
i = i + 1
MyPoint(i).X = 50
MyPoint(i).Y = 200
End Sub
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim MyBrush As New System.Drawing.Drawing2D.HatchBrush(Drawing2D.Hatc hStyle.DiagonalCross, Color.Red, Color.Yellow)
e.Graphics.FillPolygon(MyBrush, MyPoint)
MyBrush.Dispose()
Dim MyPen As New Pen(Color.Blue, 1)
e.Graphics.DrawPolygon(MyPen, MyPoint)
MyPen.Dispose()
End Sub
End Class
اعتمادا على الدرس السابق
BumFunkMcs
18-01-2008, 02:47 AM
أخيرا استطعت ر سم المثلث
http://img293.imageshack.us/img293/2351/76499318dg5.jpg
Public Class Form1
Private Const EndPoint As Integer = 2
Private MyPoint(EndPoint) As Point
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer
i = 0
MyPoint(i).X = 50
MyPoint(i).Y = 100
i = i + 1
MyPoint(i).X = 150
MyPoint(i).Y = 200
i = i + 1
MyPoint(i).X = 50
MyPoint(i).Y = 200
End Sub
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim MyBrush As New System.Drawing.Drawing2D.HatchBrush(Drawing2D.Hatc hStyle.DiagonalCross, Color.Red, Color.Yellow)
e.Graphics.FillPolygon(MyBrush, MyPoint)
MyBrush.Dispose()
Dim MyPen As New Pen(Color.Blue, 1)
e.Graphics.DrawPolygon(MyPen, MyPoint)
MyPen.Dispose()
End Sub
End Class
اعتمادا على الدرس السابق
SmoothCriminal
18-01-2008, 06:23 PM
طريقة لا بأس بها لرسم مثلث ولكن هذة ليست الطريقة الوحيدة لرسم المثلث
الان نكتفى بالتدريب على الأشكال وسنقفز إلى مرحلة أعلى قليلا
SmoothCriminal
19-01-2008, 12:31 PM
التدرج اللونىGradient
ما هو التدرج فى اللون؟
التدرج اللونى هو البداء من لون والإنتهاء بلون اخر مع مراعاة الإنتقال التدريجى فى المسافة الفاصلة بين لونين أو أكثر
سنتعلم اليوم مجموعة من الطرق الجديدة فى الرسم
LinearGredientBrush
سنقوم برسم شكل رباعى ولكن بطريقة جديدة
فى البداية
Imports System.Drawing.Drawing2D
ثم
Dim y As Integer = 20
Dim x As Integer = 20
معنى ذلك أننا سنقوم بتحديد النقطة التى سنبداء عندها الرسم وتبعد عن نقطة الأصل بمقدار 10 بيكسل فى اتجاة X وكذلك 10 بيكسل فى اتجاة Y
Dim Wide As Integer = 200
Dim High As Integer = 125
إذن سيكون لدينا بعدين سنعمل من خلالهما العرض Wide وسيكون 200 والإرتفاع High وسيكون 125
سنتعلم أيضا شىء آخر وهو كيفية الكتابة على الفورم
e.Graphics.DrawString("Sample1", Me.Font, Brushes. Red, 20, 5)
عندما تذكر Graphics.DrawString فمعنى ذلك أننا سنحتاج إلى 5 أشياء
1-النص المطلوب كتابتة
2- الخط المستخدم فى الكتابة
3-الفرشاة أو القلم المستخدم فى الكتابة
4-البعد فى اتجاة X
5-البعد فى اتجاة Y
معنى ذلك سنرسم خط ونكتب كلمة 1Sample بنفس الخط المستخدم فى الفورم وبلون أحمر على مسافة 20 بمحاذاة X و 5 بمحاذاة Y
Dim MyBrush As New LinearGradientBrush(New Point(x, y), New Point(x + Wide, y), Color.Green, Color.DarkSeaGreen)
نوع الفرشاة من النوع الخطى وستبداء الفرشاة فى الرسم من النقطة X وY يعنى 20 و20 وتستمر على امتداد الشكل المرسوم مبتداءة الرسم باللون الأخضر حتى ينتهى تدريجيا عند الأخضر البحرى الغامق محدثة تدرجا فى درجة اللون
e.Graphics.FillRectangle(MyBrush, x, y, Wide, High)
تعبئة الشكل المرسوم بالفرشاة المذكورة
الان يصبح لدينا الكود كاملا هكذا
Private Sub Form1_Paint(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) _
Handles MyBase.Paint
Dim y As Integer = 20
Dim x As Integer = 20
Dim Wide As Integer = 200
Dim High As Integer = 125
e.Graphics.DrawString("Sample1", Me.Font, _
Brushes.Red, 20, 5)
Dim MyBrush As New LinearGradientBrush(New Point(x, y) _
, New Point(x + Wide, y), Color.Green, Color.DarkSeaGreen)
e.Graphics.FillRectangle(MyBrush, x, y, Wide, High)
End Sub
وكما نرى هذة نتيجة العمل
http://img401.imageshack.us/img401/3752/55315743yd2.jpg
كما رأينا فى المثال السابق فإننا قد استخدمنا LinearGradientBrush وواضح من إسمها أنها تسير فى صورة خط ويوجد منها أربعة أنواع
1-BackwardDiagonal
وتبداء من الناحية اليسرى السفلية
http://img263.imageshack.us/img263/8749/76653296bw0.jpg
Private Sub Form1_Paint(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) _
Handles MyBase.Paint
Dim y As Integer = 10
Dim x As Integer = 10
Dim wide As Integer = 200
Dim High As Integer = 50
Dim rect As New Rectangle(x, y, wide, High)
Dim myBrush As New LinearGradientBrush _
(rect, Color.Violet, Color.White, _
LinearGradientMode.BackwardDiagonal)
Dim MyBlend As New ColorBlend
e.Graphics.FillRectangle(myBrush, x, y, wide, High)
End Sub
2-ForwardDiagonal
وتبداء من الناحية اليمنى السفلية
http://img263.imageshack.us/img263/1720/96242901ly8.jpg
Private Sub Form1_Paint(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) _
Handles MyBase.Paint
Dim y As Integer = 10
Dim x As Integer = 10
Dim wide As Integer = 200
Dim High As Integer = 50
Dim rect As New Rectangle(x, y, wide, High)
Dim myBrush As New LinearGradientBrush _
(rect, Color.Violet, Color.White, _
LinearGradientMode.ForwardDiagonal)
Dim MyBlend As New ColorBlend
e.Graphics.FillRectangle(myBrush, x, y, wide, High)
End Sub
3-Horizintal
ويكون اتجاة الحركة من اليمين إلى اليسار
http://img263.imageshack.us/img263/6371/53412097iy6.jpg
Private Sub Form1_Paint(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) _
Handles MyBase.Paint
Dim y As Integer = 10
Dim x As Integer = 10
Dim wide As Integer = 200
Dim High As Integer = 50
Dim rect As New Rectangle(x, y, wide, High)
Dim myBrush As New LinearGradientBrush _
(rect, Color.Violet, Color.White, _
LinearGradientMode.Horizontal)
Dim MyBlend As New ColorBlend
e.Graphics.FillRectangle(myBrush, x, y, wide, High)
End Sub
4-Vertical
ويكون الإتجاة من أسفل إلى أعلى
http://img263.imageshack.us/img263/3118/33510290tx8.jpg
Private Sub Form1_Paint(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) _
Handles MyBase.Paint
Dim y As Integer = 10
Dim x As Integer = 10
Dim wide As Integer = 200
Dim High As Integer = 50
Dim rect As New Rectangle(x, y, wide, High)
Dim myBrush As New LinearGradientBrush _
(rect, Color.Violet, Color.White, _
LinearGradientMode.Vertical)
Dim MyBlend As New ColorBlend
e.Graphics.FillRectangle(myBrush, x, y, wide, High)
End Sub
المحب_الحنون
19-01-2008, 06:36 PM
الله يبارك فيك اخي
SmoothCriminal
20-01-2008, 12:39 AM
PathGradientBrush
وهذة الفرشاة تقوم بالإنتشار من الخارج إلى الداخل ويتم تقسيم ألوان الفرشاة إلى جزئين
1-SurroundColor
وهو الجزء الخارجى من الشكل المرسوم
2-CenterColor
منتصف الشكل أو النواة
وهى تقوم بدمج اللونين بصورة أكبر من الأولى LinearGradientBrush وقد يصبح اللون الناتج فى مركز الفرشاة مختلفا قليلا ويميل باتجاة اللون الخارجى قليلا وتصل الفرشاة إلى اللون المفترض عند المركز تماما
وأبرز مثال على هذة الفرشاة هو الشكل الدائرى فى المثال التالى
http://img341.imageshack.us/img341/84/qqpt5.jpg
Private Sub Form1_Paint(ByVal sender As Object _
, ByVal e As System.Windows.Forms.PaintEventArgs) _
Handles MyBase.Paint
Dim path As New GraphicsPath()
Dim y As Integer = 10
Dim x As Integer = 10
Dim wide As Integer = 200
Dim High As Integer = 200
path.AddEllipse(x, y, wide, High)
Dim myBrush As New PathGradientBrush(path)
myBrush.SurroundColors = New Color() {Color.White}
myBrush.CenterColor = Color.Violet
e.Graphics.FillEllipse(myBrush, x, y, wide, High)
End Sub
SmoothCriminal
20-01-2008, 03:15 PM
TextureBrush
وهى فرشاة لا تستخدم اللون فى الطلاء ولكنها تستخدم صورة كنقش
لتوضيح كيفية استخدام الصورة كفرشاة مثل هذة
http://img252.imageshack.us/img252/9392/97535697jw9.jpg
-قم بعمل مشروع جديد ثم قم بحفظة
-انسخ أى صورة تريدها إلى المجلد Debug
-قم بكتابة الكود التالى
Private Sub TextureBrushes_Paint(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) _
Handles MyBase.Paint
Dim myBrush As New Drawing.TextureBrush _
(Image.FromFile("Smooth_Criminal.bmp"))
e.Graphics.FillRectangle(myBrush, e.Graphics.ClipBounds)
End Sub
أو تحميل المشروع
http://www.zshare.net/download/67000500cc5d42/
باعتقادى أننا شرحنا قدرا لا بأس بة ونحتاج الان إلى عمل مشروع لا بأس بة لنرى كيفية استخدام كل ما سبق فى التطبيقات وقد قمت بتجهيز مشروع وهو عن كيفية استخدام ما تم شرحة لإنشاء الأزرار
mrmohamedalhrty
20-01-2008, 06:33 PM
تسلم الايادي ..
SmoothCriminal
21-01-2008, 03:02 PM
تسلم الايادي ..
نورت موضوعاتى بزيارتك شكرا لك أخى mrmohamedalhrty
SmoothCriminal
22-01-2008, 03:28 AM
التطبيق الأول على +GDI
زر متعدد الأشكال والأحجام والخصائص
Taher Buttons Model
قمت بعمل هذا الزر بطريقة جديدة ومبتكرة وقد راعيت فيها إمكانية تغيير الشكل والحجم وكذلك خصائص الزر وقد قمت بوضع كود مرن وبنظام محسوب بغرض أن يصبح نواة للمبرمجين العرب لإنشاء أزرار متعددة ومختلفة إعتمادا على Taher Buttons Model وهو قابل للتطوير فى كافة مكوناتة وأرجوا أن تنال الفكرة إعجابكم
-قم بتحميل الملف من الرابط التالى ثم قم بفك الضغط عنة ستجد بداخلة ملف من النوع dll
http://www.zshare.net/download/675201108a2ac8/
-قم بفتح مشروع جديد ثم قم بعمل كليك يمين بالماوس على أى جزء فى ToolBox ثم اختر Choose Items وفى نافذة Choose ToolBox Items التى تظهر لك اضغط على Browse ثم قم بالاستعراض إلى مكان الملف الذى قمت بتحميلة
http://img253.imageshack.us/img253/2834/55676934yg4.jpg
بعد اختيارك الملف سيظهر تلقائيا الأيكونة الخاصة بة فى ToolBox يمكنك التعامل معة كما تفعل مع أى زر عادى لذلك قم بالضغط علية مرتين ليتم إدراجة داخل الفورم
http://img401.imageshack.us/img401/6499/42370609hl6.jpg
هذا الزر لة عدد من الخصائص
-يمكنك تغيير شكلة وحجمة ولونة
http://img301.imageshack.us/img301/6562/47404442oc3.jpg
والخصائص التى قمت بوضعها فى هذا الزر يمكنك الوصول إليها عن طريق كليك يمين على الزر ثم Properties وتذهب إلى خصائصة فى Properties
وهى كالتالى
1-Active
ولها قيمتين إما True وهو الوضع الإفتراضى وهذة هى حالتة كزر أما False فهى حالتة كصورة جامدة ويمكنك استخدامها استخداما أخر كخلفية مثلا للفورم
2-ButtonStyle
ويوجد نوعان Rectangle و Ellipse ويمكنك اختيار أحدهما لتحديد شكل الزر ثم تشكيلة باستخدام الماوس كما تشاء
http://img301.imageshack.us/img301/617/47335931mx5.jpg
3-GredientStyle
وقد قمت باستخدام الفرشاة من النوع LinearGradientStyle وعلى ذلك فالأنواع المتاحة هى
-Horizintal
-Vertical
-ForwordDiagonal
-BackWordDiagonal
http://img301.imageshack.us/img301/5023/95185665zl7.jpg
4- الألوان المصاحبة لأحداث الماوس وهى على ثلاثة أنواع
-الألوان عند الحالة المستقرة
-الألوان عند المرور بالماوس فوق الزر
-الألوان عند الضغط على الزر
وهى جميعها قابلة للتغيير
http://img213.imageshack.us/img213/2260/63696730gw4.jpg
أرجوا أن يتم التركيز جيدا على خصائص هذا الزر قبل أن أقوم بعرض الكود وشرحة حيث أن فهم الكود يعتمد على هذة الخصائص وسأقوم غدا بمشيئة الله بشرح الكود
almstshar
23-01-2008, 05:06 PM
كيف اعرف احداثيات ال (x,y)
يعني ابي احط الرسم في موقع معين داخل الفورم
؟؟
SmoothCriminal
23-01-2008, 06:21 PM
كيف اعرف احداثيات ال (x,y)
يعني ابي احط الرسم في موقع معين داخل الفورم
؟؟
X هو الإتجاة بالعرض من الجهة اليسرى أما Y فهى الإتجاة الطولى من أعلى إلى أسفل
إذن أقصى نقطة باتجاة اليسار بالنسبة للعرض X =0
أعلى نقطة بالنسبة للإرتفاع Y =0
يلتقيان فى نقطة الأصل(0,0) التى هى أعلى نقطة يسار
كلما تحركت باتجاة الناحية اليمنى زادت قيمة X
والحركة إلى أسفل تؤدى لزيادة Y
SmoothCriminal
23-01-2008, 08:23 PM
شرح كود النموذج Taher Buttons Model
طبقا لللتجربة التى تمت على هذا الزر فإنة يمكن ملاحظة التالى
-قمنا برسم أحد الأشكال وهو الشكل الرباعى Rectangle وقمنا بتعريفة على أنة زر ثم قمنا برسم شكل اخر وهو القطع الناقص Ellipse وأضفنا خاصية الإنتقال بينهما لكى نقوم بتغيير الشكل يدويا من خلال Properties Windows
-قمنا أيضا بعمل تأثيرات مصاحبة لأحداث الماوس حيث يتغير لون الزر عند المرور علية بالماوس وكذلك عند الضغط على الزر وأضفنا خاصية تغيير الألوان فى الحالات الثلاثة فى الوضع Normal وفى الوضع Hover وفى الوضع Clicked كما أن الألوان متدرجة و كل زر يتكون من 3 ألوان
1-لون الحواف BorderColor
2-اللون ColorA
3-اللون ColorB
- تم إضافة إمكانية تغيير Gradient Style طبقا لنوع الفرشاة المستخدمة وهى
-Horizintal
-Vertical
-ForwordDiagonal
-BackWordDiagonal
-كذلك قمنا بإضافة خاصية لتفعيل كافة الخصائص المتعلقة بالشكل كزر لتصبح Active وكذلك لعدم تفعيلها
وعلى ذلك فإن المتغيرات التى تصبح لدينا هى
-بالنسبة للوضع Active فيوجد إحتمالين لا ثالث لهما Yes أو No
Private MyActiveState As Boolean
-بالنسبة للماوس
Private MyMouseAction As MouseAction
- بالنسبة للتدريج فى اللون Gradient
Private MyGradientStyle As GradientStyles
-بالنسبة لستايل الزر ButtonStyles
Private MyButtonStyle As ButtonStyles
-وضع حواف الزر فى الوضع الطبيعى
Private MyNormalBorderColor As Color
-اللون A فى الوضع الطبيعى
Private MyNormalColorA As Color
-اللون B فى الوضع الطبيعى
Private MyNormalColorB As Color
-وضع حواف الزر أثناء مرور الماوس على الزر
Private MyHoverBorderColor As Color
-اللون A أثناء مرور الماوس على الزر
Private MyHoverColorA As Color
-اللون B أثناء مرور الماوس على الزر
Private MyHoverColorB As Color
-وضع حواف الزر أثناء الضغط بالماوس
Private MyClickedBorderColor As Colo
-اللون A أثناء الضغط بالماوس
Private MyClickedColorA As Color
-اللون B أثناء الضغط بالماوس
Private MyClickedColorB As Color
مراحل التنفيذ
-قم بفتح مشروع جديد من النوع ClassLibrary
-قم بإضافة Refrence التالية
System.Windows.Forms
System.Drawing
ثم سنقوم باستيراد عدد من Namespaces
http://img523.imageshack.us/img523/4446/98386400ya9.jpg
ونقوم بكتابة المتغيرات التى ذكرناها
http://img523.imageshack.us/img523/739/70069356kx7.jpg
ويمكننا إضافة قيم المتغيرات مباشرة بحيث يتم تفعيلها عند قيامك بوضع الزر داخل الفورم كالتالى
http://img184.imageshack.us/img184/315/34294058ft3.jpg
وهذا هو التخطيط العام للكود وسأقوم بشرح كل جزئية بصورة منفصلة حتى يسهل استيعابها
http://img180.imageshack.us/img180/3975/44szd7.jpg
تابعوا معنا هذا الأمر
SmoothCriminal
24-01-2008, 12:00 AM
الجزء الأول Enum
Enumeration
وهى تستخدم لإظهار وعرض قيمة متغير بصورة عددية وهى قيمة يتم تعريفها بواسطة المبرمج الذى يقوم بالعمل ويمكن استخدامها لإظهار المتغير فقط أو إظهار
المتغير مرفقا بقيمتة العددية وفى حالة عدم إرفاق قيمة Enumeration مع المتغير فإنة يجب أن يحصل عليها من Attribute أو من Property
الخاصة بهذا المتغير
مثال
Enum Colors
Green=1
Blue=2
Red=4
End Enum
فقد انتهى
أما
Enum Colors
Green
Blue
Red
End Enum
فلابد لنا من شىء آخر نقوم بة للتعبير عن القيمة
فلكى نستكمل فيمكن أن يكون كالتالى
Dim A as Colors
A=Colors.Green
الخ
وفى مشروعنا هذا لدينا ثلاثة Enumerities وهى
Private Enum MouseAction
Normal
MouseOver
Clicked
End Enum
Public Enum ButtonStyles
Ellipse
Rectangle
End Enum
Public Enum GradientStyles
Horizontal
Vertical
ForwardDiagonal
BackwardDiagonal
End Enum
وكما نرى فإن MoussAction هو Private يعنى خاص وهو خاص لأن تأثيرة سيظهر على الزر فقط ولن يمتد لباقى أجزاء العمل
أما ButtonStyle و GradientStyles فهما Public لأنهما قد يمتد تأثيرهما إلى مناطق أخرى داخل Class
الجزء الثانى New
Public Sub New()
MyBase.Size = New Size(100, 35)
MyBase.Font = New Font("Arial", 8, FontStyle.Regular)
SetStyle(ControlStyles.AllPaintingInWmPaint Or _
ControlStyles.ResizeRedraw Or ControlStyles.DoubleBuffer _
Or ControlStyles.Selectable Or ControlStyles.UserMouse, True)
End Sub
جديد
ماهو الجديد
MyBase.Size = New Size(100, 35)
شىء ما وأبعادة هى 100و35
وهو الإطار الشفاف فى هذة الصورة والذى يحمل بداخلة الزر
http://img165.imageshack.us/img165/3025/capturenx8.jpg
الجزء الثالث Property
Public Property GradientStyle() As GradientStyles
Get
Return MyGradientStyle
End Get
Set(ByVal value As GradientStyles)
MyGradientStyle = value
Me.Invalidate()
End Set
End Property
Public Property ButtonStyle() As ButtonStyles
Get
Return MyButtonStyle
End Get
Set(ByVal value As ButtonStyles)
MyButtonStyle = value
Me.Invalidate()
End Set
End Property
Public Property NormalBorderColor() As Color
Get
Return MyNormalBorderColor
End Get
Set(ByVal value As Color)
MyNormalBorderColor = value
Me.Invalidate()
End Set
End Property
Public Property NormalColorA() As Color
Get
Return MyNormalColorA
End Get
Set(ByVal value As Color)
MyNormalColorA = value
Me.Invalidate()
End Set
End Property
Public Property NormalColorB() As Color
Get
Return MyNormalColorB
End Get
Set(ByVal value As Color)
MyNormalColorB = value
Me.Invalidate()
End Set
End Property
Public Property HoverBorderColor() As Color
Get
Return MyHoverBorderColor
End Get
Set(ByVal value As Color)
MyHoverBorderColor = value
Me.Invalidate()
End Set
End Property
Public Property HoverColorA() As Color
Get
Return MyHoverColorA
End Get
Set(ByVal value As Color)
MyHoverColorA = value
Me.Invalidate()
End Set
End Property
Public Property HoverColorB() As Color
Get
Return MyHoverColorB
End Get
Set(ByVal value As Color)
MyHoverColorB = value
Me.Invalidate()
End Set
End Property
Public Property ClickedBorderColor() As Color
Get
Return MyClickedBorderColor
End Get
Set(ByVal value As Color)
MyClickedBorderColor = value
Me.Invalidate()
End Set
End Property
Public Property ClickedColorA() As Color
Get
Return MyClickedColorA
End Get
Set(ByVal value As Color)
MyClickedColorA = value
Me.Invalidate()
End Set
End Property
Public Property ClickedColorB() As Color
Get
Return MyClickedColorB
End Get
Set(ByVal value As Color)
MyClickedColorB = value
Me.Invalidate()
End Set
End Property
Public Property Active() As Boolean
Get
Return MyActiveState
End Get
Set(ByVal value As Boolean)
MyActiveState = value
Me.Invalidate()
End Set
End Property
Public Overloads Overrides Property Text() As String
Get
Return MyBase.Text
End Get
Set(ByVal value As String)
MyBase.Text = value
Me.Invalidate()
End Set
End Property
واضح صيغة Properties فورمة واحدة ما عدا الأخير
وهو Overload لأنة موجود بالفعل ويحمل نفس الإسم لذلك يجب استخدام Overload للتغلب على ذلك وخاصية Text موجودة وراثيا و Overrides
للسماح بمرورة من خلال Environmint
وطبعا
Me.Invalidate()
لنسخ الخاصية
المنتبه
24-01-2008, 12:09 AM
جزاك الله كل خير ... ووفقك لما يحب ويرضى .... موضوع جبار ...
SmoothCriminal
24-01-2008, 02:35 AM
رابعا Drowing
Protected Overloads Overrides Sub OnPaint _
(ByVal e As System.Windows.Forms.PaintEventArgs)
Dim MyBrush As LinearGradientBrush
Dim mode As LinearGradientMode
Dim textSize As SizeF = e.Graphics.MeasureString _
(Me.Text, MyBase.Font)
Dim textX As Integer = CInt((MyBase.Size.Width / 2)) - CInt((textSize.Width / 2))
Dim textY As Integer= CInt((MyBase.Size.Height / 2)) - CInt((textSize.Height / 2))
Dim MyRect As New Rectangle(ClientRectangle.X, _
ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height)
MyRect.Inflate(-3, -3)
اخترنا الفرشاة
والطريقة التى سيتغير بها الخط
نريد أن نقوم بتحديد موقع النص داخل الزر باعتقادى أن مكانة فى المنتصف هو أفضل مكان ولكى
يتم ذلك فيجب أن يتم عمل تمركز لة داخل الزر بدلالة X و Y وحجم النص نفسة
إذن هو فى اتجاة X الذى هو العرض=
Dim textX As Integer = CInt((MyBase.Size.Width / 2)) - CInt((textSize.Width / 2))
Clnt يعنى Clinet بمعنى أنة معلق داخل أو يتم إحتوائة بالداخل
عرض الزر مقسوما على 2 ناقص عرض النص مقسوما على2
أما فى اتجاة Y =
Dim textY As Integer= CInt((MyBase.Size.Height / 2)) - CInt((textSize.Height / 2))
إرتفاع الزر مقسوما على 2 ناقص إرتفاع النص مقسوما على2
إذن ما هو طول الزر وعرضة؟
ليس لة طول أو عرض محددين فهما قابلين للتمدد والانكماش طبقا لما ذكرناة فى أول الكود الذى هو
SetStyle(ControlStyles.AllPaintingInWmPaint Or _
ControlStyles.ResizeRedraw Or ControlStyles.DoubleBuffer _
Or ControlStyles.Selectable Or ControlStyles.UserMouse, True)
وكل ذلك بفعل الماوس
إذن الطول والعرض هنا شىء نسبى وهما
Dim MyRect As New Rectangle(ClientRectangle.X, _
ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height)
ومعلقان داخل الشكل الذى رسمناة فى الأول الذى هو فى New
MyBase.Size = New Size(100, 35)
ولكن ما هى
MyRect.Inflate(-3, -3)
يتم تعليق الزر داخل الشكل على بعد 3 فى اتجاة X و3 فى اتجاة Y وهما يأخذان القيمة السالبة دلالة على أنهما يغطسان داخل الشكل أما إذا كانت القيمة موجبة فهما يزيدان على حجم الشكل أما إذا كانتا =0 فمعنى ذلك أن ينطبق تماما مع حجم الشكل الذى يحتوى الزر الذى هو MyBase
ولإيضاح ذلك يمكنك ملاحظة الشكل التالى
http://img147.imageshack.us/img147/6752/58521345br0.jpg
وهذة الصورة المكبرة بضع عشرات من المرات للزر وهو فى الوضع (-6, -6) للإيضاح وكل مربع فى المقياس =ا بيكسل
SmoothCriminal
24-01-2008, 02:54 AM
خامسا Select Case
Select Case MyGradientStyle
Case GradientStyles.Horizontal
mode = LinearGradientMode.Horizontal
Exit Select
Case GradientStyles.Vertical
mode = LinearGradientMode.Vertical
Exit Select
Case GradientStyles.ForwardDiagonal
mode = LinearGradientMode.ForwardDiagonal
Exit Select
Case GradientStyles.BackwardDiagonal
mode = LinearGradientMode.BackwardDiagonal
Exit Select
Case Else
mode = LinearGradientMode.Vertical
Exit Select
End Select
If MyActiveState Then
Select Case MyMouseAction
Case MouseAction.Normal
MyBrush = New LinearGradientBrush(MyRect, MyNormalColorA, _
MyNormalColorB, mode)
Select Case MyButtonStyle
Case ButtonStyles.Rectangle
e.Graphics.FillRectangle(MyBrush, MyRect)
e.Graphics.DrawRectangle(New Pen(MyNormalBorderColor, 1), MyRect)
Exit Select
Case ButtonStyles.Ellipse
e.Graphics.FillEllipse(MyBrush, MyRect)
e.Graphics.DrawEllipse(New Pen(MyNormalBorderColor, 1), MyRect)
Exit Select
End Select
e.Graphics.DrawString(Me.Text, MyBase.Font, New SolidBrush _
(MyBase.ForeColor), textX, textY)
Case MouseAction.MouseOver
MyBrush = New LinearGradientBrush(MyRect, MyHoverColorA, _
MyHoverColorB, mode)
Select Case MyButtonStyle
Case ButtonStyles.Rectangle
e.Graphics.FillRectangle(MyBrush, MyRect)
e.Graphics.DrawRectangle(New Pen(MyHoverBorderColor, 2), MyRect)
Exit Select
Case ButtonStyles.Ellipse
e.Graphics.FillEllipse(MyBrush, MyRect)
e.Graphics.DrawEllipse(New Pen(MyHoverBorderColor, 2), MyRect)
Exit Select
End Select
e.Graphics.DrawString(Me.Text, MyBase.Font, New SolidBrush _
(MyBase.ForeColor), textX, textY)
Exit Select
Case MouseAction.Clicked
MyBrush = New LinearGradientBrush(MyRect, MyClickedColorA, _
MyClickedColorB, mode)
Select Case MyButtonStyle
Case ButtonStyles.Rectangle
e.Graphics.FillRectangle(MyBrush, MyRect)
e.Graphics.DrawRectangle(New Pen(MyClickedBorderColor, 1), MyRect)
Exit Select
Case ButtonStyles.Ellipse
e.Graphics.FillEllipse(MyBrush, MyRect)
e.Graphics.DrawEllipse(New Pen(MyClickedBorderColor, 1), MyRect)
Exit Select
End Select
e.Graphics.DrawString(Me.Text, MyBase.Font, New SolidBrush _
(MyBase.ForeColor), textX + 1, textY + 1)
Exit Select
End Select
Else
MyBrush = New LinearGradientBrush(MyRect, MyNormalColorA, _
MyNormalColorB, mode)
Select Case MyButtonStyle
Case ButtonStyles.Rectangle
e.Graphics.FillRectangle(MyBrush, MyRect)
e.Graphics.DrawRectangle(New Pen(MyNormalBorderColor, 1), MyRect)
Exit Select
Case ButtonStyles.Ellipse
e.Graphics.FillEllipse(MyBrush, MyRect)
e.Graphics.DrawEllipse(New Pen(MyNormalBorderColor, 1), MyRect)
Exit Select
End Select
e.Graphics.DrawString(Me.Text, MyBase.Font, New SolidBrush _
(MyNormalColorA), textX, textY)
End If
End Sub
طبعا Select Case هذة واضحة وضوحا شديدا بالإضافة إلى أنها نالت نصيب الأسد من الشرح مسبقا وهى هنا كما نرى قائمة على الخصائص التى قمنا بإنشاءها ويمكن استنتاجها بسهولة من الأكواد السابقة
SmoothCriminal
24-01-2008, 03:18 AM
سادسا الماوس
Protected Overloads Overrides Sub OnClick _
(ByVal e As System.EventArgs)
If MyActiveState Then
If MyMouseAction = MouseAction.Clicked Then
MyBase.OnClick(e)
End If
End If
End Sub
End Class
عندما تبداء بالضغط على الزر
Protected Overloads Overrides Sub OnMouseEnter _
(ByVal e As System.EventArgs)
If MyActiveState Then
MyMouseAction = MouseAction.MouseOver
Me.Invalidate()
MyBase.OnMouseEnter(e)
End If
End Sub
أثناء الضغط
Protected Overloads Overrides Sub OnMouseDown _
(ByVal e As System.Windows.Forms.MouseEventArgs)
If MyActiveState Then
MyMouseAction = MouseAction.Clicked
Me.Invalidate()
MyBase.OnMouseDown(e)
End If
End Sub
أثناء الضغط إلى الداخل يعنى عندما يغطس الزر بتأثير الماوس
Protected Overloads Overrides Sub OnMouseUp _
(ByVal e As System.Windows.Forms.MouseEventArgs)
If MyActiveState Then
MyMouseAction = MouseAction.MouseOver
Me.Invalidate()
MyBase.OnMouseUp(e)
End If
End Sub
عندما تبداء برفع الماوس من على الزر ويبداء فى العودة إلى وضعة الطبيعى
Protected Overloads Overrides Sub OnMouseLeave _
(ByVal e As System.EventArgs)
If MyActiveState Then
MyMouseAction = MouseAction.Normal
Me.Invalidate()
MyBase.OnMouseLeave(e)
End If
End Sub
بعد أن ترفع الماوس من على الزر يجب أن تعود الأوضاع إلى ما كانت علية قبل بداء الضغط ويجب أن تلاحظ أن كافة الأوضاع هذة تتم فى الحالة Active=True
أسف جدا نسيت أقولكم على جزء مهم جدا فى الكود بل هو أهم جزء على الإطلاق وهو
End Class
End Namespace
ورابط تحميل المشروع
http://www.zshare.net/download/68195065e87ed4/ (http://www.zshare.net/download/68195065e87ed4/)
وإلى لقاء آخر بإذن الله
وتصبحون على خير
SmoothCriminal
24-01-2008, 03:30 AM
جزاك الله كل خير ... ووفقك لما يحب ويرضى .... موضوع جبار ...
أهلا بالعزيز الغالى أشكرك من أعماق قلبى على تشريفك الدائم لموضوعاتى بارك الله فيك ووفقك