الشبكة العربية لمطوري الألعاب

موهوب  ياسر أبوبكر مشاركة 1

كيف يمكن رسم أشكل بسيطة ( مستقيم أو دائرة مثلا ) داخل PictureBox ! ؟
 
أعرف أنه سؤال بدائي ولكن!
 
المهم : أريد أمثلة إذا سمحتم

محترف مشرف عبد اللطيف حاجي علي مشاركة 2

قم بإضافة Handler للـ Event المسماة Paint ثم قم في ذلك الـ Handler بوضع كود الرسم باستخدام DrawLine أو DrawEllipse حسب المطلوب.
 
التالي مثال مبسط غير مجرب (مأخوذ من MSDN بتصرف) على ما سبق.
 

pictureBox1.Paint += new PaintEventHandler(MyPaint);
 
// Later
public void MyPaint(Object sender, PaintEventArgs e)
{
	// You can save some objects here instead of creating them each time
	// Create pen.
	Pen blackPen = new Pen(Color.Black, 3);
    
	// Create rectangle for ellipse.
	Rectangle rect = new Rectangle(0, 0, 200, 100);
	e.Graphics.DrawLine(blackPen, 0,0,100,100);   
	// Draw ellipse to screen.
	e.Graphics.DrawEllipse(blackPen, rect);
 
	// You can also use FillEllipse in a similar way

}
 

عبد اللطيف حاجي علي
مبرمج
In|Framez

موهوب  ياسر أبوبكر مشاركة 3

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

خبير  أحمد عبد الغني مشاركة 4

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

مين قدك يا ++C ؟

موهوب  ياسر أبوبكر مشاركة 5

أما في 24/ربيع الأول/1429 12:41 م، فقد تنهد أحمد عبد الغني بارتياح وهو يرد:

فأي الحلول تريد؟
 
شكرا سيد أحمد لتفاعلك معي وقد تم حل هذه المشكل ... ولكن !
 
طرأت مشكلة خرى غير متوقعة (إلى حد ما!) وهي أن الشكل في حال تحريك الإطار يتشوه أو يقص منه أجزاء أو لايظهر بالمرة! ... لماذا !

أعتقد أنه يجب إعادة رسم الشكل في كل مرة يطرأ حدث على إطار الرسم ولكن كيف ؟!

محترف مشرف عبد اللطيف حاجي علي مشاركة 6

بتاريخ 01 نيسان 2008 01:15 م، قطب ياسر أبوبكر حاجبيه بشدة وهو يقول:

طرأت مشكلة خرى غير متوقعة (إلى حد ما!) وهي أن الشكل في حال تحريك الإطار يتشوه أو يقص منه أجزاء أو لايظهر بالمرة! ... لماذا !

أعتقد أنه يجب إعادة رسم الشكل في كل مرة يطرأ حدث على إطار الرسم ولكن كيف ؟!

إن كنت قد قمت بإضافة Handler للـ Paint Event كما ذكرت في ردي وقمت بالرسم داخل هذا الإجراء فقط وباستخدام e.Graphics فلن تواجهك هذه لأن الرسم يعاد كلما دعت الحاجة لذلك (كتحرييك الإطار)

عبد اللطيف حاجي علي
مبرمج
In|Framez

موهوب  ياسر أبوبكر مشاركة 7

في 25/ربيع الأول/1429 09:50 ص، قال عبد اللطيف حاجي علي بهدوء وتؤدة:

فلن تواجهك هذه لأن الرسم يعاد كلما دعت الحاجة لذلك (كتحرييك الإطار)

هل أنت متأكد؟!
 
أنظر ماذا حدث
 
ملاحظة من أجل حقوق الطبع! : هذا البرنامج قام بكتابته أحد الربع* وفي هذه الصورة يقوم برسم شجرة ثنائية و... ولكن بغض النظر عن ما يقوم به
 
