VC++列表控件的编写

VC++ 如何向一个列表控件中动态添加复选框 声明:由于自己的编程需要,这里的列表控件只有一列,是list样式。 1.首先给列表控件关联一个成员变量,例如: DDX_Control(pDX, IDC_LIST_DtvParent, m_listDtvParent); 2.定义一个int型的变量,就是指示在列表控件中哪个位置添加复选框,并且在源文件的构造函数中初始化为0; int i_indexTvParent;//头文件声明i_i 阅读详情

1.CListCtrl控件

CListCtrl控件在数据库编程中是用得比较多的控件之一,也是Window控件中较难掌握的一个控件。他可以有四显示方式,Report、List、Icon、SmallIcon。Report报告式列表视图方式在数据库开发中是最常用的一种方式。在控件"properties"的Styles选项卡中在View项可以选择Report方式。Report方式中列表控件的显示方式是有行和列的,行又叫做Item,但有多列是我们只能操作每一行的第零列,也就是最前列。

2.与CListCtrl控件相关的数据类型

(1)LV_COLUMN结构

该结构仅用于报告式列表视图,用来描述表项的某一列。要想向表项中插入新的一列,需要用到该结构。

LV_COLUMN结构定义如下:

typedef struct_LV_COLUMN{

UINT mask;         //屏蔽位的组合,表明哪些成员是有效的

int fmt;          //该列的表头和子项的标题显示格式(LVCF_FMT)

int cx;           //以象素为单位的列的宽度(LVCF_FMT)

LPTSTR pszText;   //指向存放列表头标题正文的缓冲区(LVCF_TEXT)

int cchTextMax;   //标题正文缓冲区的长度(LVCF_TEXT)

int iSubItem;     //说明该列的索引(LVCF_SUBITEM)

}LVCOLUMN;

(2)LV_ITEM结构

该结构用来描述一个表项或一个子项,它包含了项的各种属性,定义为:

typedef struct_LV_ITEM{

UINT mask;         //屏蔽位的组合,表明哪些成员是有效的

int iItem;        //从0开始编号的表项索引(行索引)

int iSubItem;     //从1开始编号的子项索引(列索引),因为编号0的列使用InsertItem时已经写入数据

UINT state;        //项的状态(LVIF_STATE)

UINT stateMask;    //项的状态屏蔽

LPTSTR pszText;    //指向存放项的正文的索引区(LVIF_TEXT)

int cchTextMax;   //标题正文缓冲区的长度(LVCF_TEXT)

int iImage;       //图标的索引(LVIF_IMAGE)

LPARAM lParam;     //32位的附加数据(LV_PARAM)

}LV_ITEM;

3.CListCtrl类的成员函数

(1)列的插入和删除项

在初始化列表视图时,先要调用InsertColumn插入各个列,该函数的声明为:

int InsertColumn(int nCol,const LV_COLUMN *pColumn);

其中参数nCol是新列的索引,参数pColumn指向一个LV_COLUMN结构,函数根据该结构来创建新的列。若插入成功,函数返回新的索引;否则返回-1。

要删除某列,应调用DeleteColumn()函数,其声明为:

BOOL DeleteColumn(int nCol);

(2)表项的插入

要插入新的表项,应调用InsertItem。如果要显示图标,则应该创建一个CImageList对象并使该对象包含用作显示图标的位图序列,然后调用

SetImageList为列表视图设置位图序列。函数的声明为:

int InsertItem(const LV_ITEM *pItem);

或者

int InsertItem( int nItem, LPCTSTR lpszItem);

int InsertItem( int nItem, LPCTSTR lpszItem, int nImage );

使用的时候多用第二种和第三种。因此省去了定义并初始化LV_ITEM数据类型这一步。

参数pItem指向一个LV_ITEM结构,该结构提供了对表项的描述。若插入成功,返回新表项的索引;否则返回-1。

参数nItem是表项的索引(行索引,从0开始);参数lpszItem为控件头的名字。

(3)函数GetItemText()和函数SetItemText()用于查询和设置表项以及子项显示的正文。

SetItemText()函数的一个重要用途就是对子项进行初始化。函数声明为:

int GetItemText(int nItem,int nSubItem,LTPSTR lpszText,int nLen) const;

