क्लाइंट विंडो फिर से बनाएं


मैं क्लाइंट क्षेत्र में एक बटन क्लिक करने और क्लाइंट क्षेत्र को फिर से तैयार करने में सक्षम होना चाहता हूं।
मेरा मुख्य मुद्दा यह है कि मैं इसे ठीक से काम नहीं कर पा रहा हूँ।
बटन दबाने के बाद मुझे जो मिलता है वह टिमटिमाता है।

मैंने क्या प्रयास किया है:

मैंने कोशिश की।

सी++
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 ने उल्लेख किया है, आपको अपने OnDraw हैंडलर के अंदर InvalidateRect कॉल की आवश्यकता नहीं है। आप इसे इस तरह से करते हुए अपने आप को एक अंतहीन चक्र के लिए तैयार कर रहे हैं। कम से कम, लूपिंग को रोकने के लिए क्लिक को गलत पर सेट करें।

झिलमिलाहट का कारण अमान्य() को कॉल करना है क्योंकि इसमें एक डिफ़ॉल्ट तर्क है, मिटाएं, सत्य पर सेट है जिसका अर्थ है कि यह पूरी विंडो मिटा देता है। इसके कारण OnEraseBkgnd को कॉल किया जाता है जो पूरी विंडो को पृष्ठभूमि रंग से भर देता है और फिर OnDraw विधि को कॉल किया जाता है। इन सबका परिणाम झिलमिलाहट है।

झिलमिलाहट से बचने के (कम से कम) दो संभावित तरीके हैं। पहला है इनवैलिडेट को कॉल करना और उसे गलत पास करना ताकि यह पृष्ठभूमि को न मिटाए। यह केवल तभी काम करेगा जब आपकी ऑनड्रा विधि पूरी तरह से सभी अग्रभूमि छवि खींचती है और वे आमतौर पर ऐसा नहीं करते हैं। दूसरा तरीका मेमोरी डिवाइस संदर्भ में आकर्षित करना है। इसमें मदद के लिए एमएफसी के पास सीएमईएमडीसी नामक एक अंतर्निहित क्लास है। यहां कीथ रूल द्वारा मेमोरी डीसी के सरल कार्यान्वयन के साथ लिखा गया एक लेख भी है जो बहुत अच्छी तरह से काम करता है। इसके लिए आपके ऑनड्रॉ हैंडलर को पृष्ठभूमि भी बनानी होगी और आप एक ऑनएरेज़बीकेजीएनडी हैंडलर रखना चाहते हैं जो केवल यह इंगित करने के लिए TRUE लौटाता है कि यह खींचा गया था लेकिन यह वास्तव में कुछ नहीं करता है।

समाधान 3

मुझे यूजर इंटरफ़ेस थ्रेड में मॉडललेस डायलॉग प्रदर्शित होने में समस्या आ रही है। क्रिएट के साथ सक्रियण पर संवाद किसी अन्य संवाद के साथ ओवरलैप्ड मोड प्रदर्शित कर रहा है। यहां तक ​​कि अगर मैं सिकुड़ता या विस्तारित होता हूं तो ओवरलैप्ड संवाद भी बढ़ता है। मैं इसका कैसे समाधान करूं

コメント

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