الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

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

مغلق
بدأه SOLO.NET في 23 أكتوبر 2005 · 36 رد · 15,179 مشاهدة · في قسم الدروس والمواضيع المتميزة
مشاركة: واتساب X فيسبوك تيليجرام
#26
اقتباس
سيعتبر أول نقطة هي رأسه العلوي الأيسر و لذلك لن يقبل برسم المربع نحو الأعلى أو رسم مربع خلف النقطة الأولى..

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

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

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

لحل المشكلة قم بعمل اختبار لقيمة diffX فاذا كانت اقل من صفر اى سالبة يعنى المستخدم رجع بالموؤشر للخلف وعليها بنخلى نقطة الزاوية العليا اليسرى للمربع هى ال x,y وناخذ قيم diffXوdiffY بالقيم المطلقة كما تفضلتم وذلك بالداله Abs التابعة للفئة Math قم بتغيير الكود قبل رسم المستطيل بهذا

  Case 3

                    ' Draw a rectangle
if diffX <0 Thin

         curGraphics.DrawRectangle(curPen, X, Y,Math.Abs( diffX),Math.Abs

( diffY)) 
EndIf   
       curGraphics.DrawRectangle(curPen, curX, curY, diffX, diffY)

قم بكتابة نفس الكود مكان كل الاكواد المسؤلة عن رسم المستطيل

تم تعديل هذه المشاركة بواسطة SOLO.NET في 6 نوفمبر 2005 في 18:00

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#27

مقال للاخ رغيد الطيب (تلميحات لتحسين الاداء الرسومي)

وهو من موقع www.vb4arab.com على ما اعتقد

مقال جميل جدا احب انقله للفائده

بعد ان لمس معظمنا امكانيات الدوت نت في مجال الرسوميات بدأت بعض المعاناه من مشاكل الوميض المستمر للكائنات التي يتم اعادة رسمها بشكل سريع ... و هو ما كنا نتخلص منه في الإصدار السابق بواسطة الخاصية AutoRedraw و التي لم تعد موجودة ... تجد هنا فئة بسيطة تعيد لك هذة الخاصية من جديد ! لتستمع مع رسوميات بدون اي وميض او اهتزاز ..

لا يخفى على مجرب ان الامكانيات الرسومية في الـ Visual Basic .NET قد تحسنت كثيراً و اضيفت اليها امكانيات كبيرة ... وهذة الاضافات و الامكانيات اضافت شيئاً من التعقيد على الكيفية التي يتم فيها رسم الكائنات برمجياً ... فلم يعد بالامكان رسم خط مثلاً بواسطة الأمر Line فقط كما كان في السابق بل اصبح من الضروري انشاء قلم للرسم اولاً ( Pen ) او استخدام احد الاقلام الأفتراضية ( Pens ) ثم انشاء كائن رسم Graphics و بعد ذلك الرسم عليه باستخدام الطريقة DrawLine !

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

فانك ستلاحظ ان عملية الرسم هذه تظهر فيها شيئاً من الوميض اي انها تبدو مهزوزة نظراً لتكرار عملية الرسم و المسح لعدة مرات في الثانية ...

في الاصدار Visual Basic 6 كنا نستخدم الخاصية AutoRedraw كي نجعل الرسم يبدو مستقراً ... اما في الاصدار الجديد لم اعد ارى ان هذه الخاصية متوفرة على الرغم من اهميتها ! ...

لهذا قمت بتصميم فئة بسيطة Class بإسم myGraphicsBuffer ...

يمكنك بسهولة ان تعرف من إسم هذة الفئة انها تعمل كمخزن (Buffer) مؤقت لعملية الرسم بحيث يتم رسم الكائنات عليها ثم بعد ذلك عكس النتائج للمستخدم ....

خذ مثلاً اذا اردت رسم دائرة مملوئة باللون الاحمر على الفورم فانك سوف تكتب التالي :

Dim g As Graphics

g = Me.CreateGraphics

g.FillEllipse(Brushes.Red, 20, 20, 30, 30)
g.DrawEllipse(Pens.Black, 20, 20, 30, 30)

