VC中使用ListCtrl和LVITEM 经验总结

VC/MFC列表CListCtrl类的LVCOLUMN和LVITEM详解 <br />列表视图控件(List Control)<br />列表视图控件是一种非常常用的控件,在需要以报表形式显示数据时,列表控件通常是最好的选择,许多专用的数据报表控件,也是在它的基础上派生而来。与树视图类似,列表控件可以由多个子项目组成,并且支持大图标、小图标、列表和报表4种方式显示信息,如图1所示。<br />图1 列表视图的4种显示方式<br />列表视图包含一个项目列表,而其中每个项目由图标、项目名称和多个子项组成,每一个子项所包含的项目的数目必须相同,属性相同的每个子项显示在同一个列中。列表 阅读详情
转自:http://hi.baidu.com/gouya/blog/item/8f2c033327142af21a4cffcc.html

ListCtrl在工作中,常常用到,也常常看到大家发帖问怎么用这个控件,故总结了一下自己的使用经验,以供参考使用。

先注明一下,这里,我们用m_listctrl来表示一个CListCtrl的类对象,

然后这里我们的ListCtrl都是report形式,至于其他的如什么大图标,小图标

的暂时不讲,毕竟report是大众话的使用。其次,我们这里用条款一,条款二

来描述第一点,第二点,这个是参照《Effective C++》的叫法,俺觉得这么

叫比较COOL :)

条款一:设置ListCtrl的风格

在优快云上常常看到有人问怎么设置风格的,他们ListCtrl的样子是一个列表

,有横条和竖条分界线,然后选中一行,要整一行都选中,而不是只有某一列

被选中,等等,这里给一个比较全面的设置方法。

//获得原有风格
DWORD dwStyle = ::GetWindowLong(m_listctrl.m_hWnd, GWL_STYLE); 
dwStyle &= ~(LVS_TYPEMASK);
dwStyle &= ~(LVS_EDITLABELS);

//设置新风格
     SetWindowLong(m_listctrl.m_hWnd, GWL_STYLE, 

dwStyle,|LVS_REPORT|LVS_NOLABELWRAP|LVS_SHOWSELALWAYS);


//设置扩展风格
DWORD styles = 

LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES;

ListView_SetExtendedListViewStyleEx(m_listctrl.m_hWnd, styles, 

styles );

其中LVS_EX_FULLROWSELECT 就是前面说得整行选中

LVS_EX_GRIDLINES 网格线(只适用与report风格的listctrl)

LVS_EX_CHECKBOXES 前面加个checkbox

pListCtrl->SetExtendedStyle(   m_listctrl.GetExtendedStyle()

|LVS_EX_SUBITEMIMAGES);


这也是一个很重要的属性,这样的话,可以在列表中加ICON,记得windows的

任务管理器吗,你想做得那样,这个属性也要加哦,这个我以后会讲的~

条款二:加入列头

这是一个比较实质的东西,给列表框分列,然后加上列头

代码说话,来了

TCHAR rgtsz[2][10] = {_T("列头1"), _T("列头2")};

LV_COLUMN lvcolumn;
CRect rect;
m_listctrl.GetWindowRect(&rect);
for(int i=0;i<2;i++)
{
    lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT 
               | LVCF_WIDTH | LVCF_ORDER;
    lvcolumn.fmt = LVCFMT_LEFT;
    lvcolumn.pszText = rgtsz[i];
  lvcolumn.iSubItem = i;
    lvcolumn.iOrder = i;
  if(i==0)
    {
       lvcolumn.cx = rect.Width()*3/5 ; 
  }
  else
      lvcolumn.cx = rect.Width()*2/5;
       

m_listctrl.InsertColumn(i, &lvcolumn);
 }

这是插入两列的做法,你要插入20列??随便你,依样画葫芦~~

lvcolumn.mask 中那个mask可以有各种属性,具体去看msdn吧,



条款三:把记录,插入列表框中

int nIndex = m_listctrl.GetItemCount();

   LV_ITEM    lvitemAdd = {0};
   lvitemAdd.mask = LVIF_TEXT;
   lvitemAdd.iItem = nIndex ;
   lvitemAdd.iSubItem = 0;
   lvitemAdd.pszText =_T("毛毛1");;

  
   if (m_listctrl.InsertItem(&lvitemAdd) != -1)
   { 
    LV_ITEM lvitem = {0};
    lvitem.mask = LVIF_TEXT;
    lvitem.iItem = nIndex ;
    lvitem.iSubItem = 1;

    lvitem.pszText =_T("毛毛2");
    m_listctrl.SetItem(&lvitem);
   
   }

