MFC list表控件操作

1.属性 
View 指定程序运行后列表风格:Icon大图标,SmallIcon小图标、List列表、Report报表 
Align 对齐方式,Top顶部对齐或Left左对齐 
Sort 排序:None不排序、Ascending升序、Descending降序 
Single selection 表示每次只能选中一项(行) 
Auto arrange 使得项目在Icon和Small Icon显示方式下能够自动排列整齐 
Edit Labels 表示可以编辑项目的卷标,即主项(第0列)的文本,这时需要添加控件通知消息LVN_ENDLABELEDIT的处理函数 
No column header 取消控件所有列的标题 

控件属性要设置好,


2.基本操作 
InsertItem 插入一个主项(行) 
DeleteItem 删除一个主项 
GetItemText 获得子项文本 
SetItemText 设置子项文本 
GetItemCount 获得项目的总数(总行数目) 
FindItem 查找具有某些特征的项目(查行) 
GetNextItem 查找并返回某些项目的索引 
SetImageList 把图像列表与列表控件关联(设置列表图标需要) 
InsertColumn 插入一个列 
DeleteColumn 删除一个列 
(索引号是从0开始的,删除时要注意索引号的改变) 
3.常用消息 
单击、双击、当前选项发生变化等操作、修改主项、插入、删除等消息 
4.列表控件的数据结构

定义列表控件的一个表项(某行的子项)

typedef struct tagLVITEMA
{
    UINT mask;//结构成员屏蔽位
    int iItem;//表项索引号
    int iSubItem;//子表项索引号 (索引列表头)
    UINT state;//表项状态
    UINT stateMask;//状态有效性屏蔽位
    LPSTR pszText;//表项名文本
    int cchTextMax;//表项名最大长度
    int iImage;//表项图标的索引号
    LPARAM lParam;//与表项相关的32位数
#if (_WIN32_IE >= 0x0300)
    int iIndent;
#endif
} LVITEMA, FAR* LPLVITEMA;

定义列表控件的一个列项(列表头)

typedef struct tagLVCOLUMNA
{
    UINT mask;//结构成员有效性屏蔽位
    int fmt;//表列对齐方式
    int cx;//表列的像素宽度
    LPSTR pszText;//表列的表头名
    int cchTextMax;//表列名的文本长度
    int iSubItem;//与表列关联的子表索引号
#if (_WIN32_IE >= 0x0300)
    int iImage;
    int iOrder;
#endif
} LVCOLUMNA, FAR* LPLVCOLUMNA;

fmt可取如下值: 
LVCFMT_CENTER 表列居中对齐 
LVCFMT_LEFT 表列左对齐 
5.图像列表的使用 
先定义CImageList对象,然后调用Create()函数创建,再调用Add()函数加入图像,最后由关联控件调用SetImageList()函数与图像列表相关联,例如CListCril m_list; m_list.SetImageList(关联图像对象);

BOOL Create(int cx,int cy,UINT nFlags,int nInitial,int nGrow);
BOOL Create(UINT nBitmapID,int cx,int nGrow,COLORREF crMask);
  •  

插入图标像素(cx,cy),nFlags确定建立图标列表的类型,有如下:ILC_COLOR、ILC_COLOR4、ILC_COLOR8、ILC_COLOR16、ILC_COLOR24、ILC_COLOR32、ILC_COLORDDB和ILC_MASK; 
nInitial确定图像列表最初包含的图像数目; 
nGrow用来确定图像列表每一次添加的图像数量. 
实例: 
1.创建一个基于对话框的应用程序,名为Ex4_11,标题为商品信息. 
2.导入一些图标ID为: 
IDI_CAMERA 
IDI_KEYBOARD 
IDI_MOUSE 
IDI_MOBILE 
IDI_MONITOR 
IDI_PHONE 
IDI_PRINTER 
3.对话框设置为 
将单选按钮ID自上至下改为: 
IDC_STDICON 
IDC_SMLICON 
IDC_LIST 
IDC_REPORT 
将按钮自左至右改为: 
IDC_BTN_SORT 
IDC_BTN_DEL 
IDOK 
添加列表控件,ID为IDC_LISTCTRL,成员变量m_ListCtrl 
4.在Ex4_11Dlg.h种添加GOODS数据结构和CompareFunc函数的声明

