MFC基本控件使用——列表控件(ListCtrl)

2023-10-27

咳咳,花了2天的时间,好好的把列表控件ListCtrl的基本使用研究了下。ListCtrl一共有4种样式:小图标、大图标、列表和报告。

其实呢,列表控件我们再熟悉不过了,因为当你随便打开一个文件夹的时候,显示的就是一个列表控件。不相信?那可以试着修改下查看方式,在查看方式中有小图标、大图标、列表和详细信息,分别对应的就是以上的4种样式。所以啊,列表控件使用到的地方其实是很多的。不过,我们在写程序的时候用到的最多的是report这种样式,也就是用来显示大量的数据用的。因此,在这篇文章里,主要就是介绍report样式的使用,前面的3种就不讲了。
1.首先说说ListCtrl最简单的使用,也就是数据的插入、删除等
先在XXXDlg.h头文件中为列表控件添加一个Control类型的变量
 CListCtrl m_list1;
再在XXXDlg.cpp源文件中的OnInitDialog()函数中给m_list1设定一些信息

 

 

// ListCtrl1

m_list1.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); // 整行选择、网格线

m_list1.InsertColumn(0, _T(""), LVCFMT_LEFT, 0);

m_list1.InsertColumn(1, _T("姓名"), LVCFMT_LEFT, 100); // 插入第2列的列名

m_list1.InsertColumn(2, _T("年龄"), LVCFMT_LEFT, 100); // 插入第3列的列名

m_list1.InsertColumn(3, _T("性别"), LVCFMT_LEFT, 100); // 插入第4列的列名

 

for(int i = 0;i <= 7;i++) {

strName.Format(_T("小石头%d"), i);

strAge.Format(_T("%d"), 20 + i);

strSex = i % 2 ? _T("男") : _T("女");

m_list1.InsertItem(i, _T("")); // 插入行

m_list1.SetItemText(i, 1, strName); // 设置第2列(姓名)

m_list1.SetItemText(i, 2, strAge); // 设置第3列(年龄)

m_list1.SetItemText(i, 3, strSex); // 设置第4列(性别)

}

这里牵涉到几个函数SetExtendedStyle()、InsertColumn()、InsertItem()、SetItemText()。下面一一介绍

 

(1)SetExtendedStyle()  设置列表控件的扩展样式

这里介绍几个常用的扩展样式:

 

 
  1. LVS_EX_CHECKBOXES每一行的最前面带个复选框

  2. LVS_EX_FULLROWSELECT整行选中

  3. LVS_EX_GRIDLINES网格线

  4. LVS_EX_HEADERDRAGDROP列表头可以拖动

给个MSDN的地址,里面有更多的样式:http://msdn.microsoft.com/zh-cn/library/bb774732.aspx

(2)InsertColumn()  插入1列

int InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1 )

 
  1. nCol 第几列

  2. lpszColumnHeading 列名

  3. nFormat 对齐的方式,有3种:LVCFMT_LEFT(左对齐)、LVCFMT_CENTER(居中)、LVCFMT_RIGHT(右对齐)

  4. nWidth 这1列的宽度

  5. nSubItem 子项的索引与列(一般缺省默认即可,不用填)

(3)InsertItem()  插入一行

int InsertItem(const LVITEM* pItem);//  可以插入图片(但是失败了,图片没能显示,所以这里不介绍尴尬)

int InsertItem(int nItem, LPCTSTR lpszItem) //  只能插入文字

 
  1. nItem 第几行

  2. lpszItem 这一行第1列的文字

(4)SetItemText()  设置文字

BOOL SetItemText(int nItem, int nSubItem, LPCTSTR lpszText);

 
  1. nItem 列表中的第几行

  2. nSubItem 列表中的低级列

  3. lpszText 要显示的文字数据

效果图:

