MFC 列表控件的使用

与CTreeCtrl类似,MFC中以两种形式封装列表控件,一种是CListCtrl;另一种是CListView。 对于CListView,调用成员函数GetListCtrl返回一个CListCtrl的引用,就可以像CListCtrl一样进行各种操作。

CListCtrl有很多种显示方式,其中最常用的四种是(大图标)LVS_ICON 、(小图标)LVS_SMALLICON、(列表)LVS_LIST、(报告/详细信息)LVS_REPORT。可以通过调用GetWindowLongSetWindowLong来设置其属性,从而改变其显示方式。需要注意的是,LVS_TYPEMASK属性决定了当前列表控件的风格,如果需要调用SetWindowLong函数来更改其显示方式,就必须在更改操作前清除LVS_TYPEMASK属性。否则更改将无效。

与列表控件相关的两个数据结构是LV_ITEMLV_COLUMN。其中LV_ITEM用于定义列表控件的一个表项;而LV_COLUMN则用于定义列表控件的一个表列。它们的定义及含义如下所示:

typedef struct tagLVITEMA

{

    UINT mask;//结构成员有效屏蔽位

    int iItem;//列表项索引号

    int iSubItem;//子列表项索引号

    UINT state;//列表状态

    UINT stateMask;//状态有效性屏蔽位

    LPSTR pszText;//列表项名称

    int cchTextMax;//列表项名称最大长度

    int iImage;//列表项图标索引号

    LPARAM lParam;//自定义数据

#if (_WIN32_IE >= 0x0300)

    int iIndent;

#endif

#if (_WIN32_WINNT >= 0x0501)

    int iGroupId;

    UINT cColumns; // tile view columns

    PUINT puColumns;

#endif

#if _WIN32_WINNT >= 0x0600 // Will be unused downlevel, but sizeof(LVITEMA) must be equal to sizeof(LVITEMW)

    int* piColFmt;

    int iGroup; // readonly. only valid for owner data.

#endif

} LVITEMA, *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

#if _WIN32_WINNT >= 0x0600

    int cxMin;       // min snap point

    int cxDefault;   // default snap point

    int cxIdeal;     // read only. ideal may not eqaul current width if auto sized (LVS_EX_AUTOSIZECOLUMNS) to a lesser width.

#endif

} LVCOLUMNA, *LPLVCOLUMNA;

插入一个表项使用CListCtrl::InsertItem,插入一个子表项使用CListCtrl::InsertItem;插入一个表列使用CListCtrl::InsertColumn。

1、首先创建用于表项的CImageList

m_LargeImage.Create(32,32,ILC_COLOR8 | ILC_MASK,8,1);

m_SmallImage.Create(16,16,ILC_COLOR8 | ILC_MASK,8,1);

CImageList::Create函数初始化一个图像列表并将其附加到该CImageList对象。

ILC_COLOR8使用8位的DIB段。这与半色调色板所使用的颜色表一致。ILC_MASK使用掩码。图像列表包含两个位图,其中一个是单色位图作为掩码。如果不包含这个值,图像列表只包含一个位图。8表明图像列表最初时包含8个图像。1表示当系统重新调整列表的大小时需要为新图像腾出空间的增量。

2、为图像列表装载位图:

CBitmap cBmp;

cBmp.LoadBitmap(IDB_IMAGES_NORMAL);

LargeImage.Add(&cBmp, RGB(255,0, 255));

cBmp.DeleteObject();

cBmp.LoadBitmap(IDB_IMAGES_SMALL);

SmallImage.Add(&cBmp, RGB(255,0, 255));

cBmp.DeleteObject();

IDB_IMAGES_NORMAL和IDB_IMAGES_SMALL均是位图资源IDCImageList::Add函数添加一个或者多个图像或图标到图像列表中。当这个函数返回时,必须

3、为列表控件分派图像列表:

m_ListCtrl.SetImageList(&LargeImage, LVSIL_NORMAL);

m_ListCtrl.SetImageList(&SmallImage, LVSIL_SMALL);

 LVSIL_NORMAL标志指示使用大图标,LVSIL_SMALL使用小图标。

4、插入表列

LVCOLUMN Lvcol;

Lvcol.mask=LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH;//标识哪些字段可用

Lvcol.fmt=LVCFMT_CENTER;//对齐方式

Lvcol.pszText="文件名";//列表头标题

Lvcol.iSubItem=3;//子表项索引

Lvcol.cx=70;//表项宽度,以像素为单位

m_ListCtrl.InsertColumn(0,&Lvcol);

Lvcol.pszText="文件大小";

m_ListCtrl.InsertColumn(1,&Lvcol);

Lvcol.pszText="开始时间";

m_ListCtrl.InsertColumn(2,&Lvcol);

Lvcol.pszText="上传进度";

……

5、插入表项

LVITEM Lvitem;

CString strItem;

for(int i=0;i<8;i++)

