VC MFC列表视图(CListCtrl)控件

列表视图控件

图标风格

CListCtrl类里要了解的函数

SetImageList为列表控件关联一个图像列表

InsertItem插入一项

GetSelectionMark获取选中项的索引

GetItemText根据项索引获取项文本内容

首先往工程里引入七个图标,接着在对话框里添加一个列表视图控件,然后为控件关联一个变量CListCtrl,再往对话框类添加一个变量CImageList m_ImageList;

在对话框类的初始化函数中添加以下代码:

m_ImageList.Create(32,32,ILC_COLOR24|ILC_MASK,1,0);
 for(int i=0;i<7;i++)
  m_ImageList.Add(LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON1+i)));
 m_ListCtrl.SetImageList(&m_ImageList,LVSIL_NORMAL);

for(i=0;i<7;i++)
 {
  CString str;
  str.Format("小明%d",i);
  m_ListCtrl.InsertItem(i,str,i);
 }

运行效果:

获取选中项内容(单击一个按钮,弹出消息提示)按钮消息处理函数代码:

int Sel=m_ListCtrl.GetSelectionMark();

CString str;

str=m_ListCtrl.GetItemText(Sel,0);

MessageBox(str);

报告风格

SetExtendedStyle设置列表控件扩展风格,该函数只有一个参数,关于该参数的解释,没找到中文的,只能先用英文替着了(msdn)

网址:http://msdn.microsoft.com/zh-cn/vbasic/bb774732(v=VS.90)

(PS:LVS_EX_CHECKBOXES设置项具有有核记风格,GetCheck可以用于判断一个项有无核记

LVS_EX_TRACKSELECT设置项具有热点风格,GetHotItem可获取当前鼠标热点项)

InsertColumn插入一列

InsertItem插入一行

SetItemText根据行列,设置一项数据

把列表控件改成“报告”风格

然后在初始化函数里添加以下语句:

//设置行列线和可以整行选中风格
 m_ListCtrl.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
 //插入三列
 m_ListCtrl.InsertColumn(0,"商品名称",LVCFMT_LEFT,100);
 m_ListCtrl.InsertColumn(1,"买入价格:元",LVCFMT_LEFT,100);
 m_ListCtrl.InsertColumn(2,"卖出价格:元",LVCFMT_LEFT,100);
 //插入一行
 m_ListCtrl.InsertItem(0,"洗衣粉",0);
 m_ListCtrl.SetItemText(0,1,"10");//设置0列1行数据
 m_ListCtrl.SetItemText(0,2,"15");

m_ListCtrl.InsertItem(1,"牙膏",1);
 m_ListCtrl.SetItemText(1,1,"8");
 m_ListCtrl.SetItemText(1,2,"12");

运行效果:

获取选中数据,可先用GetSelectionMark获取选中行,再用GetItemText获取具体内容,如果获取选中的商品名称:

int Sel=m_ListCtrl.GetSelectionMark();
 char str[52];
    m_ListCtrl.GetItemText(Sel,0,str,52);
 MessageBox(str);

 设置列表视图控件项行高及字体大小

过程跟设置菜单栏项高及字体大小一样,处理WM_MEASUREITEM和WM_DRAWITEM消息,不过是处理对话框里这两个消息,前面说过了,子窗口是接不到这两个消息的,所以不要给从CListCtrl派生下来的类添加这两个消息处理函数,处理父窗口的消息就行了,如果要子窗口接收到这两个消息,需要消息反射,这里就直接处理父窗口的消息了,关于用消息反射的方法将在后面介绍。因为是采用WM_DRAWITEM消息的方式自绘,所以列表框得改成"报告"风格,(剩下三种风格不支持).

(PS:后面才发现,直接重载父类的方法也可以,DrawItem方法,是个虚函数,而不必响应父窗口WM_DRAWITEM消息,再调用DrawItem函数,我只在自绘按钮控件中用过这个方法,因为其它的不能在界面重载这个方法,以为没有,也没怎么注意)