nIndex 是当前的行数,然后把新的一行,插在最下面,



条款四:给列表中插入图标

在report格式中,也能插入图标

继续代码说话

m_image是个CImageList对象

m_image.Create(16,16, TRUE|ILC_COLOR24, 3, 1);

m_listctrl.SetImageList(&m_image,LVSIL_SMALL);

然后调用CImageList的成员函数int CImageList::Add( HICON hIcon );

把ICON插入到imagelist,

然后在插入记录的时候

lvitemAdd.mask = LVIF_TEXT; -》 lvitemAdd.mask = 

LVIF_TEXT|LVIF_IMAGE

然后添加一个lvitemAdd.iImage = n;

这个n是imagelist中的序号,表示是具体的哪一个图标,list么,呵呵



条款五: 插入记录时使用额外的信息,lParam 的使用

有时候,你想对于某一行,加入一些额外的信息,那么就可以使用这个

lParam 

msdn是这么描述的Specifies the 32-bit value of the item

我上次是为了在某一行加入一个信息,窗口句柄,然后是这么加的,

int nIndex = m_listctrl.GetItemCount();

   LV_ITEM    lvitemAdd = {0};
   lvitemAdd.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
   lvitemAdd.iItem = nIndex ;
   lvitemAdd.iSubItem = 0;
   lvitemAdd.pszText =_T("毛毛1");;

   lvitemAdd.iImage = n;
   lvitemAdd.lParam = (LPARAM)hwnd;(某个窗口的窗口句柄)


   if (m_listctrl.InsertItem(&lvitemAdd) != -1)
   { 
    LV_ITEM lvitem = {0};
    lvitem.mask = LVIF_TEXT;
    lvitem.iItem = nIndex ;
    lvitem.iSubItem = 1;

    lvitem.pszText =_T("毛毛2");
    m_listctrl.SetItem(&lvitem);
   
   }

ok,这是一个比较全的例子的,又插ICON,又使用PARAM的

条款六 : 点击列表框,获取选中行信息

响应NM_CLICK消息,如果你有MSDN,可以看到,有专门关于listview的

NM_CLICK的介绍

void CMyDlg::On ItemClick(NMHDR* pNMHDR, LRESULT* pResult) 
{
// TODO: Add your control notification handler co de here
int nItem = -1;

LPNMITEMACTIVATE lpNMItemActivate = (LPNMITEMACTIVATE)pNMHDR;

if(lpNMItemActivate != NULL)
{
      nItem = lpNMItemActivate->iItem;
}

} 

现在nItem就是点击选中那行的index了,有了index,获取那行的信息还难吗

?

懒汉说:难,因为你还没讲,晕,那就继续说



条款七: 根据行的index,获取该行的信息

直接上代码吧

LV_ITEM lvitem = {0};
    lvitem.iItem = nIndex;
    lvitem.iSubItem = 0;
    lvitem.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;

m_listctrl.GetItem(&lvitem)

这样,就把nindex,第一列的信息取出来了,包括刚才我们加入的ICON,和那个

额外信息(窗口句柄),

比如我要获取窗口句柄,就可以hwnd = (HWND)lvitem.lParam; 

mask 用来指明你想获取那些信息

具体可以查msdn中LVITEM Structure的定义和CListCtrl::GetItem



条款八:用程序选中某一行,使之选中

选中之 

m_listctrl.SetItemState

(nIndex,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);

不选中,取消选中之

m_listctrl.SetItemState(nIndex,0,LVIS_SELECTED|LVIS_FOCUSED);



条款九:获取当前所有选中的行(多选)

这个,俺就比较懒了,抄msdn的代码吧,反正很简单



Example
// CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem

(IDC_YOURLISTCONTROL);
ASSERT(pListCtrl != NULL);

POSITION pos = pList->GetFirstSelectedItemPosition();
if (pos == NULL)
    TRACE0("No items were selected!\n");
else
{
   while (pos)
   {
      int nItem = pList->GetNextSelectedItem(pos);
      TRACE1("Item %d was selected!\n", nItem);
      // you could do your own processing on nItem here
   }
}



条款十:删除条款九中选中的行

这个相对前面九个条款是比较麻烦的,因为如果你要删除多行的话。往往要出错

比如,我现在要删除第0行和第1行(列表的行序列是从0开始的)

那么好啊。我来删了

m_listctrl.DeleteItem(0)

         m_listctrl.DeleteItem(1)

恭喜你,错了,我好开心啊 :)