typedef struct tagGOODS{
    char Name[10];
    int ImageNo;
    char Count[10];
    char Price[10];
    char Total[10];
}GOODS;
int CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort);

在Ex4_11Dlg.cpp添加初始化Goods[] 
GOODS Goods[]={ 
{“相机”,0,”10”,”1500”,”15000”}, 
{“键盘”,1,”10”,”1500”,”1500”}, 
{“鼠标”,2,”10”,”1500”,”1580”}, 
{“手机”,3,”10”,”1550”,”1500”}, 
{“显示器”,4,”16”,”1500”,”15000”}, 
{“电话机”,5,”15”,”1500”,”1500”}, 
{“打印机”,6,”7”,”1500”,”15000”}, 
}; 
5.在CEx4_11Dlg类中添加两个CImageList类型的成员变量m_ImageLarge,m_ImageSmal用于存放大图标和小图标。对应每个图标都建立32*32和16*16两种大小 
6.对话框初始化函数中添加以下代码:

    // TODO: Add extra initialization here
    LV_ITEM lvitem;//子项
    LV_COLUMN lvcol;//行
    int i,iPos,iItemNum;//当前位置,总行数
    CEx4_11App *pApp=(CEx4_11App *)AfxGetApp();//获取窗口指针
    m_ImageLarge.Create(32,32,ILC_COLOR32,2,2);
    m_ImageLarge.SetBkColor(RGB(255,255,255));
    m_ImageLarge.Add(pApp->LoadIcon(IDI_CAMERA));
    m_ImageLarge.Add(pApp->LoadIcon(IDI_KEYBOARD));
    m_ImageLarge.Add(pApp->LoadIcon(IDI_MOUSE));
    m_ImageLarge.Add(pApp->LoadIcon(IDI_MOBILE));
    m_ImageLarge.Add(pApp->LoadIcon(IDI_MONITOR));
    m_ImageLarge.Add(pApp->LoadIcon(IDI_PHONE));
    m_ImageLarge.Add(pApp->LoadIcon(IDI_PRINTER));

    m_ImageSmall.Create(16,16,ILC_COLOR32,2,2);
    m_ImageSmall.SetBkColor(RGB(255,255,255));
    m_ImageSmall.Add(pApp->LoadIcon(IDI_CAMERA));
    m_ImageSmall.Add(pApp->LoadIcon(IDI_KEYBOARD));
    m_ImageSmall.Add(pApp->LoadIcon(IDI_MOUSE));
    m_ImageSmall.Add(pApp->LoadIcon(IDI_MOBILE));
    m_ImageSmall.Add(pApp->LoadIcon(IDI_MONITOR));
    m_ImageSmall.Add(pApp->LoadIcon(IDI_PHONE));
    m_ImageSmall.Add(pApp->LoadIcon(IDI_PRINTER));
    m_ListCtrl.SetImageList(&m_ImageLarge,LVSIL_NORMAL);//设置大图标关联
    m_ListCtrl.SetImageList(&m_ImageSmall,LVSIL_SMALL);//设置小图标关联
    //向列表控件中添加表列
    lvcol.mask=LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH;
    lvcol.fmt=LVCFMT_CENTER;//列表名居中
    i=0;
    lvcol.pszText="品 名";//列表头名字
    lvcol.iSubItem=i;//该列的子项索引号 0
    lvcol.cx=70;//宽度
    m_ListCtrl.InsertColumn(i++,&lvcol);
    lvcol.pszText="数 量";
    lvcol.iSubItem=i;//该列的子项索引号 1
    lvcol.cx=70;
    m_ListCtrl.InsertColumn(i++,&lvcol);

    lvcol.pszText="单 价";
    lvcol.iSubItem=i;//该列的子项索引号 2
    lvcol.cx=70;
    m_ListCtrl.InsertColumn(i++,&lvcol);

    lvcol.pszText="金 额";
    lvcol.iSubItem=i;//该列的子项索引号 3
    lvcol.cx=70;

    m_ListCtrl.InsertColumn(i++,&lvcol);
    iItemNum=sizeof(Goods)/sizeof(GOODS);//总行数
    for(i=0;i<iItemNum;i++)
    {
        lvitem.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;//设置列子项的文本|该行图标|该列子行的行索引号
        /*一行中公有部分:图标索引号iImage,行索引号lParam,除了行头的第一列的表项索引号是行索引号(i),后面的列子项的表项索引号都为行头插入后返回的索引号。表项索引号是iItem*/
        lvitem.iImage=Goods[i].ImageNo;//该行图标索引号
        lvitem.lParam=i;//行索引号
        //公有部分处理结束;

        lvitem.iItem=i;//特殊:行头的表项索引号iItem是行索引号lParam.
        lvitem.pszText=Goods[i].Name;
        lvitem.iSubItem=0;//所属列  (父表项索引号)
        iPos=m_ListCtrl.InsertItem(&lvitem);//插入行头后返回行头的索引号,以供行头之后的子项使用,注意行头插入函数是InsertItem
        lvitem.mask=LVIF_TEXT;
        lvitem.iItem=iPos;//处理该行第二列的表项索引号iItem=iPos,同时后面的列都一样处理了
        lvitem.iSubItem=1;
        lvitem.pszText=Goods[i].Count;
        m_ListCtrl.SetItem(&lvitem);//注意处行头之外的,行尾都用SetItem插入.
        lvitem.iSubItem=2;
        lvitem.pszText=Goods[i].Price;
        m_ListCtrl.SetItem(&lvitem);
        lvitem.iSubItem=3;
        lvitem.pszText=Goods[i].Total;
        m_ListCtrl.SetItem(&lvitem);
    //  UpdateData(false);
    }
    CheckRadioButton(IDC_STDICON,IDC_REPORT,IDC_STDICON);//检查大图标按钮是否被按下,从大图标按钮到报告按钮检查.