CString GetItemText(int nItem,int nSubItem) const;

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

其中,参数nItem是表项的索引(行索引),nSubItem是子项的索引(列索引),若nSubItem为0说明函数是针对表项的。参数lpszText指向正文缓冲区,参数nLen说明缓冲区的大小。

4.例1:在一个对话框中初始化列表框

在对话框的初始化函数中添加对CListCtr控件的初始化代码

BOOL CDlgall::OnInitDialog()

{

CDialog::OnInitDialog();

LV_COLUMN lvc;        //定义一个LV_COLUMN数据类型用来描述一个列

char *display[4]={"学号","姓名","性别","出生日期"};

        lvc.mask = LVCF_FMT|LVCF_TEXT|LVCF_SUBITEM|LVCF_WIDTH;

lvc.fmt = LVCFMT_LEFT;        //设置对齐方式

lvc.cx = 80;                  //设置各列的宽度为80象素

for(int i = 0; i < 4; i++)    //插入各列的表头

{

   lvc.iSubItem = i;

   lvc.pszText = display[i];

   m_List.InsertColumn(i,&lvc); //设置的是第i列的表头,具体样式以定义的lvc的属性为准

   //上句等价于m_List.InsertColumn(i,display[i],LVCF_LEFT,80); 即设置各列表头的样式

}

m_List.SetExtendedStyle(m_List.GetExtendedStyle()|LVS_EX_FULLROWSELECT);

//改变列表控件的显示风格为全部选中状态

CDlgall::OnLoadAll();

return TRUE; // return TRUE unless you set the focus to a control

               // EXCEPTION: OCX Property Pages should return FALSE

}

例2:从数据源中读取数据并在列表控件中进行显示

void CDlgall::OnLoadAll()

{

char buffer[256];

m_List.DeleteAllItems(); //清空所有条目

if(!pset->IsOpen())       //判断记录集是否打开。如果关闭就打开记录集

   pset->Open();

CString str1;

pset->MoveFirst();        //将游标指向记录集的第一条记录

for(int i = 0;!pset->IsEOF();i++)   //插入表项

{

     m_List.InsertItem(i,LPCTSTR(pset->m_number));

     //InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据)

     //以后各列使用SetItemText()函数来存放数据。

    

    m_List.SetItemText(i,1,LPCTSTR(pset->m_name));

    //设置第i行第1列的的数据为数据源中读取的当前记录某个字段的值

    

     m_List.SetItemText(i,2,LPCTSTR(pset->m_sex));   //以下类似

     str1 = pset->m_date.Format("%x");              

     m_List.SetItemText(i,3,str1);

     pset->MoveNext();           //游标下移

}

SetDlgItemText(IDC_EDIT2,itoa(pset->GetRecordCount(),buffer,10));

//获取总的记录数并在控件IDC_EDIT2中进行显示

pset->Close();

}

例3.点击列表控件的列时实现自动排序

(1)首先在对话框的头文件中加入自定义排序函数SortList(CString &str)的函数声明。

(2)然后定义SortList()函数

void CDlgall::SortList(CString &str)

{

    m_list.DeleteAllItems(); //清空所有条目

    pset->m_strSort = str;    //设定要排序的字段

    CDlgall::OnLoadAll();     //显示所有记录

    return;

}

说明:成员m_strSort是CRecordset类的公共成员数据,用于指定排序。m_strSort实际上包含了ORDER BY子句的内容,但它不含ORDER BY关键字。m_strSort的一个例子为:

m_pSet->m_strSort=“name DESC”; //按CourseID的降序排列记录

m_pSet->Open();

(3)为列表控件的LV_COLUMNCLICK消息添加消息响应函数

void CDlgall::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult)

{

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

//根据列字段进行排序

switch(pNMListView->iSubItem)

{

case 0:

   Sortlist(CString("number"));

   break;

case 1:

   Sortlist(CString("[name]"));

   break;

case 2:

   Sortlist(CString("[date]"));

   break;

case 3:

   Sortlist(CString("[sex]"));

   break;

case 4:

   Sortlist(CString("[age]"));

   break;

}

*pResult = 0;

}

例4 双击CListCtrl中的某条记录进行修改

