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

كيف أجعل النافذة AutoRedraw?

مغلق
بدأه الكـتـكوت في 1 فبراير 2005 · 8 رد · 624 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

المستخدم بتصغير النافذة وتكبيرها مرة أخرى أن تعود كما كانت دون أن يمسح شيئ؟

#2

الكـتـكوت: السلام عليكم ورحمة الله وبركاته :D .

أظن أنك استعملت C++Builder!!.

مثال:

void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
Form1->Canvas->Ellipse(X-20,Y-20,X+20,Y+20);
}

قمت بالرسم مباشرة على Form , دوائر مركزها هو مكان النقر بالفأرة, و ذلك استجابة لحدث OnMouseDown.

يبدو أن هذا البرنامج يعمل جيدا, لكن ليس كذلك.

فإنك كلما قمت بتغطية جزء من Form ببرنامج آخلر, أو عندما تصغره ثم تعيد تكبيرها : ترى أن كل الرسوم التي قمت بها قد مسحت بأكملها( عند التصغير و التكبير) أو بعضها ( الدوائر التي كانت محجوبة بنافذة أخرى) :wacko: .

لمعرفة السبب: هذا الرسم المباشر على Form لا يعتمده النظام ويندوز . فويندوز يقوم بإعادة رسم الفورم استجابة للحدث OnPaint. يعني كلما استدعى الأمر إعادة رسم Form ( تكبير بعد تصغير, منطقة من الفورم كانت محجوبة ب نافذة أخرى...) فإن مهمة رسمها توكل للدالة Onpaint.

فيجب عليك رسم كل ما تريد في هذه الدالة و ليس في غيرها.

إذا كنت تستخدم كوبيلر آخر يعتمد مباشرة على دوالAPI فيجب أن تبحث في الكود عن الدالة التي تدير ال Messages الواردة على التطبيق, ثم تكتب كل الأوامر التي تريد في المكان المخصص لمعالجة WM_PAINT Message :

LRESULT CALLBACK WndProc( HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam )
{
  switch(  Message)
  {
   case WM_PAINT:
      // to do for painting your form
      ...
      break;

   case WM_CLOSE:
       DestroyWindows(hwnd);
       break;
   case WM_DESTROY:
   ......
}

(h)

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#3

مشكور أخوي ikossan على الرد ولكن ألا يوجد طريقة أخرى غير وضع الكود استجابة لرسالة WM_PAINT لأني أريد أن يقوم المستخدم بإدخال بعض المعلومات في WM_CHAR ثم يتم تلوينها حسب ما أدخله ولا أستطيع رسمها مرة أخرى.

#4

ليس لها حل سوى أن تسجل كل ما يدخله المستخدم في مصفوفة ( Tlist مثلا في c++builder) ثم في WM_Paint ترسم كل عنصر تم تسجيله في هذه المصفوفة (tlist) .

و الله أعلم هنا توقف علمي (h)

;)

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#5

أخوي أنا أستعمل Microsoft Visual C++ وماذا تقصد ب TList?

#6

ماشاء الله على Ikosan يعرف الكثير , لكن الحل مع Visual c++ أسهل بكثير :) دعاية للفيجوال سي++ :)

فقط إكنتب كود الرسم في دالة تنشئها من WM_PAINT :

وفي الجزء else الأخير إكتب كود الرسم , ومع تحريك الشاشة أو أي نوع من الحركة , سيتم إعادة الرسم بشكل مباشرة .

وإن أردت أن يتم إعادة الرسم بشكل إجباري بعد الضغط على زر مثلا أو فعل حركة معينة , إكتب في كود الزر :

Invalidate();

أو

InvalidateRect(RECT);

حيث RECT أبعاد المربع الذي سيرسم من جديد .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#7

HGB:الظاهر أني عكيت :unsure: ..

أنا وجدت منتدى سي ++ فاضي , قلت أكون خبير B) و أجيب على أسئلة الإخوة ..

باين لي أرجع لمنتدى Delphi عند أخي عروة ,فهي أسلم.

فأنا هاوى ديلفي في الأصل, و أردت مؤخرا البدأ في سي ++. و قلت أفضل شيء هو C++builder X. و إن أردت المرور بسرعة من كود ديلفي ل كود ب سي ++ ف C++builder 6.0 أفضل بيئة تطوير, فهي مبنية بالأساس على مكتبة VCL , نفسها التي يستعملها ديلفي... :D .

إيه رأيك فيه أمل!! :blink:

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#8

في أمل ونص !!

معقولة بس يا إيكوسان :) أي شيء ممكن بالعزيمة والإرادة , ولو فعلا إنت متقن للديلفي فمن الأسلم فعلا أن تظل على البورلاند ,

لكن إبتعد عن الفيجوال سي++ ولاتضيع وقتك فيها "نصيحة" لأن في حالتك من الأفضل تنتقل للدوت نت أفضل وأسرع .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#9

ألف شكر أستاذي HGB على ردك الرائع أنا بأجرب الكود وأرد لك إن شاء الله.

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

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