zoukankan      html  css  js  c++  java
  • MFC列表控件更改一行的字体颜色

    参考自(http://blog.csdn.net/ribut9225/article/details/6720639)

    1.首先从CListCtrl 继承一个类,命名为CListCtrlCl

    在头文件中加摸板

    CMap<DWORD, DWORD&, COLORREF, COLORREF&> MapItemColor;好在这里查找你的修改的颜色。

    CListCtrlCl.h如下:

    #pragma once
    // CListCtrlCl
    
    
    
    class CListCtrlCl : public CListCtrl
    {
    	CMap<DWORD, DWORD&, COLORREF, COLORREF&> MapItemColor;
     DECLARE_DYNAMIC(CListCtrlCl)
    
    public:
    
     CListCtrlCl();
     virtual ~CListCtrlCl();
    
    protected:
     DECLARE_MESSAGE_MAP()
     afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);
    public:
     afx_msg void SetItemColor(DWORD iItem, COLORREF color);
     afx_msg void SetAllItemColor(DWORD iItem,COLORREF TextBkColor);
    };
    

    2.自己写个消息映射,可能添加不上,要自己写。OnNMCustomdraw 为实现函数

     

    BEGIN_MESSAGE_MAP(CListCtrlCl, CListCtrl)
    	ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw)
    	//  ON_WM_SIZE()
    END_MESSAGE_MAP()
    

    3.写OnNMCustomdraw函数。 

    void CListCtrlCl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
    {
        // TODO: Add your control notification handler code here
        *pResult = CDRF_DODEFAULT;
        NMLVCUSTOMDRAW * lplvdr=(NMLVCUSTOMDRAW*)pNMHDR;
        NMCUSTOMDRAW &nmcd = lplvdr->nmcd;
        switch(lplvdr->nmcd.dwDrawStage)//判断状态
        {
            case CDDS_PREPAINT:
            {
                *pResult = CDRF_NOTIFYITEMDRAW;
                break;
            }
            case CDDS_ITEMPREPAINT://如果为画ITEM之前就要进行颜色的改变
            {
                COLORREF ItemColor;
                if(MapItemColor.Lookup(nmcd.dwItemSpec, ItemColor))
                // 根据在 SetItemColor(DWORD iItem, COLORREF color) 设置的
                // ITEM号和COLORREF 在摸板中查找,然后进行颜色赋值。
                {
                    //lplvdr->clrText = RGB(0,0,0);//ItemColor;
                    //lplvdr->clrTextBk = ItemColor;
    				lplvdr->clrText = ItemColor;
                    *pResult = CDRF_DODEFAULT;
                }
            }
            break;
        }
    }
    

    4. 修改指定一行的颜色。

    void CListCtrlCl::SetItemColor(DWORD iItem, COLORREF color)
    {
        //    m_iCurrentItem = iItem;
        //    m_CurrentColor = color;
    
        MapItemColor.SetAt(iItem, color);//设置某行的颜色。
        this->RedrawItems(iItem, iItem);//重新染色
    
        //this->SetCheck(iItem,1);
        this->SetFocus();    //设置焦点
        UpdateWindow();
    }
    

    5.修改全部行的颜色。

    void CListCtrlCl::SetAllItemColor(DWORD iItem,COLORREF TextBkColor)
    {
        //INT_PTR ncount = this->GetItemCount();
        if(iItem > 0)
        {
            for(DWORD numItem = 0; numItem < iItem ;numItem ++)
            {
                //iItem = i;
                MapItemColor.SetAt(numItem, TextBkColor);
                this->RedrawItems(numItem, numItem);
            }
        }
    
        return;
    
    }
    

    6.

    1)在自己项目dialog中加入列表控件,先定义普通列表控件,关联变量(如ObjectList)

    2)然后在对应的头文件,将CListCtrlCl ObjectList; 改为 CXListCtrl m_list,

    3)注意要包括自写类的头文件,头文件中加入   #include "ListCtrlCl.h" 

    cpp文件中调用相应函数

    		if(lw_all_wz[i].CompareNoCase(L"无裂纹: ")==0)
    			ObjectList.SetItemColor(i,RGB(255,255,255));//白色
    		else{
    			ObjectList.SetItemColor(i,RGB(255,0,0));//红色
    		}
    

      i对应的从0行开始

     另外还参考MSDN(https://msdn.microsoft.com/en-us/library/ms364048(VS.80).aspx#customdraw_topic4 )

                            (http://blog.sina.com.cn/s/blog_7b053996010183u1.html)

     

  • 相关阅读:
    POJ 1739 Tony's Tour(插头DP)
    POJ 1741 Tree(树的分治)
    POJ 1655 Balancing Act(求树的重心)
    POJ 2631 Roads in the North(求树的直径,两次遍历 or 树DP)
    codeforces 359E Neatness(DFS+构造)
    codeforces 295C Greg and Friends(BFS+DP)
    codeforces 228E The Road to Berland is Paved With Good Intentions(2-SAT)
    Eclipse 代码提示功能设置。
    svn 清空
    android 线程
  • 原文地址:https://www.cnblogs.com/zhangerxiaoma/p/5109764.html
Copyright © 2011-2022 走看看