{

Lvitem.mask=LVIF_IMAGE | LVIF_TEXT;

strItem.Format("VC界面编程技术第%d",i+1);

Lvitem.pszText=(LPTSTR)(LPCTSTR)(strItem);

Lvitem.iItem=i;

Lvitem.iSubItem=0;

Lvitem.iImage=i;

m_ListCtrl.InsertItem(&Lvitem);

strItem.Format("%dMB",(rand()%500)+10);

Lvitem.iSubItem=1;

m_ListCtrl.SetItem(&Lvitem);

strItem.Format("%d:%d:%d",rand()%24,rand()%60,rand()%60);

Lvitem.iSubItem=2;

m_ListCtrl.SetItem(&Lvitem);

……

}

列表控件在默认情况下只能选中表项的第一个项,其他项不能被选中。如果需要设置第一项被选中时整行高亮显示,可以使用CListCtrl::SetExtendedStyle函数并传递LVS_EX_FULLROWSELECT参数;或传递LVS_EX_GRIDLINES显示网格;或传递LVS_EX_HEADERDRAGDROP允许表列被拖拽自由排序(三种情况均只对具有LVS_REPORT风格的列表控件起作用)。

示例代码如下所示:

m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT |  LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP);

m_LargeImage.Create(32,32,ILC_COLOR8 | ILC_MASK,8,1);

m_SmallImage.Create(16,16,ILC_COLOR8 | ILC_MASK,8,1);

CBitmap Bitmap;

Bitmap.LoadBitmapA(IDB_IMAGES_NORMAL);

m_LargeImage.Add(&Bitmap,RGB(255,0,255));

Bitmap.DeleteObject();

Bitmap.LoadBitmapA(IDB_IMAGES_SMALL);

m_SmallImage.Add(&Bitmap,RGB(255,0,255));

Bitmap.DeleteObject();

m_ListCtrl.SetImageList(&m_LargeImage,LVSIL_NORMAL);

m_ListCtrl.SetImageList(&m_SmallImage,LVSIL_SMALL);

LVCOLUMN Lvcol;

Lvcol.mask=LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH;//标识哪些字段可用

Lvcol.fmt=LVCFMT_CENTER;//对齐方式

Lvcol.pszText="文件名";//列表头标题

Lvcol.iSubItem=3;//子表项索引

Lvcol.cx=70;//表项宽度,以像素为单位

m_ListCtrl.InsertColumn(0,&Lvcol);

Lvcol.pszText="文件大小";

m_ListCtrl.InsertColumn(1,&Lvcol);

Lvcol.pszText="开始时间";

m_ListCtrl.InsertColumn(2,&Lvcol);

Lvcol.pszText="上传进度";

m_ListCtrl.InsertColumn(3,&Lvcol);

Lvcol.pszText="完成时间";

m_ListCtrl.InsertColumn(4,&Lvcol);

Lvcol.pszText="上传耗时";

m_ListCtrl.InsertColumn(5,&Lvcol);

LVITEM Lvitem;

CString strItem;

for(int i=0;i<8;i++)