7.添加显示方式消息处理函数 
显示方式有4个单选按钮,让它们共用一个消息响应函数,需要手动添加消息映射函数。 
7.1在Ex4_11Dlg.h的AFX_MSG块中添加消息映射函数的声明:

afx_msg void OnViewTypeClicked(UINT nCmdID);
  • 1

7.2在Ex4_11Dlg.cpp种添加消息映射ON_CONTROL_RANGE

ON_CONTROL_RANGE(BN_CLICKED,IDC_STDICON,IDC_REPORT,OnViewTypeClicked)//控制单选按钮IDC_STDICON至IDC_REPORT处理函数,用于选择列表风格
  • 1
//此函数为自定义函数,afx全局函数和On消息映射函数都需要自己添加
void CEx4_11Dlg::OnViewTypeClicked(UINT nCmdID)
{
    LONG lStyle;
    lStyle=GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口类型
    lStyle&=~LVS_TYPEMASK;//清除显示方式位 初始化lStyle二进制码全0操作
    switch(nCmdID)
    {
        case IDC_STDICON:
            lStyle|=LVS_ICON;//设置大图标格式
            break;
        case IDC_SMLICON:
            lStyle|=LVS_SMALLICON;//设置小图标格式
            break;
        case IDC_LIST:
            lStyle|=LVS_LIST;//设置列表格式
            break;
        case IDC_REPORT:
            lStyle|=LVS_REPORT;//设置报告格式
            break;
    }
    SetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE,lStyle);//设置列表框类型为lStyle
}

8.实现删除功能,可多项删除,注意需要从后往前删除。 
删除函数由向导产生:

void CEx4_11Dlg::OnBtnDel() 
{
    // TODO: Add your control notification handler code here
    int i ,iState;
    int nItemSelected=m_ListCtrl.GetSelectedCount();//获取选中的行
    int nItemCount=m_ListCtrl.GetItemCount();//获取总行数目
    if(nItemSelected<1)return ;//若为空
    for(i=nItemCount-1;i>=0;i--)//从最底部行开始查找要删除的行进行删除
    {
        iState=m_ListCtrl.GetItemState(i,LVIS_SELECTED);//查找到该行为选择的一行,返回非零,否则返回0
        if(iState!=0)m_ListCtrl.DeleteItem(i);//非0则删除
    }
}

9.实现排序功能,必须要是报告风格列表才可以,单击列表顶部的表头可以当做按钮使用,单击列表列标题时,列表控件会向其父窗口发送一个LNV_COLUMNCLICK消息,利用类向导中列表控件IDC_LISTCTRL对应的LNV_COLUMNCLICK消息加入相应处理函数,就可以将表列按照特定顺序进行排列。 
(排序是默认升序的,点哪列就按哪列升序排序,有缺陷)

