MFC控件之list control

来源:互联网 发布:软件天空下载 编辑:程序博客网 时间:2024/05/16 13:57

使用之前应该对列表控件的VIEW值设置为report,不然后面所有设置可能不起作用

1、初始化,即设置列名,列宽

//设置列名跟列宽
CRect m_rect;
m_testList.GetClientRect(m_rect);
int columnWidth = m_rect.Width()/3;
        m_testList.InsertColumn(1,"配置类型",LVCFMT_CENTER,columnWidth);
m_testList.InsertColumn(2,"配置属性",LVCFMT_CENTER,columnWidth);
m_testList.InsertColumn(3,"配置值",LVCFMT_CENTER,columnWidth);

2、设置列表框显示类型

DWORD dwStyle = m_testList.GetExtendedStyle(); 
dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl) 
dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl) 
       dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
       m_testList.SetExtendedStyle(dwStyle); //设置扩展风格

3、清空原有列表框中数据

m_testList.DeleteAllItems();

4、插入数据到列表框

m_testList.InsertItem(i,configType,0);      //行的第一列数据要用InsertItem(),也可以写成InsertItem(i,configType);
m_testList.SetItemText(i,1,configParam);   //行的其他列数据就用SetItemText()
m_testList.SetItemText(i,2,configValue);
注:在循环插入多列时,一定要在循环内开始的位置configType = configParam =  configValue = "";不然可能出现某一项其实是空值,但插入时插入了上一行的该值。

5、删除列表框中的某一行

//获取选中行的行数
int i = m_testList.GetSelectionMark();      //GetSelectionMark()在多次点击不同行时会出现问题,值一直是第一次点击                                                                  //的行的值。故最好用
                                                                 //POSITION pos = m_testList.GetFirstSelectedItemPosition();
                                                                 //int i = m_testList.GetNextSelectedItem(pos);
//删除该行
m_testList.DeleteItem(i);
注:同时删除多行操作时要注意删除的顺序,从高行开始删,因为列表框删掉一行后,其后的行会自动补上来的。

6、获取到列表框中的总行数,总列数

//总行数
int n = m_list.GetItemCount();//总列数
int n = m_list.GetHeaderCtrl()->GetItemCount();

7、获取列表框中某行某列的值

CString S = m_testList.GetItemText(2,1);

8、设置选中某一行

m_list.EnsureVisible(i,FALSE);       //使列表框的某一列可见,即移动下拉条
m_testList.SetItemState(nIndex,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);

9、选中某一行,包括设置高亮,checkbox选中等

SetItemState(iSelectItem,   LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);

10、获取checkbox状态

int n = m_list.GetCheck(i);         //返回非0,则表示选中checkbox,0表示未选中

11、设置checkbox的值

m_list.SetCheck(i,TRUE);           //给第i行的checkbox打上勾
m_list.SetCheck(i,FALSE);         //去掉第i行的checkbox的勾

//设置第一列的列名为’曲名’

m_listctrl.InsertColumn(0,”曲名”);       

 

//设置列宽

CRect m_rect;

m_listctrl.GetClintRect(m_rect);

m_listctrl.SetColumnWidth(0,m_rect.Width/4);//设置列宽为客户区的1/4

 

//列名、列宽也可以一块设置

m_listctrl.InsetColumn(0,”曲名”,LVCFMT_CENTER,m_rect.Width/4);

12、设置某一行的背景颜色

VC自带没有这种功能,具体参考http://www.cnblogs.com/rainbowzc/archive/2012/02/26/2369082.html

指定改变CListCtrl中某一行的颜色,比如说刚添加进去的一行,让它改变颜色,这样记录多了,容易看到自己刚刚加如的行,方便操作可查看,也可以让添加和修改的记录显示不一样的颜色,方便的多了,VC自带的没有这种功能。 1.首先从CListCtrl 继承一个类,命名为CXListCtrl
在头文件中加摸板
CMap<DWORD, DWORD&, COLORREF, COLORREF&> MapItemColor;
好在这里查找你的修改的颜色。
2.自己写个消息映射,可能添加不上,要自己写。
BEGIN_MESSAGE_MAP(CXListCtrl, CListCtrl)
    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw)
//  ON_WM_SIZE()
END_MESSAGE_MAP()

OnNMCustomdraw 为实现函数。
3.写OnNMCustomdraw函数。
void CXListCtrlNew::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;
                *pResult = CDRF_DODEFAULT;
            }
        }
        break;
    }
}

4.修改指定一行的颜色。
void CXListCtrl::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 CXListCtrl::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;

}

m_list.SetItemColor(i,RGB(255,0,0));