到这里,最基本的操作就说完了。不过,这里面有一个小细节的地方。如果仔细看代码会发现,我把列表的第一列的宽度设置成了0,而SetItemText()的时候,第1列的数据也是没有插入。这是因为:列表控件的第一列好像是叫虚列,当大数据的时候好像能够利用这个加快速度什么的,具体我也不是很清楚。但就是因为这个原因,我们会发现,第一列无法设置里面的文本居中对齐!!!即使设置成居中,仍然是左对齐的效果(大家可以试试)。所以,为了能够居中的显示,我这里就放弃了第一列。不过,如果是要显示图片的,或者是有CheckBox的列表,一定要有这个虚列,不然图片和CheckBox就无法显示了。如果仅仅是简单的文字,倒是可以这样达到第一列居中的效果。

2.接着,再来说说列表控件中CheckBox的使用

同样的,和1基本一样,就是在设置扩展样式中多了一个LVS_EX_CHECKBOXES

 

// ListCtrl2

m_list2.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES);

m_list2.InsertColumn(0, _T("姓名"), LVCFMT_LEFT, 100);

m_list2.InsertColumn(1, _T("年龄"), LVCFMT_LEFT, 100);

m_list2.InsertColumn(2, _T("性别"), LVCFMT_LEFT, 100);

 

for(int i = 0;i <= 7;i++) {

strName.Format(_T("小石头%d"), i);

strAge.Format(_T("%d"), 20 + i);

strSex = i % 2 ? _T("男") : _T("女");

m_list2.InsertItem(i, _T(""));

m_list2.SetItemText(i, 0, strName);

m_list2.SetItemText(i, 1, strAge);

m_list2.SetItemText(i, 2, strSex);

}

那么怎么获取打了勾的行呢?这里我加了2个单选框:全选 和 反选

给全选单选框添加单击事件

 

 

void CXXXDlg::OnBnClickedRadioAllSelect()

{

for(int i = 0;i < m_list2.GetItemCount();i++) {

m_list2.SetCheck(i, TRUE);

m_list2.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);

}

}

给反选单选框添加单击事件
 

void CXXXDlg::OnBnClickedRadioInvertSelect()

{

BOOL state;

for(int i = 0;i < m_list2.GetItemCount();i++) {

state = m_list2.GetCheck(i);

if(state == FALSE) {

m_list2.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);

m_list2.SetCheck(i, TRUE);

}

else {

m_list2.SetItemState(i, ~LVIS_SELECTED, LVIS_SELECTED);

m_list2.SetCheck(i, FALSE);

}

}

}

这里又牵涉到几个函数GetCheck()、SetCheck()、GetItemState()、SetItemState()。

顾名思义,这几个函数的意思分别就是:获取和设置复选框的状态(打钩否)、获取和设置某一行的状态(选中否)。用法比较简单,看上面的例子就肯定知道了。

效果图:

3.最后,再介绍一下自绘ListCtrl

因为列表控件选中某一行的时候,高亮的颜色是蓝色,这点本人不是很喜欢。因为以前想做个类似QQ一样的好友列表的,一开始选的是用ListCtrl来显示(对好友不分类的情况下),但是选中某一行的颜色是蓝色太难看,所以也就放弃了。这次,决心要好好研究一下,所以在网上找了许多资料都是介绍怎么重绘的。后来在网上找到一个现成的CMyListCtrl的类,里面说是能设置奇行、偶行、热点行、选中的背景和文字的颜色。但是唯独选中行的颜色有点BUG,无法实现修改颜色。在多次尝试之后,终于发现BUG所在。修改过的代码:

 

void CListCtrlEx::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)

{

LPNMLVCUSTOMDRAW pNMCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);

int itemIndex = pNMCD->nmcd.dwItemSpec;

 

if (pNMCD->nmcd.dwDrawStage == CDDS_PREPAINT) {

*pResult = CDRF_NOTIFYITEMDRAW;

}

