2012-01-11 18 views
6

Sử dụng MFC và Visual Studio 2010 C++. Tôi cần một cách để làm cho một số hàng riêng biệt của một CListCtrl nổi bật (tuy nhiên tôi không muốn sử dụng khả năng lựa chọn tích hợp để làm nổi bật các hàng). Nó có thể là màu của nền hàng hoặc trọng lượng phông chữ hoặc thậm chí là hình ảnh (nếu đó là biểu diễn).MFC: Làm cách nào để thay đổi màu/độ đậm nét của các hàng không rõ ràng của ListCtrl?

Lý tưởng nhất là tôi muốn biết cách thực hiện điều này bằng cách sử dụng kiểm soát danh sách chứng khoán. Tuy nhiên, nếu điều này là không thể thì hãy cho tôi biết cách sử dụng mã của bên thứ ba.

CẬP NHẬT

Dưới đây là đoạn code tôi đã kết thúc bằng:

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; 
    } 
} 

Trong trường hợp của tôi, tôi đã không sử dụng các ItemData cho bất cứ điều gì, vì vậy tôi gọi SetItemData nơi khác với một giá trị boolean để cho biết liệu hàng có nên được đánh dấu hay không.

+2

Đó là thực sự chính xác những gì tôi đầu trong tâm trí ;-) Về 'GetItemData (rowNumber) ', bạn không cần phải cho nó có sẵn trong' CD-> nmcd.lItemlParam' –

+0

@ Serge-appTranslator: ah điểm tốt , sẽ lưu một cuộc gọi.Tôi sẽ phải thử điều đó. – User

Trả lời

5

Thông báo chính ở đây là thông báo NM_CUSTOMDRAW được gửi tới CListCtrl của bạn (và một số điều khiển khác). Nó cho phép bạn nói với Windows rằng bạn muốn tùy chỉnh vẽ một phần của CListCtrl. Ý tưởng là thông báo cho phép bạn cho biết phần nào của điều khiển sẽ được vẽ tùy chỉnh. Bởi vì tùy chỉnh vẽ toàn bộ CListCtrl chỉ để thay đổi màu văn bản của một ô sẽ hoàn toàn quá mức cần thiết.

Đừng lo lắng, bạn không phải tự xử lý tùy chỉnh: Thông báo cho phép đặt phông chữ và/hoặc văn bản/màu sau cho một hàng hoặc ô cụ thể của điều khiển.

This codeproject article có lẽ là điểm khởi đầu tốt.

Here is a shorter code example để đặt màu của một dòng cụ thể trong CListCtrl của bạn.

-2

Bạn có thể sử dụng mã sau đây để thay đổi toàn bộ màu nền danh sách nhưng tôi không chắc có chức năng được hỗ trợ để thay đổi màu cho mỗi hàng. Sau đây là mã:

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

Tôi hy vọng điều đó sẽ hữu ích.

+1

Mọi thứ đều có thể. –

+0

Vâng, tôi tin bây giờ. –

-3

Đây là những gì tôi đã làm để chương trình của tôi, nếu hàng tôi muốn nhấn mạnh là một cin hoặc một cout hoặc bất kỳ khác chỉ cần đặt mã này trên hàng đó

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0F); 

phần cuối cùng tức là, 0x0F cho phép u thay đổi mã màu của nền và văn bản

sau khi thay đổi màu đó thành màu mong muốn, chỉ cần chèn một màu khác bên dưới hàng bạn muốn đánh dấu, tức là;

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0C); 

đây là bảng màu sắc và mã của họ

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 

VÍ DỤ cho một nền đen và chữ màu xanh;

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

OP hỏi làm thế nào để thiết lập màu sắc hàng của một CListControl ... –

Các vấn đề liên quan