首先从CListCtrl类派生出子类CNewListCtrl,然后给CNewListCtrl类添加一个函数:
void NewListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

该函数代码如下:

void CNewListCtrl::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 // TODO: Add your message handler code here and/or call default
  // TODO: Add your code to draw the specified item   
 CDC dc;   
 dc.Attach(lpDrawItemStruct->hDC);
 CRect rect=lpDrawItemStruct->rcItem;
 dc.FillSolidRect(rect,RGB(38,255,147));
  CHeaderCtrl* pHeaderCtrl =GetHeaderCtrl();
int  colCount = pHeaderCtrl->GetItemCount();//获取列数量
 int line=lpDrawItemStruct->itemID;
 dc.SetTextColor(RGB(255,62,62));
 CFont Font;
 Font.CreatePointFont(125,"宋体");//创建字体
 dc.SelectObject(&Font);
 for(int col=0;col<colCount;col++)
 {
  CString str=GetItemText(line,col);//获取项文本
  int colWidth=GetColumnWidth(col);//获取列宽度
  dc.DrawText(str,rect,DT_VCENTER|DT_LEFT|DT_SINGLELINE);
  rect.left+=colWidth;
 }
 dc.Detach();
}
给父窗口(对话框)添加WM_MEASUREITEM和WM_DRAWITEM消息处理函数,两个函数代码分别如下:

void CSixthDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
 // TODO: Add your message handler code here and/or call default
   if(lpMeasureItemStruct->CtlType==ODT_LISTVIEW)
     lpMeasureItemStruct->itemHeight=25;//设置行高
   else
 CDialog::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}

void CSeventhDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
   if(lpDrawItemStruct->CtlType==ODT_LISTVIEW)
    m_ListCtrl.DrawItem(lpDrawItemStruct);//m_ListCtrl为列表控件关联的变量
      else
    CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

接下来给对话框添加一个列表控件,设置风格为“报告”,勾上“所有者绘制固定"并关联变量m_ListCtrl,类型CNewListCtrl(记得包含头文件)。

对话框初始化函数代码如下:

m_ListCtrl.SetExtendedStyle(LVS_EX_GRIDLINES);
 //插入三列
 m_ListCtrl.InsertColumn(0,"商品名称",LVCFMT_LEFT,100);
 m_ListCtrl.InsertColumn(1,"买入价格:元",LVCFMT_LEFT,100);
 m_ListCtrl.InsertColumn(2,"卖出价格:元",LVCFMT_LEFT,100);
 //插入一行
 m_ListCtrl.InsertItem(0,"洗衣粉",0);
 m_ListCtrl.SetItemText(0,1,"10");//设置0列1行数据
 m_ListCtrl.SetItemText(0,2,"15");

m_ListCtrl.InsertItem(1,"牙膏",1);
 m_ListCtrl.SetItemText(1,1,"8");
 m_ListCtrl.SetItemText(1,2,"12");

运行效果:

上面依然只是简单处理了一下项状态,甚至连选中的状态都没有处理,如果需要处理的话,可自行参考PDRAWITEMSTRUCT结构里的itemState变量解释

如:if(lpDrawItemStruct->itemState&ODS_SELECTED) //如果项被选

