2015-01-01 6 views
5

enter image description here मैं ES_READONLY ध्वज वाले संपादन नियंत्रण के रंग को बदलने के लिए एक सरल समाधान खोजने का प्रयास कर रहा हूं। मेरे पास कोड (सॉर्ट) काम करता है जब संपादन नियंत्रण संपादन योग्य होता है, हालांकि मेरे संपादन नियंत्रण पर इसका कोई प्रभाव नहीं पड़ता है जिसमें केवल ध्वज पढ़ा जाता है।क्या केवल पढ़ने के लिए पृष्ठभूमि रंग को बदलना संभव है

case WM_CTLCOLOREDIT: 
{ 
    HDC hdc = (HDC)wParam; 
    //if (GetDlgItem(hwnd, IDC_EDIT_IN) == (HWND)lParam) 
    //{ 
     SetTextColor(hdc, RGB(255, 255, 255)); // Set text color to white 
     SetBkColor(hdc, RGB(255, 255, 255)); // Set background color to black 
    //} 
    return 0; 
} 
break; 

मेरे पास यह जांचने के लिए सिर्फ टिप्पणी है कि मेरा कोड काम करता है या नहीं, और यह संपादन नियंत्रण पर करता है जो केवल पढ़ा नहीं जाता है। अगर मैं अपने अन्य संपादन नियंत्रण पर ES_READONLY लेता हूं, तो यह इस पर काम करता है। मैं एक चैट प्रोग्राम बना रहा हूं और नहीं चाहता कि उपयोगकर्ता चैटबॉक्स क्षेत्र में टाइप कर सके। और जब इसे केवल पढ़ा जाता है, तो यह इसे भूरे रंग के आइस रंग बनाता है, लेकिन मुझे एक सफेद रंग चाहिए। क्या इसे करने का और कोई तरीका है? इसके अलावा रंग केवल उस क्षेत्र को रंग देता है जहां पाठ है, संपादन नियंत्रण की पूरी ऊंचाई नहीं। मैं क्या गलत कर रहा हूं?

+2

मुझे सलाह है कि आप 'WM_CTLCOLORSTATIC' –

+2

देखें एमएसडीएन आलेख पढ़ें, यह आपको ब्रश वापस करने के लिए कहता है। –

उत्तर

5

आपको ब्रश बनाने और उसका ट्रैक रखने की आवश्यकता है। फिर आप अपने कोड स्निपेट में return 0 के बजाय इस ब्रश को वापस कर देते हैं। एक बार ब्रश की आवश्यकता नहीं होने पर आपको इसे हटाना होगा। यह आमतौर पर WM_DESTROY संदेश के जवाब में किया जाता है।

अपने मामले में आप स्टॉक ब्रश का उपयोग कर बुलेट को चकमा दे सकते हैं, जो मैं सुझाता हूं।

केवल पढ़ने के लिए मोड में, संपादित करें नियंत्रण WM_CTLCOLOREDIT के बजाय WM_CTLCOLORSTATIC का जवाब है, तो आप ठीक ढंग से इस संदेश को संभाल करना होगा:

case WM_CTLCOLORSTATIC: 
{ 
    if((HWND)lParam == GetDlgItem(hwnd, IDC_EDIT_IN)) 
    { 
     SetBkMode((HDC)wParam, TRANSPARENT); 
     SetTextColor(hdc, RGB(255, 255, 255)); 
     return (LRESULT)((HBRUSH)GetStockObject(BLACK_BRUSH)); 
     // if edit control is in dialog procedure change LRESULT to INT_PTR 
    } 
    else // this is some other static control, do not touch it!! 
     return DefWindowProc(hwnd, message, wParam, lParam); 
} 

पेंटिंग जब संपादित करें/स्थिर नियंत्रण, आप चित्र के लिए 3 उपलब्ध भाग होते हैं:

  • पाठ रंग
  • पाठ पृष्ठभूमि
  • नियंत्रण के बा ckground

आदेश में वांछित रंग आप इच्छित रंग (विंडो प्रक्रिया के लिए return (LRESULT)someBrush, या return (INT_PTR)someBrush संवाद बॉक्स के लिए) के साथ ब्रश लौटना चाहिए में पूरे नियंत्रण पेंट करने के लिए।

SetBkColor को आपका कॉल पाठ पृष्ठभूमि है, जो है अलग नियंत्रण की पृष्ठभूमि का रंग से रंग सेट करता है। यही कारण है कि हम SetBkMode को TRANSPARENT पैरामीटर के साथ कहते हैं, "कहें" कि हम टेक्स्ट पृष्ठभूमि को नियंत्रण की पृष्ठभूमि से मिलान करना चाहते हैं।

आपके मामले में मैंने स्टॉक ब्रश का उपयोग किया है, क्योंकि आपको इसका ट्रैक रखने की आवश्यकता नहीं है, और न ही आपको इसकी आवश्यकता होने के बाद इसे हटाने की आवश्यकता है।

फिर भी, ऐसे मामले हो सकते हैं जब आप कुछ अन्य रंग चाहते हैं। उस मामले में आप यहाँ क्या करना होगा क्या है:

  • वैश्विक HBRUSH चर या अपने खिड़की/संवाद प्रक्रिया में static HBRUSH चर बनाएँ।
  • विंडो प्रक्रिया में WM_CREATE के जवाब में इस चर को प्रारंभ करें। यदि संवाद प्रक्रिया में ब्रश को WM_INITDIALOG में प्रारंभ किया गया है। अधिक जानकारी और उदाहरणों के लिए someBrush = CreateSolidBrush(RGB(255, 0, 255)); कुछ documentation देखें।
  • इस ब्रश को वापस करें, जैसे मैंने आपको ऊपर उदाहरण में दिखाया है (return (LRESULT)someBrush विंडो प्रक्रिया के लिए, या return (INT_PTR)someBrush डायलॉग बॉक्स के लिए)।
  • ब्रश हटाएं जब अब आवश्यकता नहीं है। यह आमतौर पर WM_DESTROY में DeleteObject(someBrush); कॉल के साथ किया जाता है।

मैं दृढ़ता से, आप क्योंकि इस संदेश को अपने खिड़की हमेशा प्राप्त होगा WM_DESTROY बजाय WM_CLOSE के जवाब में विलोपन करने के लिए सलाह देने के लिए है, जबकि WM_CLOSE कभी कभी छोड़ा जा सकता है (इंटरनेट खोज इस परिदृश्य के लिए उदाहरण खोजने के लिए)।

आशा है कि इससे मदद मिलती है, अगर आपके पास कोई प्रश्न है तो कोई टिप्पणी छोड़ दें और मैं मदद करने की कोशिश करूंगा। सादर।

+0

एमएसडीएन से उद्धरण: "हटाएं ऑब्जेक्ट 'को कॉल करके स्टॉक ऑब्जेक्ट्स को हटाने के लिए यह आवश्यक नहीं है (लेकिन यह हानिकारक नहीं है)। – 0xC0000022L

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