void CEx4_11Dlg::OnColumnclickListctrl(NMHDR* pNMHDR, LRESULT* pResult) 
{
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    // TODO: Add your control notification handler code here
    static int iSorted=-1;
    if(pNMListView->iSubItem==iSorted)return ;//没有列表标题
    iSorted=pNMListView->iSubItem;//所选列表标题的子项索引号
    m_ListCtrl.SortItems((PFNLVCOMPARE)CompareFunc,iSorted);
    *pResult = 0;
}
int CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)
{
    char *text1,*text2;
    switch(lParamSort)
    {
    case 0L:
        text1=Goods[lParam1].Name;
        text2=Goods[lParam2].Name;
        break;
    case 1L:
        text1=Goods[lParam1].Count;
        text2=Goods[lParam2].Count;
        break;
    case 2L:
        text1=Goods[lParam1].Price;
        text2=Goods[lParam2].Price;
        break;
    case 3L:
        text1=Goods[lParam1].Total;
        text2=Goods[lParam2].Total;
        break;
    }
    return (strcmp(text1,text2));
}

(PFNLVCOMPARE)CompareFunc为进行具体排序的回调函数,传入这函数的参数有一个子项索引号iSorted(可理解为:父指针),这个参数指定是根据哪个属性进行排序; 
有2个LPARAM类型的该列子项的索引号用于作比较,结果为>0、=0、<0,SortItems调用一个由第三方开发的专用排序函数实现:根据返回结果对列表对应的两行进行交换或保留原样操作,并且SortItems会不断调用这个第三方提供的函数实现整体排序功能。 
缺陷就是:并非完全升序,不知道它是冒泡排序 还是什么排序,有待遇继续探讨,完成的各位可自行检验排序。

10.按钮排序函数:

void CEx4_11Dlg::OnBtnSort() 
{
    // TODO: Add your control notification handler code here
    m_ListCtrl.SortItems((PFNLVCOMPARE)CompareFunc,0);
}//实现按品名进行升序排序 (品名的子表项索引号为0)

11.关闭功能

void CEx4_11Dlg::OnOK() 
{
    // TODO: Add extra validation here

    CDialog::OnOK();
}
  •  