حيث انشئنا اولاً كائن من النوع Graphics تابع للفورم (Me) للرسم عليه ثم قمنا بملئ مساحة معينة من الفورم تبدأ عن النقطة (20,20) بفرشاه حمراء اللون (Brushes.red) وبعد ذلك اخطنا هذه المساحة الدائرية بخط اسود اللون (Pens.Black) باستخدام الطريقة DrawEllipse الخاصة برسم الكائنات الدائرية ...

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

لكي نستخدم الفئة myGraphicsBuffer لنفس الغرض السابق نقوم بالتالي :

Dim g As myGraphicsBuffer

g = New myGraphicsBuffer(Me.CreateGraphics, Me.Width, Me.Height)

g.Graphics.FillEllipse(Brushes.Red, 20, 20, 30, 30)
g.Graphics.DrawEllipse(Pens.Black, 20, 20, 30, 30)

g.Flush()

حيث تم تعريف المتغير g بانه كائن من النوع myGraphicsBuffer يلي ذلك إنشاء نسخة جديدة منه بطول وعرض الفورم التي سيتم عليها الرسم ثم بعد ذلك القيام بالرسم بالطريقة العادية للكائن Graphics الذي اعتدنا عليه ... يبقى في الاخير ان نقوم بعكس الرسم على الفورم باستخدام الطريقة Flush ...

و الان سوف نتعمق قليلاً في الفئة الجديدة التي تحتوي على متغيرين من النوع Private هما :

Private mBitmap As Bitmap
Private mGrphic As Graphics

لاول سوف نستخدمه لإنشاء صورة Bitmap موقتة في الذاكرة للقيام بالرسم عليها و المتغير الثاني من النوع Graphics و الذي يمثل الكائن الاصلي ( هدف عملية الرسم ) الذي نريد الرسم عليه ..

يلي ذلك تعريف الخصائص التابفة لفئتنا الجديدة والتي تحتوي على ثلاثة خصائص كما في التالي :

Private pWidth As Integer
ReadOnly Property Width() As Integer
Get
Return pWidth
End Get
End Property

Private pHeight As Integer
ReadOnly Property Height() As Integer
Get
Return pHeight
End Get
End Property

Private pGraphics As Graphics
ReadOnly Property Graphics() As Graphics
Get
Return pGraphics
End Get
End Property

الخواص Height و Width هما لمعرفة عرض و ارتفاع الكائن الرسومي ..

بينما الخاصية Graphics فهي التي سيقوم المستخدم باستخدامها من خارج الفئة للرسم عليها كما يحلو له ( و جميع عمليات الرسم التي سيقوم بها لن تظهر مباشرة لانها تقوم بالرسم على الصورة mBitmap التي في الذاكرة الى ان يتم استدعاء الطريقة Flush ) ...

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

Sub New(ByVal g As Graphics, ByVal Width As Integer, ByVal Height As Integer)

pWidth = Width
pHeight = Height

mGrphic = g
mBitmap = New Bitmap(Width, Height, mGrphic)
pGraphics = Graphics.FromImage(mBitmap)

End Sub

لاحط انه في البداية يتم تخزين الطول و العرض في متغيرات خاصة داخل الفئة هما pWidth و pHeight اختصاراً لـ Private Width و Private Height ...

يلي ذلك ايضاً تخزين الكائن الذي نريد الرسم عليه في المتغير mGraphic الذي عرفناه في البداية ..

وبعدها نقوم بانشاء صورة جديدة New Bitamp في الذاكر بطول وعرض منقطة الرسم ومتوافقة مع الكائن الذي نريد الرسم عليه mGrphic ...

ولاننا نريد ان نقوم بالرسم على هذة الصورة .. فاننا ننشىء كائن للرسم Graphics يعتمد على الصورة التي في الذاكرة ونخزنه في المتغير pGraphics ...

و الان اذا قام المستخدم من خاج الفئة بالرسم على الكائن pGraphics فان عملية الرسم هذة سوف تتم الصورة التي في الذاكرة mBitmap و ليس على منقظة الرسم مباشرة mGrphic وهذا هو سبب عدم ظهور الرسومات مباشرة ...