VC MFC列表视图(CListCtrl)控件相关推荐

  1. clistctrl获取列高 mfc_VC MFC列表视图(CListCtrl)控件

    列表视图控件 图标风格 CListCtrl类里要了解的函数 SetImageList为列表控件关联一个图像列表 InsertItem插入一项 GetSelectionMark获取选中项的索引 GetI ...

  2. VC/MFC中的CComboBox控件使用详解

    CComboBox控件详解 CComboBox控件又称作组合框控件,其有三种形态可供选择,1.简单组合框(Simple)2.下拉组合框(Drop-down)3.下拉列表式组合框(Drop-down l ...

  3. VC++ MFC获取对话框上控件的位置

    CRect rect;GetDlgItem(控件ID)->GetWindowRect(&rect);//获取控件的屏幕坐标 ScreenToClient(&rect);//转换为 ...

  4. MFC学习--下拉框、列表、树控件、选项卡

    下拉框.列表.树控件.选项卡 下拉框 属性 代码操作 列表控件 属性 代码操作 树控件 属性 代码操作 选项卡 属性 代码操作 文化建设 下拉框 属性 Data: 下拉可选项,用分号分隔( ; ) T ...

  5. MFC CListCtrl控件基本使用图解

    新建一个对话框工程:添加CListCtrl控件:为控件添加成员变量,如下图: 成员变量名称,m_ctrllist: 如下图,找到对话框初始化成员函数,转到定义,进入此函数代码: 找到 // TODO: ...

  6. CListCtrl控件详解

    1.视图类别 列表视图控件可用四种不同方式显示其内容,称之为"视图",有以下四个类别: 图标视图:每一项以全尺寸图标(32×32像素)出现,下面有一个标签.用户可在列表视图窗口拖动 ...

  7. MFC中动态创建控件以及事件响应实现方法

    本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态 ...

  8. MFC工程使用flash控件

    利用flash可以作出很漂亮的动画,想不想让自己的程序也有这样漂亮的界面呢?^_^,其实,要做到这点也不难.在这里将介绍怎样把falsh制作的界面嵌入到自己的程序中,并让flash动画和自己的程序进行 ...

  9. vc++6.0使用串口控件例程

    vc++6.0使用串口控件例程 1.建立项目: 打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest; 2.在项目中插入MSComm控件 选择Project菜单下Add To Pr ...

最新文章

  1. ubuntu mysql deb_Ubuntu 通过Deb 安装 MySQL 5.5 [转载]
  2. 在CentOS7上安装和使用ZooKeeper最新版本(V3.4.12)
  3. TensorRTSamplePython[end_to_end_tensorflow_mnist]
  4. 如果从零开始开发一款APP,需要做哪些准备
  5. java中运用数组排序_JAVA中运用数组的四种排序方法
  6. FlexPaper — 可以用来仿豆丁网、百度文库的PDF在线阅读功能
  7. MySQL卸载不干净问题
  8. RFC 2544 标准—以太网测试仪
  9. 【TencentOS tiny学习】源码分析(6)——互斥锁
  10. navigator 常用API的使用及其使用场景
  11. ‘data‘ hides member of supertype ‘BaseExpAdapter‘ and needs ‘override‘ modifier
  12. 麻省理工大学线性代数1806(2)消元法及矩阵消元法 矩阵行变换、列变换 置换矩阵 逆矩阵 如沐春风、如饮甘露、醍醐灌顶的线性代数
  13. 高频交易及化资策与区
  14. 如何右键菜单添加命令提示符_在右键菜单顶部添加过滤器命令
  15. android_Socket网络编程实现手机图片上传到电脑
  16. unity太空飞机射击游戏
  17. 计算机引起usb设备无法识别的原因有哪些,计算机无法识别USB设备是什么原因
  18. 中古调式(调式音阶)
  19. P2P网贷平台转型案例
  20. dvwa brute force(暴力破解)

热门文章

  1. n皇后问题c语言_用栈解决N皇后问题(C语言)
  2. android文件搜索广播,Android 实现无网络传输文件
  3. observable java_java源码阅读Observable(观察者模式)
  4. sqlserver 参数化查询 允许为null_关于SQL Server的insert执行的秘密(上)一个最简单的insert分析...
  5. 架构设计文档规范文档
  6. 回溯法采用的搜索策略_强化学习基础篇(三十四)基于模拟的搜索算法
  7. C语言学习笔记---结构体的定义和初始化
  8. Centos7.5 安装 mysql 5.7 ( 卸载自带 MariaDB)(实测)
  9. tensorflow数据读取机制
  10. MongoDB两阶段提交实现事务