2015-05-18 143 views
2

我想改變LVITEM的顏色? m_szList是CListCtrl。更改MFC C++中的文本顏色?

LVITEM lvItem; 

    lvItem.mask = LVIF_TEXT; 
    lvItem.iItem = 0; 
    lvItem.iSubItem = 0; 
    lvItem.pszText = _T("Sandra"); 
    m_szList.InsertItem(&lvItem); 
    m_szList.SetTextColor(RGB(255, 78, 12)); 

    lvItem.mask = LVIF_TEXT; 
    lvItem.iItem = 1; 
    lvItem.iSubItem = 0; 
    lvItem.pszText = _T("Roger"); 
    m_szList.InsertItem(&lvItem); 

此代碼可以改變sandra和roger的顏色。 但我只是想改變桑德拉的顏色爲紅色。 和羅傑默認(黑色)。

+0

正如你已經注意到的,SetTextColor設置整個列表的文本顏色...所以,我想你應該使用一些擴展的listcontrol:https://www.google.ro/search?q=CListCtrlExt+codeproject&spell=1&sa= X&ei = d5tZVZ7AL6WcygOBioCgBw&ved = 0CBkQvwUoAA&biw = 1152&bih = 634 – flaviu2

回答

4

您可以使用自定義繪圖列表控件來執行此作業。

您通過響應NM_CUSTOMDRAW消息來控制自定義繪製。這是從控制中發送的的通知消息。使用MFC,你的函數頭會是這個樣子:

void CCustomLvView::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) 

要添加此處理程序,通常使用的屬性列表中的CListCtrl(或CListView中),這樣的事情:

enter image description here

這將創建一個處理程序是這樣的:

void CCustomLV2View::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) { 
    LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR); 

    *pResult = CDRF_DODEFAULT; 
} 

[。如果沒記錯的,它也有一個或兩個註釋]

你需要一點點的代碼添加到更改文本顏色,這東西順序:

void CCustomLV2View::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) { 
    LPNMLVCUSTOMDRAW pNMCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR); 

    *pResult = CDRF_DODEFAULT; 

    switch (pNMCD->nmcd.dwDrawStage) { 
     // this tells the control, before any painting begins, that we 
     // want to be notified just before any item in the control is drawn. 
     case CDDS_PREPAINT: 
      *pResult = CDRF_NOTIFYITEMDRAW; 
      break; 

     // This will be called before an item is drawn. 
     // We check what item is being drawn, and set the text color appropriately 
     case CDDS_ITEMPREPAINT: 
      if (pNMCD->nmcd.dwItemSpec == 0) 
       pNMCD->clrText = RGB(0, 0, 0); 
      else 
       pNMCD->clrText = RGB(255, 78, 12); 
      break; 
    } 
} 

因爲它是現在,這將文本繪製的第一個項目爲黑色,以及所有後續項目在你的紅色陰影。 if (pNMCD->nmcd.dwItemSpec == 0)是什麼選擇項目,並且(當然)pNMCD->clrText = RGB...是什麼設置文本顏色。

另請注意,我對它生成的代碼做了相當小的修改,所以我有一個LPNMLVCUSTOMDRAW而不是LPNMCUSTOMDRAW。這可以訪問傳遞給自定義繪圖處理程序的ListView特定字段。沒有這一點,我們無法訪問我們正在使用的某些字段(任何?)。

+0

'pNMCD-> clrTextBk',以防他以後也想要背景色。 +1 – Blacktempel

+0

'CListCtrl :: SetItemData'和'CListCtrl :: GetItemData'也可用於存儲所需的顏色,然後在此方法中檢索它。 – Robson