2012-01-11 19 views
6

एमएफसी और विजुअल स्टूडियो 2010 सी ++ का उपयोग करना। मुझे CListCtrl स्टैंड की कुछ व्यक्तिगत पंक्तियां बनाने का एक तरीका चाहिए (हालांकि मैं पंक्तियों को हाइलाइट करने के लिए अंतर्निहित चयन क्षमता का उपयोग नहीं करना चाहता)। यह पंक्ति पृष्ठभूमि, या फ़ॉन्ट वजन, या संभवतः एक छवि का रंग भी हो सकता है (यदि वह निष्पादक है)।एमएफसी: ListCtrl की व्यक्तिगत पंक्तियों के रंग/साहस को कैसे बदलें?

आदर्श रूप से मैं जानना चाहता हूं कि स्टॉक सूची नियंत्रण का उपयोग करके इसे कैसे किया जाए। हालांकि, यदि यह संभव नहीं है तो मुझे तृतीय पक्ष कोड का उपयोग करने के तरीके के बारे में बताएं।

अद्यतन

यहाँ कोड मैं का उपयोग कर समाप्त हो गया है:

void MyList::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
    NMLVCUSTOMDRAW* cd = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR); 

    *pResult = CDRF_DODEFAULT; 

    switch(cd->nmcd.dwDrawStage) 
    { 
     case CDDS_PREPAINT: 
      *pResult = CDRF_NOTIFYITEMDRAW; 
      break; 

     case CDDS_ITEMPREPAINT: 
      { 
       int rowNumber = cd->nmcd.dwItemSpec; 
       bool highlightRow = (bool)GetItemData(rowNumber); 
       if (highlightRow) 
       { 
        COLORREF backgroundColor; 
        backgroundColor = RGB(255, 0, 0); 
        cd->clrTextBk = backgroundColor; 
       } 
      } 
      break; 

     default: 
      break; 
    } 
} 

मेरे मामले में, मैं कुछ भी ItemData के लिए प्रयोग नहीं कर रहा था, तो मैं करने के लिए एक बूलियन मान के साथ कहीं और SetItemData बुलाया इंगित करें कि पंक्ति को हाइलाइट किया जाना चाहिए या नहीं।

+2

है कि वास्तव में मेरे मन में वास्तव में क्या सिर ;-) 'GetItemData (rowNumber)' के बारे में, आप इसे 'CD-> nmcd.lItemlParam' –

+0

@ सर्ज-appTranslator में उपलब्ध नहीं है: आह अच्छा बिंदु , एक कॉल बचाएगा।मुझे यह कोशिश करनी होगी। – User

उत्तर

5

यहां मुख्य संदेश NM_CUSTOMDRAW संदेश है जो आपके CListCtrl (और कुछ अन्य नियंत्रण) को भेजा गया है। यह आपको विंडोज़ को बताने की अनुमति देता है कि आप CListCtrl के कुछ हिस्से को कस्टम बनाना चाहते हैं। विचार यह है कि संदेश आपको बताता है कि नियंत्रण के किस हिस्से को कस्टम तैयार किया जाना चाहिए। चूंकि पूरे CListCtrl को केवल कस्टम सेल को बदलने के लिए कस्टम सेल को चित्रित करना पूरी तरह से ओवरकिल होगा।

चिंता न करें, आपको कस्टम ड्रा को स्वयं को संभालने की ज़रूरत नहीं है: संदेश एक विशिष्ट पंक्ति या नियंत्रण के सेल के लिए फ़ॉन्ट और/या टेक्स्ट/बैक रंग सेट करने की अनुमति देता है।

This codeproject article शायद एक अच्छा प्रारंभिक बिंदु है।

Here is a shorter code example आपके CListCtrl में एक विशिष्ट पंक्ति का रंग सेट करने के लिए।

-2

आप संपूर्ण सूची बैकग्राउड रंग को बदलने के लिए निम्न कोड का उपयोग कर सकते हैं लेकिन मुझे यकीन नहीं है कि प्रति पंक्ति रंग बदलने के लिए समर्थित कार्यक्षमता है। निम्नलिखित कोड है:

YourControl.SetBkColor(RGB(212,208,200)); 

मुझे आशा है कि इससे मदद मिलती है।

+1

सबकुछ संभव है। –

+0

हां, अब मुझे विश्वास है। –

-3

यहाँ क्या मैं अपने कार्यक्रम, के लिए क्या किया है, तो पंक्ति मैं प्रकाश डाला चाहते एक CIN या एक अदालत या किसी अन्य बस

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0F); 

आखिरी हिस्सा यानी, 0x0F कि पंक्ति के ऊपर इस कोड को है आपको पृष्ठभूमि के रंग कोड को बदलने और

को वांछित रंग में बदलने के बाद, बस उस पंक्ति के नीचे एक और डालें जिसे आप हाइलाइट करना चाहते हैं, यानी;

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0C); 

यहाँ रंग की मेज और उनके कोड एक काले रंग की पृष्ठभूमि और नीले पाठ के लिए

0 = Black  8 = Gray 
    1 = Blue  9 = Light Blue 
    2 = Green  A = Light Green 
    3 = Aqua  B = Light Aqua 
    4 = Red   C = Light Red 
    5 = Purple  D = Light Purple 
    6 = Yellow  E = Light Yellow 
    7 = White  F = Bright White 

उदाहरण है;

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x01); 
+0

ओपी ने पूछा कि CListControl की पंक्ति रंग कैसे सेट करें ... –