وبعد ان يقوم المستخدم بانها عملية الرسم كلها على الـ mBitmap يمكنه ان يعكس هذة الرسومات على منطقة الرسم الاصلية باستخدام الطريقة Flush كالتالي :

Sub Flush()
mGrphic.DrawImage(mBitmap, 0, 0)
End Sub

ووظيفتها فقط هي رسم الصورة التي في الذاكرة mBitmap على منطقة الرسم mGrphic مباشرة ..

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

و لكن باستخدام الفئة تتم كل عميات الرسم على كائن وجود في الذاكرة هو mBitmap و بالتالي لا يرى المستخدم منه شيء وبعد انتهاء الـ 300 عملية رسم يتم فقط عكس الناتج على الفورم باستخدام Flush وبالتالي فان المستخدم هنا لايرى إلا عملية رسم واحدة و هنا بيت قصيد ...

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

شفرة الفئة كاملة هي :

Public Class myGraphicsBuffer
Private mBitmap As Bitmap
Private mGrphic As Graphics

Private pWidth As Integer
ReadOnly Property Width() As Integer
Get
Return pWidth
End Get
End Property

Private pHeight As Integer
ReadOnly Property Height() As Integer
Get
Return pHeight
End Get
End Property

Private pGraphics As Graphics
ReadOnly Property Graphics() As Graphics
Get
Return pGraphics
End Get
End Property

Sub New(ByVal g As Graphics, ByVal Width As Integer, ByVal Height As Integer)

pWidth = Width
pHeight = Height

mGrphic = g
mBitmap = New Bitmap(Width, Height, mGrphic)
pGraphics = Graphics.FromImage(mBitmap)

End Sub

Sub Flush()
mGrphic.DrawImage(mBitmap, 0, 0)
End Sub

Sub Dispose()
mBitmap.Dispose()
mGrphic.Dispose()
End Sub

Protected Overrides Sub Finalize()
Me.Dispose()
MyBase.Finalize()
End Sub
End Class

تم تعديل هذه المشاركة بواسطة SOLO.NET في 9 نوفمبر 2005 في 19:49

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#28

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

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

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

وهذا رابط المقال سابق الذكر مع الملفات المرفقة كمثال :

http://www.dev4arabs.com/vb/ShowRecord.asp...=Article&Id=862

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

مواضيع برمجية تقنية جديدة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج للبحث في الملفات ومحتواياتها (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

مواضيع برمجية تقنية قديمة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

#29

اخى العزيز رغيد الطيب

شرفت الموضوع بزيارتك له وقله قليلة من هم مهتمين بمواضيع الرسم

ومشكور على الرابط جزاك الل خيرا

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#30

اهلا و سهلا بكم..

أنا حاليا سأتغاضى عن موضوع الرسمو بسبب الدراسة مع العودة له لاحقا بشكل معمق جدا :lol:

#31

مجهود تستحق الثناء عليه

"إن الذين آمنوا وعملوا الصالحات كانت لهم جنات الفردوس نزلا"

#32

ماشاء الله عليك اخوي SOLO.NET

صراحه عكفت على امثلتك التي وضعتها في هذا الموضوع

وكل يوم اطلع عليها وكل مره استفيد معلومه

واقولك انك استاذ متمكن اسال الله ان يزيدك علما ويخليك لنا ذخر

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

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#33

شكراً لك فعلاً موضوع مهم و شرح جميل

ولكن أتمنى عليك أن تتطرق لموضوع رسم مستطيل دائري الحواف

لقد حاولت كثيراً و لم أجد طريقة لهذا الموضوع

أرجو الرد ممن يعرف شيء حول هذا الموضوع

#34

جزاك الله كل خير اخ SOLO.NET

ممكن سوال كيف لي ان اعرف مكان صوره صغير في اخري كبير اجاد مكنها

جزاك الله كل الخير

#35

up

#36

اخى KARIMSOFT لو كان سؤالك موجه لى فانا لا اعرف

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#37

آخ خخخخخخخخخخخخخخخخخخخخخخخخ ..

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

أنا كنت أتابع السلسلة باهتمام ..

و أتمنى عليك أن تكملها حتى آخرها .. فأنت جدير بإكمالها :)

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

هذا الموضوع مغلق.

مواضيع مشابهة