إعادة رسم نافذة العميل


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

ما حاولت:

لقد حاولت.

سي ++
void CButtonTestView::OnButtonClicked()
{
	AfxMessageBox(L"Button clicked");
	Clicked = TRUE;
	Invalidate();
	UpdateWindow();
}

void CButtonTestView::OnDraw(CDC* pDC)
{
	CButtonTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;
	// TODO: add draw code for native data here
	pDC->TextOutW(800, 100, _T("Button test"));

	if (Clicked)
	{
		InvalidateRect(nullptr, TRUE);
	}
}

الاستوديو البصري 2017.
هو موضع تقدير أي مساهمة

الحل 1

بقدر ما أعرف لا ينبغي عليك الاتصال InvalidateRect داخل OnDraw لأنه في النهاية يتم إعادة الجدولة OnDraw مرة أخرى.

الحل 2

ذكر CPallini أنك لا تحتاج إلى استدعاء InvalidateRect داخل معالج OnDraw الخاص بك. أنت تقوم بإعداد نفسك لحلقة لا نهاية لها من خلال القيام بذلك بهذه الطريقة. على أقل تقدير، قم بتعيين النقر على خطأ لإيقاف التكرار.

سبب الوميض هو استدعاء Invalidate() لأنه يحتوي على وسيطة افتراضية، وهيمحو، وتم ضبطها على صواب مما يعني أنها تمحو النافذة بأكملها. يؤدي ذلك إلى استدعاء OnEraseBkgnd الذي يملأ النافذة بأكملها بلون الخلفية ومن ثم يتم استدعاء أسلوب OnDraw. كل هذا يؤدي إلى وميض.

هناك (على الأقل) طريقتان ممكنتان لتجنب الوميض. أحدهما هو استدعاء Invalidate وتمرير خطأ إليه حتى لا يمحو الخلفية. لن ينجح ذلك إلا إذا كانت طريقة OnDraw الخاصة بك ترسم كل الصورة الأمامية بالكامل وهي لا تفعل ذلك عادةً. هناك طريقة أخرى وهي الرسم في سياق جهاز الذاكرة. يحتوي MFC على فئة مضمنة تسمى CMemDC للمساعدة في ذلك. يوجد أيضًا مقال كتبه Keith Rule هنا مع تطبيق بسيط لذاكرة DC التي تعمل بشكل جيد جدًا. لهذا، يجب على معالج OnDraw الخاص بك أيضًا رسم الخلفية وتريد أن يكون لديك معالج OnEraseBkgnd الذي يقوم فقط بإرجاع TRUE للإشارة إلى أنه تم رسمه ولكنه في الواقع لا يفعل شيئًا.

الحل 3

أواجه مشكلة في ظهور مربع الحوار Modless في مؤشر ترابط واجهة المستخدم. يعرض مربع الحوار الخاص بالتنشيط باستخدام “إنشاء” الوضع المتراكب مع مربع حوار آخر. حتى لو قمت بتقليص أو توسيع مربع الحوار المتراكب ينمو أيضًا. كيف احل هذا الامر

コメント

タイトルとURLをコピーしました