因为你删除第0行以后,下面的行会往上移,那么原来的第1行就变成了第0行,那么你再 m_listctrl.DeleteItem(1),那么删除的是原来的第2行,真麻烦,

所以,只有从下往上删,才是安全的,先删的,不会影响后面的操作,

m_listctrl.DeleteItem(1)

         m_listctrl.DeleteItem(0)

但有时候,我们也不知道要删除哪些行,只知道要删除选中的那些行,像条款九中的那些

如果我们还是用



POSITION pos = m_listctrl.GetFirstSelectedItemPosition();
if (pos == NULL)
    TRACE0("No items were selected!\n");
else
{
   while (pos)
   {
      int nItem = m_listctrl.GetNextSelectedItem(pos);
    

m_listctrl.DeleteItem(nItem );

   }
}

你就等着收尸吧

这时候我们就要B4微软了,为虾米木有GetLastselectedItemPosition 和GetPrevSelectedItem

多写一对成员函数会死啊 :(

没办法,办法自己想,这里有个笨办法

POSITION   sSelPos = NULL;

while(sSelPos = m_listctrl.GetFirstSelectedItemPosition())
{
         int nSelItem = -1;
          nSelItem = m_listctrl.GetNextSelectedItem(sSelPos);

          if(nSelItem >= 0 && nSelItem<m_listctrl.GetItemCount())
        {

              好了,这个nSelItem 就是我们要的DD

       }

}

GetNextSelectedItem这个函数,看msdn的用法,其实是返回第一个的index,然后走到下一个选中的行去,所以这么做也是安全的,在实际中,俺也是这么做的,测试也通过,没问题的

当然,还有个办法,先通过GetFirstSelectedItemPosition和GetNextSelectedItem

来获取所有的选中行的index,然后把这些index放到一个数组里,然后再从下往上删

唉真麻烦啊,还要不定数组,不说用new在堆上开吧,那么一个vector总是要的吧,麻烦啊

所以我暂时是用上述的办法来删除,也供大家参考,希望能找到更好的办法。



好了,今天就暂时先整理上述十点。listctrl其他高级的用法,网上资料也很多,我也暂时不总结,以后有机会再说吧。

搞了好长时间啊,要睡觉去了,累死了 :)
LVCOLUMN和LVITEM结构体解析 列表视图控件有两个重要的数据结构LVCOLUMN和LVITEM。LVCOLUMN用于定义报表方式下的“列”的结构;LVITEM用于定义“项”的结构。这两个结构的定义及说明如下: typedef struct _LVCOLUMN { UINT mask; //说明此结构中哪些成员是有效的 int fmt; //列的对齐方式 int c 阅读详情

相关推荐

LVCOLUMN与LVITEM结构体详解.rar_vc++

详细介绍LVCOLUMN与LVITEM结构体的构成及使用方法

LVITEM

LVITEM 列表视图控件(List Control) 列表视图控件是一种非常常用的控件,在需要以报表形式显示数据时,列表控件通常是最好的选择,许多专用的数据报表控件,也是在它的基础上派生而来。与树视图类似,列表控件可以由多个子项目组成,并且支持大图标、小图标、列表和报表4种方式显示信息,如图1所示。 图1 列表视图的4种显示方式 列表视图包含一个项目列表,而其中每个项目由

远有青山 1万+

华为AC外置Portal认证方案配置步骤指南

华为AC外置Portal认证方案配置步骤指南

m0_46129105的博客 7673

win32listview控件编程(转)二

VC中使用ListCtrl和LVITEM 经验总结 (转)默认分类   2009-10-04 22:22   阅读163   评论1   字号: 大大  中中  小小 VC中使用ListCtrl和LVITEM 经验总结 (博客搬家)2008-08-04 12:19:54 此文转至:http://www.igoshow.net/BlogView.asp?logID=9

1636

LabVIEW vs Python:谁更适合你的ATE自动化测试系统?实测对比与选型建议

本文深入对比了LabVIEW和Python在ATE自动化测试系统中的性能表现、开发效率和应用场景,帮助工程师根据实时控制需求、数据处理复杂度及团队技能做出最优选型决策。通过实测数据和典型案例,分析两者在硬件集成、系统性能和维护成本等方面的差异,并提供混合架构实施建议。

weixin_29240711的博客 276

AI辅助游戏开发实战:Kimi K3提升Unity开发效率与代码质量

在游戏开发领域,有限状态机(FSM)是构建角色AI行为逻辑的核心设计模式,它通过定义明确的状态和转换条件,使游戏实体能够智能地响应环境变化。其原理在于将复杂的行为分解为离散的状态节点,并通过事件驱动状态切换,从而实现清晰、可维护的AI架构。这项技术的价值在于显著提升了游戏角色的行为真实感和开发效率,被广泛应用于NPC行为控制、角色动画管理、UI流程等场景。随着AI编程助手的兴起,开发者现在可以借助如Kimi K3这类工具,通过自然语言指令快速生成和优化FSM等复杂系统的代码框架,将更多精力投入到核心玩法与性

weixin_30430677的博客 408

VC中使用ListCtrl和LVITEM 经验总结

此文转至: http://www.igoshow.net/BlogView.asp?logID=961 VC中使用ListCtrl和LVITEM   经验总结 ListCtrl在工作中,常常用到,也常常看到大家发帖问怎么用这个控件,故总结了一下自己的使用经验,以供参考使用。 先注明一下,这里,我们用m_listctrl来表示一个CListCtrl的类对象, 然后这里我们

trents的专栏 684

HUMAnN 3.0 (alpha)安装及使用

文章目录简介安装数据库下载运行参考 简介 安装 conda install humann humann_test (~1 minute) 数据库下载 humann_databases --download chocophlan full /path/to/databases --update-config yes humann_databases --download uniref uniref90_diamond /path/to/databases --update-config yes humann_

dys的博客 9505

ListCtrl 中 LIST VIEW 和LVITEM用法

此文转至:http://www.igoshow.net/BlogView.asp?logID=961 VC中使用ListCtrl和LVITEM 经验总结ListCtrl在工作中,常常用到,也常常看到大家发帖问怎么用这个控件,故总结了一下自己的使用经验,以供参考使用。先注明一下,这

1067

国产PLC实战:用汇川Easy320搞定TCP通信,手把手教你网口转串口控制设备

本文详细解析了如何使用汇川Easy320 PLC实现TCP通信与串口控制,解决工业自动化中设备间通信协议差异问题。通过实战案例和代码示例,展示了Easy320在协议转换、数据解析和串口转发中的高效应用,帮助工程师快速掌握网口转串口控制技术。

weixin_31774841的博客 500

【如何学习CAN总线测试】——Python+Robot Framework框架实现UDS诊断自动化

由于项目需要进行UDS诊断测试,所以对这方面进行了研究学习,网上很少能查询到相关资料,故记录一下UDS自动化测试开发过程,由于保密原则,案例都是Demo,希望能帮到感兴趣的朋友。

测试领域技术分享 7466

VC获取其他进程ListCtrl内容

VC读写其他进程ListCtrl数据到本进程的实例,下面用Windows任务管理器来做测试: 1、捕获窗口句柄:     用SPY++可以看到如下父子窗口关系:          添加ListCtrl,设置style / Report、关联控件变量m_ListCtrl,再添加一个按钮,如下图:     2、相关代码:BOOL CTestDlg::OnInit

Koma的主页 7247

Qt界面美化-飞扬青云自绘控件插件的使用-避免采坑

1、先上一个集成到QtCreater中的效果图: 2、飞扬青云自绘控件插件下载地址:https://gitcode.net/mirrors/feiyangqingyun/qucsdk?utm_source=csdn_github_accelerator 3、集成插件到QtCreater中的方法: (1)、查看自己使用的QtCreater的版本信息,我的:Qt 5.15.2 MSVC2019 64位 (2)插件下载下来后工程预览: 我选择msvc版本的SDK,打开找到匹配的SDK:...

小米的修行之路 2792

LIST_VIEW_和LVITEM用法

ListCtrl在工作中,常常用到,也常常看到大家发帖问怎么用这个控件,故总结了一下自己的使用经验,以供参考使用。 先注明一下,这里,我们用m_listctrl来表示一个CListCtrl的类对象, 然后这里我们的ListCtrl都是report形式,至于其他的如什么大图标,小图标 的暂时不讲,毕竟report是大众话的使用。其次,我们这里用条款一,条款二 来描述第一点,第二点,这个是参照

L_Andy的专栏 6147

LFM线性调频信号的MATLAB仿真

线性调频(LFM)是一种不需要伪随机编码序列的扩展频谱调制技术。由于线性调频信号占用的频带宽度远大于信息带宽,所以也可以获得很大的系统处理增益。线性调频信号又称鸟声(Chirp)信号,因为其频谱带宽落于可听范围,则听若鸟声,所以又称Chirp扩展频谱(CSS)技术。LFM技术在雷达、声纳技术中有广泛应用,如在雷达定位技术中,它可在增大射频脉冲宽度、提高平均发射功率、加大通信距离同时又保持足够的信号频谱宽度,不降低雷达的距离分辨率。线性调频(LFM)是一种不需要伪随机编码序列的扩展频谱调制技术。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 903

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

VC控件ListCtrl的使用方法

以下:listctrl默认view 风格为report ------------------------------------------------------------------------------- 1. CListCtrl 风格        LVS_ICON: 为每个item显示大图标        LVS_SMALLICON: 为每个item显示小图标

碧 月 有 约 735

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

vc中的listctrl

1. CListCtrl 样式及设置 2. 扩展样式设置 3. 数据插入 4. 一直选中Item 5. 选中和取消选中Item 6. 得到CListCtrl中所有行的checkbox的状态 7. 得到CListCtrl中所有选中行的序号 8. 得到item的信息 9. 得到CListCtrl的所有列的header字符串内容 10. 使CList

lilang66的专栏 977

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

efm32 入门.pdf

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

VC ++ MFC编程--ListCtrl控件的用法

ListCtrl在工作中,常常用到,也常常看到大家发帖问怎么用这个控件,故总结了一下自己的使用经验,以供参考使用。 先注明一下,这里,我们用m_listctrl来表示一个CListCtrl的类对象,然后这里我们的ListCtrl都是report形式,至于其他的如什么大图标,小图标的暂时不讲,毕竟report是大众话的使用。其次,我们这里用条款一,条款二来描述第一点,第二点,这个是参照《Effec

MOKA 828

自绘ListCtrl -- 设置行高

以下是通过重载DramItem()方法来实现自绘, 故需要设置ListCtrl控件属性"Owner Draw Fixed"为TRUE,"Owner Data"为FALSE(默认为FLASE); 1.  准备工作 (1).新建一个MFC类CMyListCtrl,其基类为CListCtrl, (2).将ListCtrl控件属性"Owner Draw Fixed"设置为TRUE,"Own

jiangqin115的专栏 4940

ClistCtrl 用法 行 插入 风格 形式 删除

2011-01-19 16:49 【转】LIST VIEW 和LVITEM用法 此文转至: http://www.igoshow.net/BlogView.asp?logID=961 VC中使用ListCtrl和LVITEM   经验总结 ListCtrl在工作中,常常用到,也常常看到大家发帖问怎么用这个控件,故总结了一下自己的使用经验,以供参考使用。 先注明一下,

bingkehanfeng的专栏 1208

自身支持排序的ListCtrl

自身支持排序的CSortListCtrlVC里的CListCtrl是个很不好用的控件,特别是排序,实现起来很麻烦。关于排序的基本用法,有一篇很好的文章:http://www.vchelp.net/vchelp/zart/sortl.asp?type_id=9&class_id=1&cata_id=1&article_id=73&search_term=但是,在这个例子里也存在个问题:排序的实现是和

coldcrane的专栏 6798

VC—CListCtrl使用技巧

转自:http://blog.kaixb.com/?p=64 Description: LVS_ICON: 为每个item显示大图标 LVS_SMALLICON: 为每个item显示小图标 LVS_LIST: 显示一列带有小图标的item LVS_REPORT: 显示item详细资料 直观的理解:windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料” 2. 设

mail_cm的专栏 926

获取其他进程Listctrl的数据

// // http://www.codeproject.com/KB/threads/int64_memsteal.aspx // HANDLE InjectProcess(HWND listview) { unsigned long pid; HANDLE process; GetWindowThreadProcessId(listview, &amp;pid); ...

weixin_34364071的博客 328

VC skills 5

采用 ATL 修改桌面背景BOOL  SetWallpaper(CString   &strPicFile,   DWORD   dwstyle)   { HRESULT   hr;    CComPtr pIAD ;  // 智能指针, 自动释放 // 创建接口的实例    hr = CoCreateInstance ( CLSID_ActiveDesktop,            NUL

FISH 的专栏 1014

MFC List控件插入ICON图标

想要在list控件中插入icon,首先需要设置列表控件样式属性,代码如下: //设置列表样式风格,使子项也能插入图标 m_resultlist.SetExtendedStyle(LVS_EX_GRIDLINES |LVS_EDITLABELS | LVS_EX_SUBITEMIMAGES); 其中m_resultlist为相应的list控件变量,最重要的是LVS_EX_SUBITEMIM...

V_Gogol的博客 4355
上一篇: 列表视图控件
下一篇: 二进制,十进制小数互转
ProgrammingRing
博客等级 码龄17年 76粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值