2010-08-11 6 views
17

मैं एक संवाद, im उपयोग नहीं कर रहा है, जिसमें मैं पंजीकृत किया है और उसके बाद CreateWindow कॉल का इस्तेमाल किया उसे बनाने के लिए अपने खुद के कस्टम वर्ग का उपयोग कर, मैं जब दर्ज की लाल करने के लिए पृष्ठभूमि रंग पूर्व निर्धारित है:इसे पंजीकृत करने के बाद विंडो के पृष्ठभूमि रंग को कैसे सेट करें?

WNDCLASSEX wc; 
wc.hbrBackground = CreateSolidBrush(RGB(255, 0, 0)); 

लेकिन अब मैं उदाहरण के द्वारा रनटाइम पर पृष्ठभूमि रंग बदलना चाहते हैं इसे नीले रंग में बदलने के लिए बटन पर क्लिक करना।

मैंने WM_PAINT में SetBkColor() कॉल का उपयोग करने का प्रयास किया है, और WM_CTLCOLORDLG संदेश से ब्रश लौटने का प्रयास किया है, वे काम नहीं करते हैं।

कोई मदद?

उत्तर

17

Window Background से आता है:

... सिस्टम में कोई खिड़की के लिए पृष्ठभूमि पेंट या खिड़की तक ऐसा करने के लिए अवसर देता है इसे WM_ERASEBKGND संदेश भेजते समय एप्लिकेशन BeginPaint को कॉल करता है। एक आवेदन संदेश संसाधित नहीं है, तो लेकिन DefWindowProc को पास कर देता है, सिस्टम पृष्ठभूमि ब्रश खिड़की के वर्ग द्वारा निर्दिष्ट पैटर्न के साथ यह भरने .....

द्वारा पृष्ठभूमि मिटा देता है .. .... कक्षा पृष्ठभूमि ब्रश परिभाषित किया गया है, भले ही कोई एप्लिकेशन WM_ERASEBKGND संदेश को संसाधित कर सकता है। यह अनुप्रयोगों में विशिष्ट है कि उपयोगकर्ता को निर्दिष्ट विंडो में कक्षा में अन्य विंडो को प्रभावित किए बिना विंडो को बदलने के लिए सक्षम बनाता है। ऐसे मामलों में, एप्लिकेशन को को DefWindowProc को संदेश पास नहीं करना चाहिए। .....

तो, डीसी प्राप्त करने और पृष्ठभूमि को पेंट करने के लिए WM_ERASEBKGND संदेश के wParam का उपयोग करें।

+0

मैं यह कोशिश करूंगा, धन्यवाद – Kaije

+0

हाँ, यह काम किया। मैंने इस संदेश को संभाला और मेरी पृष्ठभूमि को पेंट करने के लिए FillRect() कॉल का उपयोग किया – Kaije

+0

मैं विंडोज सी ++ के लिए थोड़ा नया हूं। यहां 'डीसी' से आपका क्या मतलब है? –

10

आप निम्न कोशिश कर सकते हैं:

HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255)); 
    SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG)brush); 
+0

जो उस वर्ग के सभी उदाहरणों के लिए इसे बदलता है। इसे विंडो को अमान्य करने और पुनर्निर्मित करने के लिए आपको अमान्य करने की भी आवश्यकता होगी। –

+0

हाँ, यह काम करता है, लेकिन मेरे पास अपना खुद का क्लास रैपर है और मैं पंजीकरण के बाद इसे सेट करना चाहता हूं क्योंकि मैं एक ही कक्षा के विंडोज़ को अलग-अलग पृष्ठभूमि रंगों के लिए चाहता हूं – Kaije

+0

डब्ल्यूटीएल में एक आकर्षण की तरह काम करता है! – sailfish009

4

संक्षिप्त उत्तर: हैंडल WM_ERASEBKGND

लंबे समय तक जवाब:

जब आप WNDCLASS रजिस्टर, तो आप उस वर्ग के सभी खिड़कियों के बारे में जानकारी प्रदान कर रहे हैं। तो यदि आप विंडो के केवल एक उदाहरण के रंग को बदलना चाहते हैं, तो आपको इसे स्वयं संभालना होगा।

जब आपकी खिड़की को पुनर्जीवित करने का समय हो, तो सिस्टम आपके wndproc को WM_ERASEBKGND संदेश भेज देगा। यदि आप इसे संभाल नहीं पाते हैं, तो DefWindowProc क्लाइंट क्षेत्र को विंडो क्लास से रंग के साथ मिट जाएगा। लेकिन आप सीधे संदेश को संभाल सकते हैं, जो भी रंग आपको पसंद करते हैं (या पृष्ठभूमि पैटर्न)।

संबंधित मुद्दे