قبل :


 قمت في الصورة الثانية بالتدحرج نحو اليمين واليسار وإلى أسفل وأعلى
 
فهذا ماحصلت عليه

بعد:




إذا ماذا حدث؟!
؟؟!
 
 
عذرا على حجم الصورة
 
 
الربع*: أي أحد الشباب من الي بعرفهم!

محترف مشرف عبد اللطيف حاجي علي مشاركة 8

في 01 نيسان 2008 05:46 م، عقد ياسر أبوبكر حاجبيه بتفكير وقال:

هل أنت متأكد؟!
 
أنظر ماذا حدث
حاول التالي: بعد التشوه الذي حصل قم بتصغير النافذة و تكبيرها و أخبرنا بما يحصل. وتذكر إن وضع كود الرسم سيساعد الأعضاء (وأنا منهم) على فهم المشكلة واقتراح حلول مناسبة.
 

وفي 01 نيسان 2008 05:46 م، قال ياسر أبوبكر متحمساً:

عذرا على حجم الصورة

لا أعتقد أن هناك مشكلة. لكن لأخذ العلم كان بامكانك ضغط Alt+PrintScreen لأخذ نسخة عن النافذة المحددة بدلاً عن كامل سطح المكتب.

عبد اللطيف حاجي علي
مبرمج
In|Framez

خبير مدير وسام البهنسي مشاركة 9

من الصورة الثانية يبدو لي أن هناك خطأ في خوارزمية الرسم نفسها، وليس في طريقة الإظهار. اقتراحي هو:
 
تأكد من أن عدد الخطوط الواصلة بين العقد ثابت بين نداءات الرسم المختلفة للحدث OnPaint. يبدو لي كأن الخطوط تتراكم عند كل نداء OnPaint، وقد يكون هذا خطأ في خوارزمية توليد هذه الخطوط.
 
ولو ترسل الكود قد نستطيع أيضاً مساعدتك أكثر في إيجاد المشكلة.
 
تحياتي

وسام البهنسي
مبرمج في يونيتي وإنفريمز

موهوب  ياسر أبوبكر مشاركة 10

في 25/ربيع الأول/1429 11:57 ص، غمغم عبد اللطيف حاجي علي باستغراب قائلاً:

حاول التالي: بعد التشوه الذي حصل قم بتصغير النافذة و تكبيرها و أخبرنا بما يحصل

المشكلة مازالت قائمة!
 




بتاريخ 25/ربيع الأول/1429 11:57 ص، قطب عبد اللطيف حاجي علي حاجبيه بشدة وهو يقول:

وتذكر إن وضع كود الرسم سيساعد الأعضاء (وأنا منهم) على فهم المشكلة واقتراح حلول مناسبة.
 



for
 (int i = 0; i < node_count; 
i++) 
 

if 
(Convert.ToInt16(dataGridViewtree.Rows[i].Cells[6].Value) == 1) // المستوى الاول{ 
g.DrawEllipse(
Pens.Red, 50 * c, 50, 20, 20); //(X,Y,WIDTH,HEIGHT)g.DrawString(dataGridViewtree.Rows[i].Cells[3].Value.ToString(), 
newFont("Arial", 15), System.Drawing.Brushes.Blue, newPoint(55 + x, 55));g.DrawString(dataGridViewtree.Rows[i].Cells[1].Value.ToString(), 
newFont("Arial", 8), System.Drawing.Brushes.Blue, newPoint(35 + x, 20));g.DrawString(dataGridViewtree.Rows[i].Cells[5].Value.ToString(), 
newFont("Arial", 8), System.Drawing.Brushes.Blue, newPoint(75 + x, 20));g.DrawLine(System.Drawing.
Pens.Red, 60 + x, 50, 40 + x, 30);g.DrawLine(System.Drawing.
Pens.Red, 60 + x, 50, 80 + x, 30);
 
 
هذا جزء من الكود ويتعلق بالرسم (وهو غير كامل)