else if (pNMCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) {

// 选中行(鼠标选中的行)

if(GetItemState(itemIndex,LVIS_SELECTED) == LVIS_SELECTED) {

pNMCD->nmcd.uItemState = ~CDIS_SELECTED;

pNMCD->clrTextBk = m_selectItemBkColor;

pNMCD->clrText = pNMCD->clrFace = m_selectItemTextColor;

}

// CheckBox打钩行

else if(GetCheck(itemIndex) && (GetExtendedStyle() & LVS_EX_CHECKBOXES)) {

pNMCD->clrTextBk = m_selectItemBkColor;

pNMCD->clrText = m_selectItemTextColor;

}

// 热点行(鼠标停在上方)

else if(itemIndex==m_hoverIndex) {

pNMCD->clrTextBk = m_hoverItemBkColor;

pNMCD->clrText = m_hoverItemTextColor;

}

// 偶数行(比如 0、2、4、6)

else if(itemIndex % 2==0){

pNMCD->clrTextBk=m_evenItemBkColor;

pNMCD->clrText=m_evenItemTextColor;

}

// 奇数行(比如 1、3、5、7)

else{

pNMCD->clrTextBk = m_oddItemBkColor;

pNMCD->clrText = m_oddItemTextColor;

}

*pResult = CDRF_NEWFONT;

}

}

在这里,我在这个基础上,写了一个CListCtrlEx类,修改和加入了其他的一些功能,可以支持:

 

(1)奇数行背景颜色(默认白色)

(2)偶数行背景颜色(默认白色)

(3)热点行背景颜色(默认白色)

(4)选中行背景颜色(默认蓝色)

(5)奇数行文本颜色(默认黑色)

(6)偶数行文本颜色(默认黑色)

(7)热点行文本颜色(默认黑色)

(8)选中行文本颜色(默认黑色)

(9)点击列表头,对列表内的数据进行升序/降序排列

(10)双缓冲,解决了闪烁的问题

传1张简单的效果图:

https://img-my.csdn.net/uploads/201405/03/1399120330_1102.gif

CListCtrlEx类下载地址:

http://download.csdn.net/detail/smallstonesk/7288307