OK~

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC ListControl控件的颜色可以通过以下方法进行设置: 1. 设置整个ListControl的背景颜色: 可以使用CListCtrl类的SetBkColor()函数来设置ListControl的背景颜色,例如: m_ListCtrl.SetBkColor(RGB(255, 255, 255)); // 设置背景颜色为白色 2. 设置ListControl中某一行或某一列的颜色: 可以使用CListCtrl类的SetItem()函数来设置ListControl中某一行或某一列的颜色,例如: m_ListCtrl.SetItem(, , LVIF_TEXT | LVIF_STATE, _T("第一行第一列"), , , , , LVIS_SELECTED, LVIS_SELECTED); // 设置第一行第一列的文本和选中状态 m_ListCtrl.SetItemText(, 1, _T("第一行第二列")); // 设置第一行第二列的文本 m_ListCtrl.SetItemState(, LVIS_SELECTED, LVIS_SELECTED); // 设置第一行选中状态 m_ListCtrl.SetItemData(, (DWORD_PTR)&m_Data); // 设置第一行的数据 可以在SetItem()函数中设置LVITEM结构体的iItemiSubItem、pszText、state、stateMask等参数来设置行或列的颜色和状态。 3. 设置ListControl中某一单元格的颜色: 可以使用CListCtrl类的SetCell()函数来设置ListControl中某一单元格的颜色,例如: m_ListCtrl.SetCell(, , RGB(255, , ), RGB(255, 255, 255)); // 设置第一行第一列的前景色为红色,背景色为白色 可以在SetCell()函数中设置行、列、前景色和背景色等参数来设置单元格的颜色。 以上是MFC ListControl控件颜色设置的一些方法,希望能对您有所帮助。 ### 回答2: MFC ListControl 控件是非常常用的控件之一,可以用于展示大量数据。在使用 ListControl 控件的过程中,我们可能会遇到需要修改控件颜色的需求。下面就来介绍一下 MFC ListControl 控件的颜色设置方法。 MFC ListControl 控件的颜色可以通过属性编辑器或代码进行设置。在属性编辑器中,我们可以找到相应的属性(如:Background Color、Text Color、Selected Text Color、Selected Background Color 等),并通过改变相应的属性值来修改控件的颜色。同样地,在代码中,我们也可以通过修改相应的控件属性值来实现对控件颜色的修改。例如: // 获取 ListControl 控件指针 CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_CONTROL); // 设置控件的背景色 pListCtrl->SetBkColor(RGB(255, 0, 0)); // 设置控件文本颜色 pListCtrl->SetTextColor(RGB(0, 255, 0)); // 设置选中行的背景色和文本颜色 pListCtrl->SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); pListCtrl->SetSelectionMark(0); pListCtrl->SetItemState(0, LVIS_SELECTED, LVIS_SELECTED); 以上代码中,通过调用 SetBkColor() 函数和 SetTextColor() 函数分别对控件的背景色和文本颜色进行设置。同时,代码也演示了如何设置选中行的背景色和文本颜色。需要注意的是,当设置控件的颜色时,如果控件已经被创建,需要先调用控件的 RedrawItems() 函数进行重绘操作,否则,新设置的颜色可能不会立即生效。 总之,MFC ListControl 控件是非常强大的控件之一,灵活的颜色设置能够更好地满足各种需求,开发者需要注意控件的颜色设置时需要先重绘才会生效。 ### 回答3: MFC ListControl控件MFC中非常常用的控件之一,它可以用于显示列、图形视图等。在使用ListControl控件时,有时候需要对列中的某些行或列进行颜色的设置以达到更好的视觉效果。下面我们来了解一下MFC ListControl控件的颜色设置。 MFC ListControl控件的背景颜色是由ListControl的背景色和父窗口的背景色共同决定的。用户可以在资源编辑器中或运行时使用CListCtrl类的SetBackgroundColor()函数来设置ListControl的背景颜色。 MFC ListControl控件的前景颜色是由用户在添加数据时指定的。在使用CListCtrl类的InsertItem()函数添加行的时候,可以指定该行的前景颜色和背景颜色;在使用CListCtrl类的SetItemText()函数设置列的时候,也可以指定该列的前景颜色和背景颜色。 如果需要动态地设置某一行或某一列的颜色,可以使用CListCtrl类的SetItem()函数。例如,设置第一行红色,第二行蓝色,可以用以下代码: ``` m_ListCtrl.SetItem(0, 0, LVIF_TEXT | LVIF_STATE, _T("第一行"), 0, LVIS_SELECTED, LVIS_SELECTED, 0); m_ListCtrl.SetItemText(0, 1, _T("第一列")); m_ListCtrl.SetItemData(0, 100); m_ListCtrl.SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); m_ListCtrl.SetItemText(1, 0, _T("第二行")); m_ListCtrl.SetItem(1, 0, LVIF_TEXT | LVIF_STATE, _T("第二行"), 0, LVIS_SELECTED, LVIS_SELECTED, 0); m_ListCtrl.SetItemText(1, 1, _T("第二列")); m_ListCtrl.SetItemData(1, 200); m_ListCtrl.SetItemState(1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); m_ListCtrl.SetItemText(2, 0, _T("第三行")); m_ListCtrl.SetItemText(2, 1, _T("第三列")); m_ListCtrl.SetItemText(0, 0, _T("第一行")); m_ListCtrl.SetItemText(0, 1, _T("第一列")); m_ListCtrl.SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); m_ListCtrl.SetTextColor(0, RGB(255, 0, 0)); // 设置第1行红色 m_ListCtrl.SetItem(1, 0, LVIF_TEXT | LVIF_STATE, _T("第二行"), 0, LVIS_SELECTED, LVIS_SELECTED, 0); m_ListCtrl.SetItemText(1, 1, _T("第二列")); m_ListCtrl.SetItemState(1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); m_ListCtrl.SetTextColor(1, RGB(0, 0, 255)); // 设置第2行蓝色 ``` 除了设置整行或整列的颜色,还可以为不同的单元格设置不同的颜色。可以在添加行时使用LVITEM结构体的iItemiSubItem、mask、pszText等成员,分别指定行号、列号、要设置的属性和单元格中要显示的文本。在通过CListCtrl类的GetItem()函数获取某一行列时,也可以获得单元格的前景色和背景色等属性信息。 通过上述方法,可以实现对MFC ListControl控件的颜色自定义设置。至于要如何设置出美观的颜色组合,需要根据实际情况和个人喜好来决定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值