كيفية تجنب وميض أثناء التعامل مع WM_ERASEBKGND في الحوار ويندوز

StackOverflow https://stackoverflow.com/questions/164751

سؤال

ولدي الحوار الذي تغيير حجم. كما أن لديها خلفية مخصصة التي أرسم في استجابة لدعوة WM_ERASEBKGND (حاليا مكالمة بسيطة لFillSolidRect).

عند تغيير حجم الحوار، هناك الخفقان هائلا يحدث. في محاولة للحد من الخفقان I تعداد كافة الإطارات التابعة وإضافتها إلى منطقة لقطة. ويبدو أن يساعد قليلا - الآن الخفقان هو في الغالب واضحا في جميع عناصر التحكم التابعة لأنها إعادة رسم

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

وأود أن أشير إلى أنني أستخدم C ++ (لا .NET)، وMFC، على الرغم من حلول محض يستند إلى Win32 ورحب:)

ملحوظة: لم شيء واحد حاولت ولكنها لا تعمل (لست متأكدا لماذا) كان:

CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.FillSolidRect(rect, backgroundColor);

pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
هل كانت مفيدة؟

المحلول

وعلى افتراض أن "FillSolidRect" هو محو الخلفية الخاصة بك ثم إرجاع TRUE من WM_ERASEBKGND.

لقيام التخزين المؤقت المزدوج الذي تقومون به تقريبا في جزء التعليمات البرمجية الخاصة بك، فإنك سوف تحتاج إلى استخدام CreateCompatibleBitmap وحدد ذلك في memDC الخاص بك.

نصائح أخرى

وحاول إضافة السطر التالي إلى وظيفة OnInitDialog الخاص بك:

    ModifyStyle(0, WS_CLIPCHILDREN, 0);

لا تفعل شيئا في التعامل مع WM_ERASEBKGND والقيام محو كجزء من WM_PAINT الرئيسي. يمكنك إما طلاء أكثر ذكاء بحيث يمكنك إعادة رسم فقط المناطق غير صالحة أو أكثر بسهولة، انقر نقرا مزدوجا العازلة الرسم.

ومن خلال عدم القيام بأي شيء في الخلفية محو، لديك كل ما تبذلونه من قانون الرسم في مكان واحد والتي ينبغي أن تجعل من السهل للآخرين لمتابعة والحفاظ عليها.

إذا كنت تستهدف ويندوز إكس بي أو أعلى، يمكنك أيضا استخدام أسلوب WS_EX_COMPOSITED لتمكين مزدوج التخزين المؤقت بشكل افتراضي الإطارات ذات المستوى الأعلى مع هذا النمط. نضع في اعتبارنا هذا له مجموعة خاصة بها من القيود - على وجه التحديد، لا أكثر الرسم من دورات OnPaint باستخدام GetDC، الخ

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

والتخزين المؤقت المزدوج هو في الواقع الطريقة الوحيدة لجعل هذا العمل.

سوف

والضوابط الطفل الاعتناء بأنفسهم طالما عليك التأكد من CLIPCHILDREN.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top