--------------------- 本文来自 SmallStoneSK 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/smallstonesk/article/details/24931273?utm_source=copy

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MFC基本控件使用——列表控件(ListCtrl) 的相关文章

  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • python通过docker打包执行

    背景 正常情况下 python脚本执行需要安装有python环境 那python环境虽然也可以通过移植的方法来安装 那总归是比较麻烦的 下面通过docker打包的方式来执行python脚本 1 安装python镜像 准备两个文件即可 doc
  • 前端LayUI框架快速上手实现登入注册

    目录 一 Layui简介 1 什么是LayUI 2 LayUI的特点 二 LayUI入门 1 LayUI下载 2 LayUI入门使用 2 1 在web项目中导入LayUI文件中的layui文件 2 2 在JSP页面引入css js文件 2
  • linux建立虚拟内存,如何在Linux环境下建立虚拟内存

    虚拟内存是将硬盘规划出一个区间用来读取数据的空间 但是有很多用户们都不知道Linux环境下如何建立虚拟内存 那么现在我们就一起跟小编去看看具体内容吧 在Linux 下就是建立swap file 基本步骤 先建立swap这个装置或是档案后 将
  • Java程序员到架构师的推荐阅读书籍

    Java程序员到架构师的推荐阅读书籍 作为Java程序员来说 最痛苦的事情莫过于可以选择的范围太广 可以读的书太多 往往容易无所适从 我想就我自己读过的技术书籍中挑选出来一些 按照学习的先后顺序 推荐给大家 特别是那些想不断提高自己技术水平
  • Python文件读写

    Python的文件操作函数 open filename mode 文件打开模式 执行操作 r 以只读方式打开 默认 w 以写入的方式打开文件 会覆盖已经存在的文件 x 如果指定文件已经存在 使用此模式打开将引发异常 a 以写入模式打开 如果
  • 分治法求解汉诺塔问题

    汉诺塔问题简介 汉诺塔 又称河内塔 问题是源于印度一个古老传说的益智玩具 大梵天创造世界的时候做了三根金刚石柱子 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上 并且规定
  • GD32E230使用J-LINK下载调试问题

    1 无法识别到GD32的芯片 j link的版本要V9的才行 也就是下图的HW版本V9 4 之前是V7一直无法识别 换成V9的j link之后就可以了 2 打开J link的setting时弹出盗版警告 Warning the connec
  • Dialog居中显示

    最新使用Dialog时 发现在以下低版本系统中会出现Dialog弹窗在左上角显示的情况 搜索了一下 发现了这个方法 记录一下 dialog 居中显示 Window window dialog getWindow if dialog null
  • C++中私有变量的值想怎么改就怎么改

    这应该算是C 的一个不足吧 C 是优秀的编程语言 但不是完美的 include
  • Mybatis-plus中,如何提前获取实体类用雪花算法生成的ID?

    Mybatis plus中 通过设置 TableId可以让Mybatis plus自动为我们生成雪花算法的ID号 该ID号是一个长整型数据 非常方便 但是雪花算法的ID号是在Insert执行的时候生成的 我们在Insert执行前是不知道En
  • 论文期刊分类学习记录

    SCI主要偏重理论性研究 EI偏工程应用 SCI源刊 gt SCI会议 gt EI源刊 影响因子较好 gt 既是中文核心又是EI源刊的期刊 gt EI源刊 影响因子一般 gt EI会议 权威会议 gt 中文核心期刊 南大核心 CSCS gt
  • SQL开窗函数(窗口函数)详解

    一 什么是开窗函数 开窗函数 分析函数 over 开窗函数也叫分析函数 有两类 一类是聚合开窗函数 一类是排序开窗函数 开窗函数的调用格式为 函数名 列名 OVER partition by 列名 order by列名 如果你没听说过开窗函
  • java8 list根据实体单字段、多字段分组。去重

    Map
  • boost静态链接库和c++/clr不兼容问题:未能加载文件或程序集,不是有效的Win32应用程序。

    项目上遇到的问题 c 编写的类使用托管c 包装成dll提供给c 项目使用 c 需要使用boost clr 项目目标平台都是win32 x86 开发环境win10 x64系统 vs2013 Net Framework 4 0 boost 1
  • Node之加密与解密处理

    crypto模块概述 在Node js中 使用OpenSSL类库作为其内部实现加密与解密处理的基础手段 这是因为目前OpenSSL已经成为了一个经过严格测试的可靠的加密与解密算法的实现工具 在Node js中 OpenSSL类库被封装在cr
  • 以太坊智能合约编程入门(一)

    原文地址 https medium com ConsenSys a 101 noob intro to programming smart contracts on ethereum 695d15c1dab4 1 ABBewYWJfdIFh
  • SMBMS项目

    一 准备工作 1 基本架构 2 在数据库中创建对应的表 对应数据库代码如下 CREATE DATABASE smbms USE smbms DROP TABLE IF EXISTS smbms address CREATE TABLE sm
  • 网络通信,UDP通信,TCP通信

    网络通信3要素 要素1 IP地址 IP地址操作类 InetAddress package com heima test import java net InetAddress import java net UnknownHostExcep
  • Python入门到机器学习再到深入学习及应用整个学习系统

    就在昨天我们收到了一位刚拿到Google offer的九章学员发来的截图 作为一名同是转专业到cs的程序猿 对此猿我定要表示万分真心的理解和祝贺 其中滋味 唯吾猿类方懂 此外这位细心的猿还找到了老师当时告诉她的6个妙招分享给大家 如上 在祝
  • MFC基本控件使用——列表控件(ListCtrl)

    咳咳 花了2天的时间 好好的把列表控件ListCtrl的基本使用研究了下 ListCtrl一共有4种样式 小图标 大图标 列表和报告 其实呢 列表控件我们再熟悉不过了 因为当你随便打开一个文件夹的时候 显示的就是一个列表控件 不相信 那可以