void CDlgall::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)

{

    CDlgall::OnModify(); //双击某条记录则表示要修改记录

    *pResult = 0;

}例5 根据输入的字段进行查询

void CDlgall::OnFind()

{

    m_List.DeleteAllItems(); //清空列表以显示查询到的记录

    UpdateData(true);  

    //对m_number进行字符处理,根据检查号位数在检查号前加零

    int len = strlen(m_number);

    char temp[10];

    switch(len) {

        case 1:

            strcpy(temp,"00000");break;

        case 2:

            strcpy(temp,"0000");break;

        case 3:

            strcpy(temp,"000");break;

        case 4:

            strcpy(temp,"00");break;

        case 5:

            strcpy(temp,"0");break;

        default:

                strcpy(temp,"");

    }

    strcat(temp,m_number);

    m_number =temp;

    //查找对应的参数

    CSetdata*pset = new CSetdata();

    pset->m_strFilter = "number=?"; //设定过滤记录集的参数

    pset->Open();

    pset->number = m_number;

   pset->Requery(); //查询到符合条件的所有记录,并存放在记录集中

    //在列表控件中显示记录

    CString str1;

    if(!pset->IsEOF())

    {

        //以下插入单条记录

        char buffer[256];

        LV_ITEM lvi;

        lvi.mask = LVIF_TEXT;

        lvi.iSubItem = 0;

        int i = 0;

        m_List.InsertItem(i,LPCTSTR(pset->m_number),0);

        m_List.SetItemText(i,1,LPCTSTR(pset->m_name));

        str1 = pset->m_date.Format("%x");

        m_List.SetItemText(i,2,str1);

        m_List.SetItemText(i,3,LPCTSTR(pset->m_sex));

        m_List.SetItemText(i,4,LPCTSTR(ltoa(pset->m_age,buffer,10)));

        m_List.SetItemText(i,5,LPCTSTR(pset->m_zy));

        m_List.SetItemText(i,6,LPCTSTR(pset->m_mode));

        m_List.SetItemText(i,7,LPCTSTR(pset->m_bl));

        pset->Close();

    }

    else

    {

        CDlgall::OnLoadAll(); //如果没有找到相关记录,显示所有的记录

        AfxMessageBox("对不起,没有相关记录!");

    }  

VC++ 列表控件应用 声明:该程序的两个列表控件都是list样式,由于自己的需要,只有一列。 1.创建一个基于对话框的MFC应用程序,设置界面如下: 左边列表控件ID为IDC_LIST1,右边为IDC_LIST2,四个按钮ID从上到下依次是IDC_BUTTON1,IDC_BUTTON2,IDC_BUTTON3,IDC_BUTTON4; 2.分别为两个列表控件关联成员变量,效果如下: DDX_Contro 阅读详情

相关推荐

图解VC++版PE文件解析器源码分析

该源码下载自 http://download.youkuaiyun.com/download/witch_soya/4979587 1 Understand 分析的图表

bcbobo21cn的专栏 4323

MFC CListCtrl 虚拟列表使用详解

CListCtrl 是MFC 库的一个列表控件,用于显示数据的。可以通过 InsertItem 快速向列表添加一行数据,并且用 SetItemText 设置其后面列的数据项。但是本篇文章重点不是介绍 CListCtrl 控件的基本使用方法,而是介绍 CListCtrl 的扩展功能“虚拟列表”。使用 InsertItem 方法可以显示少量数据,但是数据量大或者是频繁刷新列表数据时,会出现缓慢甚至卡顿的现象。虚拟列表可以很好的解决该问题。1、处理 LVN_GETDISPINFO 消息。

baidu_15765107的博客 6332

VC++环境下Win32列表控件编程实践

在现代的软件开发中,列表控件是不可或缺的用户界面元素,用于展示和管理有序信息。在Windows编程中,Win32 API提供了丰富的API函数,用以创建和管理列表控件。本章将探讨Win32 API的基础知识,并介绍列表控件的核心概念和基础功能。我们将从历史背景开始,了解列表控件在不同版本Windows操作系统中的演变,进而深入探讨如何利用Win32 API实现自定义的列表控件,为后续使用高级框架如MFC和.NET进行列表控件开发打下坚实的基础。

weixin_42593549的博客 980

MFC高级控件之列表视图控件(CListCtrl)

本文详细介绍了列表视图控件,并以一个实例演示了其常用成员函数的使用方法。

billliu66的博客 5838

VC++ 实现查看当前运行程序进程的列表控件

MFC(Microsoft Foundation Classes)是微软公司提供的一套类库,旨在简化Windows应用程序的开发。MFC封装了大量Windows API,让开发者可以更容易地使用面向对象的方式来构建Windows应用程序。MFC设计上遵循了文档-视图架构模式,这种模式有效地将应用程序的数据模型和用户界面分离,为开发者提供了清晰的逻辑分层。在报告视图中,可以根据需要自定义列头和列类型来展示更加丰富的信息。自定义列头// 添加带有图标和子标题的列头设置列类型。

weixin_32312889的博客 1156

基于VC++的SuperGrid高级列表控件开发与实战

通过消息,我们可以接管每一行的绘制过程:// 渐变背景// 图标叠加结合双缓冲 (),彻底解决闪烁问题,画面稳如老狗 🐶。SuperGrid 的诞生,不仅仅是为了替代CListCtrl,更是为了回答一个问题:在现代软件工程中,我们该如何对待那些“老旧但可靠”的技术组件?答案是:尊重历史,拥抱变化,用工程思维让经典焕发新生。它不是一个封闭的黑盒,而是一个开放的平台。

weixin_33068055的博客 340

CListCtrl控件用法

列表控件是基本经常用到的控件,这里总结一下,方便以后使用。 需要设置的属性 View->Report:一般为报表 Edit Labels->TRUE:控件可以重命名 Always Show Selection->TRUE:设置选中焦点 变量绑定控件 CListCtrl m_list;//列表控件 void CControlDlg::DoDataExchange(CData...

滴水穿石的博客 2152

硬件测试之—纹波测试为什么不要使用接地夹子

示波器为什么不推荐使用接地夹

qq_19294353的博客 2988

CListCtrl控件详解

Create创建列表控件并将其附加给CListCtrl对象。

milanleon的专栏 2万+

摄像机实时接入分析平台视频分析网关AI智能分析智慧营业厅方案

通过智能化的改造,可以提高营业厅的运营效率,降低运营成本,同时提升客户体验和安全保障。

EasyDarwin开源社区技术博客 703

C51单片机驱动ILI9341彩屏实战:从Proteus仿真到绘制自定义图案(附完整代码)

本文详细介绍了使用C51单片机驱动ILI9341彩屏的完整实战流程。内容涵盖硬件连接、8080并行接口时序模拟、寄存器初始化、屏幕方向设置以及基本图形绘制原理,并重点讲解了如何在Proteus仿真环境中搭建电路、调试代码,最终实现自定义图案的显示。文章提供了完整的代码示例,为嵌入式开发学习者和复古硬件爱好者提供了一套可行的解决方案。

rnn9storyteller的博客 511

mfc之CListCtrl控件的使用

第一步,在对话框上添加,CListCtrl控件,并添加变量为m_listHistory; 第二步,设置CListCtrl控件的风格,具体代码如下: LONG lStyle; lStyle = GetWindowLong(m_listHistory.m_hWnd, GWL_STYLE);//获取当前窗口style lStyle &= ~LVS_TYPEMASK; //清除显示方式位 lStyle |= LVS_REPORT; //设置style SetWindowLong(m_listHisto

Do best for you 771

Axure原型模板与元件库APP交互设计素材(附资料)

在Axure中,手机模型是展示APP或小程序界面效果的重要工具。通过导入手机模型元件,设计师可以更加直观地模拟真实设备的显示效果,从而更准确地评估设计的可行性和用户体验。Axure官方及第三方资源库中提供了多种品牌和型号的手机模型,如iPhone、Android等,设计师可以根据项目需求选择合适的模型进行使用。Axure作为一款强大的原型设计工具,为APP和小程序的设计与开发提供了丰富的界面组件元件库和交互设计素材。

招风的黑耳优快云 1981

在(CListView)列表视图中添加右键菜单的方法 (转)

  大家好,这是我的Blog第一篇文章,就用我最常用的列表视图做开始吧,我要做的功能就是在列表框上添加一个右键菜单,同时提示当前选中的文本内容,功能很简单,而且是在别人的基础上改编的,不过,一切事情都是从最简单的事情开始的,“天下难事,必做于易;天下大事,必做于细”,况且,只有站在别人的肩膀上才能看的更远,J,闲言少叙,书规正传。在codeproject网站中(http://www.cod

风云爱飞 989

YOLOv10精度上不去?QAT量化感知训练全流程,INT8推理mAP只掉0.8%

普通PTQ量化虽简单,但无法应对YOLOv10的小目标特征和激活分布波动,导致精度暴跌。QAT通过“模拟量化误差+联合优化权重与量化参数”,让INT8模型精度接近FP16,同时速度提升1.8倍,完美适配实时检测场景(如安防监控、自动驾驶)。该流程已在工业级项目中验证,针对YOLOv10的优化策略(敏感层保护、小目标加权、分阶段训练)可直接迁移至其他YOLO系列(v8/v9),量化后精度损失均可控制在1%以内。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 916

智能家居系统设计:基于MATLAB的智能家居系统设计和仿真,包括智能家居控制、家庭能源管理和家庭安全监控

基于 MATLAB 的智能家居系统设计方法可以有效地解决各类智能家居问题。

走向CTO的路上... 1775

在VC++6.0下构建可直接编辑的列表控件类

在VC++6.0下构建可直接编辑的列表控件类 刘  娅摘要 MFC中的CListCtrl类用于封装列表控件的各种操作,但CListCtrl类不支持直接编辑。本文介绍在VC++6.0中以CListCtrl类为基类构建可直接编辑的列表控件类的方法,并提供一个可运行的实例。关键词 CListCtr

JiangRB的专栏 3933

Open3D 球旋转算法(BPA)三维建模【2026最新版】

球旋转算法,博客长期更新,本文最新更新时间为:2026年4月11日。

点云侠的博客 37万+

MFC_VC++_时间获取与保存列表控件内容到文件操作方法

MFC_VC++_时间获取与保存列表控件内容到文件操作方法,excel void CDataView::OnBnClickedBtnExporttoexcel() { CTime time = CTime::GetCurrentTime(); CString strRptTime = time.Format("%Y%m%d%H%M%S"); CString strRptTime1 ...

Txwtech 661

vue3+ts+elementui-plus二次封装树形表格实现不同层级展开收起的功能

我只定义了三层数据,就只演示展开了三层,还可以多层,自己设置即可。

蜗牛~~ 2603

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

MFC VC++6.0列表控件的使用

一、创建 创建列表控件,IDC_LIST1 列表视图控件有4种风格:Icon、Small Icon、List和Report。下面简单说下4种风格各自的特点:Icon大图标风格:列表项的图标通常为32×32像素,在图标的下面显示标签。Icon大图标风格:列表项的图标通常为32×32像素,在图标的下面显示标签。Small Icon小图标风格:列表项的图标通常为16×16像素,在图标的右面显示标签。

rivendless的专栏 5739

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

MFC中列表控件的使用

列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值。 MFC中使用CListCtrl类来封装列表控件的各种操作。 通过调用BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );创建一个窗口,dwStyle中可以使用以下一些列表控件的专用风格: L

未晚的专栏 2370

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

VC++ 保存 MFC 列表控件(IDC_LST_Table)中的数据到 TXT 文件

最简单的例子是: 写入到文件: FILE * fp; fp = fopen("c:\\aaa.txt", "a+"); fwrite("aaaaa", strlen("aaaaa"), 1, fp); fclose(fp); 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 现在要把以下四项写入txt文件 int m_iRock

wukai0909的博客 1780

VC++之列表控件(CListCtrl)中加入复选框

VC++之列表控件(CListCtrl)中加入复选框 标签:列表控件中加入复选框   目的:使列表框(CListCtrl)的每个项(item)前面有个复选,用来标明是否选中,提交数据是只选择选中的 方法:为列表框(CListCtrl)多加一个LVS_EX_CHE

特权份子的专栏 1339
上一篇: 深度解析VC中的消息
下一篇: CString.Format 用法
Elecsoft
博客等级 码龄17年 32粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值