{

Lvitem.mask=LVIF_IMAGE | LVIF_TEXT;

strItem.Format("VC界面编程技术第%d",i+1);

Lvitem.pszText=(LPTSTR)(LPCTSTR)(strItem);

Lvitem.iItem=i;

Lvitem.iSubItem=0;

Lvitem.iImage=i;

m_ListCtrl.InsertItem(&Lvitem);

strItem.Format("%dMB",(rand()%500)+10);

Lvitem.iSubItem=1;

m_ListCtrl.SetItem(&Lvitem);

strItem.Format("%d:%d:%d",rand()%24,rand()%60,rand()%60);

Lvitem.iSubItem=2;

m_ListCtrl.SetItem(&Lvitem);

strItem.Format("%d%%",rand()%100);

Lvitem.iSubItem=3;

m_ListCtrl.SetItem(&Lvitem);

strItem.Format("- -");

Lvitem.iSubItem=4;

m_ListCtrl.SetItem(&Lvitem);

strItem.Format("%d%d",rand()%360,rand()%60);

Lvitem.iSubItem=5;

m_ListCtrl.SetItem(&Lvitem);

6、删除表项

ClistCtrl::DeleteItem函数根据给定的索引值从列表控件中删除表项。结合GetItemState函数可以删除被选中的表项。

CListCtrl::GetItemState函数可以返回当前表项的状态。可能的取值为LVIS_CUT、LVIS_DROPHILITED、LVIS_FOCUSED、LVIS_SELECTED。当需要删除被选中的表项时,删除操作必须从后向前依次进行(如果有多项被选中的话),因为当一个表项在列表控件中被删除之后,在它后面的表项的索引号会自动减一。如果不按从后向前进行删除操作,那么就不能正常删除被选中的多个表项。下面是删除表项的示例代码:

int nItemCount=m_list.GetItemCount();

for(int i=nItemCount-1;i>=0;i--)//从后向前删除

{

int iState=m_list.GetItemState(i,LVIS_SELECTED);

if(iState!=0)

m_list.DeleteItem(i);

}

删除表项之后的重新排序并不是必须的。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC 中的列表控件是一个非常常用的控件,可以用来显示和编辑大量的数据。下面是一个简单的 MFC 列表控件使用实例: 1. 创建一个对话框,并在上面添加一个列表控件控件。 2. 在对话框类的头文件中添加以下代码: ```cpp #include <afxcmn.h> class CMyDlg : public CDialogEx { public: CMyDlg(CWnd* pParent = nullptr); enum { IDD = IDD_MY_DIALOG }; private: CListCtrl m_listCtrl; }; ``` 3. 在 OnInitDialog 函数中对列表控件进行初始化: ```cpp BOOL CMyDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 添加列 m_listCtrl.InsertColumn(0, _T("姓名"), LVCFMT_LEFT, 100); m_listCtrl.InsertColumn(1, _T("年龄"), LVCFMT_LEFT, 100); // 添加行 m_listCtrl.InsertItem(0, _T("张三")); m_listCtrl.SetItemText(0, 1, _T("20")); m_listCtrl.InsertItem(1, _T("李四")); m_listCtrl.SetItemText(1, 1, _T("25")); // 设置风格 m_listCtrl.SetExtendedStyle(m_listCtrl.GetExtendedStyle() | LVS_EX_FULLROWSELECT); return TRUE; } ``` 4. 编译并运行程序,即可看到列表控件中显示了两行数据,每行有两列。 以上就是一个简单的 MFC 列表控件使用实例。需要注意的是,列表控件还可以进行更多的高级操作,比如排序、编辑、拖放等。如果需要进行更复杂的操作,可以参考 MFC 文档或在网上查找相关资料。 ### 回答2: MFC(Microsoft Foundation Classes)是一套由微软提供的C++编程类库,用于开发Windows桌面应用程序。其中包含了许多常用的控件,例如列表控件(List Control)。 列表控件是一个显示数据列表的窗口部件,以表格的形式展示数据。我们可以在MFC应用程序中使用列表控件来显示和编辑数据,如需使用列表控件,我们可以按照以下步骤进行操作: 1. 创建一个MFC应用程序并打开资源视图。 2. 在资源视图中选择对话框,并双击以打开对话框设计视图。 3. 在对话框中插入一个列表控件。可以在工具箱中找到列表控件,并将其拖拽到对话框上。 4. 双击列表控件以进入其属性界面。在属性页中,我们可以设置列表控件的样式、布局和其他属性,如行数、列数、标题等。 5. 在应用程序的视图类中,打开对话框类的.cpp文件。可以在OnInitDialog()函数中编写如下代码来初始化列表控件: ```cpp // 获取列表控件对象指针 CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST1); // 设置列表控件为报告视图 pListCtrl->ModifyStyle(0, LVS_REPORT); // 插入列 pListCtrl->InsertColumn(0, _T("列1"), LVCFMT_LEFT, 100); pListCtrl->InsertColumn(1, _T("列2"), LVCFMT_LEFT, 100); // 插入行 pListCtrl->InsertItem(0, _T("数据1")); pListCtrl->SetItemText(0, 1, _T("数据2")); ``` 这段代码将列表控件设置为报告视图并插入了两列,并在第一行插入了数据。你可以根据自己的需求进行修改。 6. 运行应用程序,你将看到一个显示有数据的列表控件。你可以使用列表控件的其他成员函数来增加、删除、编辑和获取列表中的数据。 总结而言,使用MFC中的列表控件需要进行资源的设计和对控件的属性设置,然后在视图类中初始化和操作列表控件即可。通过这些步骤,我们可以方便地在MFC应用程序中使用列表控件来展示和操作数据。 ### 回答3: MFC(Microsoft Foundation Classes)是一套用于开发Windows桌面应用程序的C++编程框架。列表控件MFC中一个常用的控件,用于显示和管理一组数据。 使用MFC列表控件的实例可以包括以下几个步骤: 1. 创建列表控件: 在MFC应用程序中,可以通过资源视图中的控件编辑器来添加列表控件。也可以在代码中调用列表控件的Create函数动态创建。创建列表控件时,需要设置控件的样式和属性,如多选或单选、排序等。 2. 添加列标题: 通过列表控件的InsertColumn函数,可以添加列标题。可以为每个列指定标题文本和宽度等属性,以便用户能够区分和查看列表中的数据。 3. 添加列表项: 通过列表控件的InsertItem函数,可以添加列表项。可以为每个列表项设置图标、文本和子项等属性。列表项可以根据需要进行增删改查操作。 4. 添加子项: 通过列表控件的SetItemText函数,可以为列表项添加子项。子项可以存储更多的数据,如日期、价格等。可以为每个子项设置文本和自定义格式。 5. 响应用户交互: 可以在代码中为列表控件注册相应的消息响应函数,如双击列表项触发的消息、拖拽列表项触发的消息等。通过这些函数,可以实现列表控件的各种交互和操作。 6. 数据管理: 可以通过代码操作列表控件中的数据,如获取选择的列表项、修改列表项的文本等。还可以通过数据结构或数据源来管理列表控件中的数据,如从数据库读取数据并显示在列表中。 通过以上步骤,就可以使用MFC列表控件在应用程序中展示和管理一组数据。列表控件在实际应用中非常常见,可用于显示文件列表、日程安排、任务状态等各种信息。可以根据需要进行自定义,满足不同应用场景的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值