`
isiqi
  • 浏览: 16485630 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

MFC控件篇之ListCtrl

阅读更多
List Ctrl

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

LVS_ICON LVS_SMALLICON LVS_LIST LVS_REPORT 这四种风格决定控件的外观,同时只可以选择其中一种,分别对应:大图标显示,小图标显示,列表显示,详细报表显示
LVS_EDITLABELS 结点的显示字符可以被编辑,对于报表风格来讲可编辑的只为第一列。
LVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点
LVS_SINGLESEL 同时只能选中列表中一项
首先你需要设置列表控件所使用的ImageList,如果你使用大图标显示风格,你就需要以如下形式调用:
CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL);
如果使用其它三种风格显示而不想显示图标你可以不进行任何设置,否则需要以如下形式调用:
CImageList* SetImageList( CImageList* pImageList, LVSIL_SMALL);

通过调用int InsertItem( int nItem, LPCTSTR lpszItem );可以在列表控件中nItem指明位置插入一项,lpszItem为显示字符。除LVS_REPORT风格外其他三种风格都只需要直接调用InsertItem就可以了,但如果使用报表风格就必须先设置列表控件中的列信息。

通过调用int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat , int nWidth, int nSubItem);可以插入列。iCol为列的位置,从零开始,lpszColumnHeading为显示的列名,nFormat为显示对齐方式,nWidth为显示宽度,nSubItem为分配给该列的列索引。

在有多列的列表控件中就需要为每一项指明其在每一列中的显示字符,通过调用
BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );可以设置每列的显示字符。nItem为设置的项的位置,nSubItem为列位置,lpszText为显示字符。下面的代码演示了如何设置多列并插入数据: m_list.SetImageList(&m_listSmall,LVSIL_SMALL);//设置ImageList m_list.InsertColumn(0,"Col 1",LVCFMT_LEFT,300,0);//设置列 m_list.InsertColumn(1,"Col 2",LVCFMT_LEFT,300,1); m_list.InsertColumn(2,"Col 3",LVCFMT_LEFT,300,2); m_list.InsertItem(0,"Item 1_1");//插入行 m_list.SetItemText(0,1,"Item 1_2");//设置该行的不同列的显示字符 m_list.SetItemText(0,2,"Item 1_3");


此外CListCtrl还提供了一些函数用于得到/修改控件的状态。
COLORREF GetTextColor( )/BOOL SetTextColor( COLORREF cr );用于得到/设置显示的字符颜色。
COLORREF GetTextBkColor( )/BOOL SetTextBkColor( COLORREF cr );用于得到/设置显示的背景颜色。
void SetItemCount( int iCount );用于得到添加进列表中项的数量。
BOOL DeleteItem(int nItem);用于删除某一项,BOOL DeleteAllItems( );将删除所有项。
BOOL SetBkImage(HBITMAP hbm, BOOL fTile , int xOffsetPercent, int yOffsetPercent);用于设置背景位图。
CString GetItemText( int nItem, int nSubItem );用于得到某项的显示字符。

列表控件的消息映射同样使用ON_NOTIFY宏,形式如同:ON_NOTIFY( wNotifyCode, id, memberFxn ),wNotifyCode为通知代码,id为产生该消息的窗口ID,memberFxn为处理函数,函数的原型如同void OnXXXList(NMHDR* pNMHDR, LRESULT* pResult),其中pNMHDR为一数据结构,在具体使用时需要转换成其他类型的结构。对于列表控件可能取值和对应的数据结构为:

LVN_BEGINLABELEDIT 在开始某项编辑字符时发送,所用结构:NMLVDISPINFO
LVN_ENDLABELEDIT 在结束某项编辑字符时发送,所用结构:NMLVDISPINFO
LVN_GETDISPINFO 在需要得到某项信息时发送,(如得到某项的显示字符)所用结构:NMLVDISPINFO
关于ON_NOTIFY有很多内容,将在以后的内容中进行详细讲解。

关于动态提供结点所显示的字符:首先你在项时需要指明lpszItem参数为:LPSTR_TEXTCALLBACK。在控件显示该结点时会通过发送TVN_GETDISPINFO来取得所需要的字符,在处理该消息时先将参数pNMHDR转换为LPNMLVDISPINFO,然后填充其中item.pszText。通过item中的iItem,iSubItem可以知道当前显示的为那一项。下面的代码演示了这种方法: char szOut[8][3]={"No.1","No.2","No.3"}; //添加结点 m_list.InsertItem(LPSTR_TEXTCALLBACK,...) m_list.InsertItem(LPSTR_TEXTCALLBACK,...) //处理消息 void CParentWnd::OnGetDispInfoList(NMHDR* pNMHDR, LRESULT* pResult) { LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR; pLVDI->item.pszText=szOut[pTVDI->item.iItem];//通过iItem得到需要 显示的字符在数组中的位置 *pResult = 0; }


关于编辑某项的显示字符:(在报表风格中只对第一列有效)首先需要设置列表控件的LVS_EDITLABELS风格,在开始编辑时该控件将会发送LVN_BEGINLABELEDIT,你可以通过在处理函数中返回TRUE来取消接下来的编辑,在编辑完成后会发送LVN_ENDLABELEDIT,在处理该消息时需要将参数pNMHDR转换为LPNMLVDISPINFO,然后通过其中的item.pszText得到编辑后的字符,并重置显示字符。如果编辑在中途中取消该变量为NULL。下面的代码说明如何处理这些消息: //处理消息 LVN_BEGINLABELEDIT void CParentWnd::OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult) { LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR; if(pLVDI->item.iItem==0);//判断是否取消该操作 *pResult = 1; else *pResult = 0; } //处理消息 LVN_BEGINLABELEDIT void CParentWnd::OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult) { LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR; if(pLVDI->item.pszText==NULL);//判断是否已经取消取消编辑 m_list.SetItemText(pLVDI->item.iItem,0,pLVDI->pszText);//重置显示字符 *pResult = 0; } 上面讲述的方法所进行的消息映射必须在父窗口中进行(同样WM_NOTIFY的所有消息都需要在父窗口中处理)。


如何得到当前选中项位置:在列表控件中没有一个类似于ListBox中GetCurSel()的函数,但是可以通过调用GetNextItem( -1, LVNI_ALL | LVNI_SELECTED);得到选中项位置。

分享到:
评论

相关推荐

    MFC控件:listctrl使用方法总结

    ### MFC控件:ListCtrl使用方法总结 #### 一、概述 `ListCtrl`是MFC中的一个重要控件,用于展示列表数据。它能够以不同的视图样式展示信息,如大图标、小图标、列表或详细信息视图等。在MFC中,通过`CListCtrl`类...

    重绘MFC列表控件(ListCtrl)字体 表头和行高度 行颜色等

    本篇文章将详细探讨如何重绘MFC ListCtrl控件的字体、表头高度、行高度以及行颜色。 首先,要改变ListCtrl的字体,你需要使用`SetFont`函数。这个函数接受一个`CFont`对象作为参数,该对象代表你希望设置的新字体。...

    一个好用的mfc控件listctrl

    一个好用的mfc控件listctrl,值得学习的源码,使用起来方便,有例子。

    SuperGrid-MFC_ListCtrl控件扩展(让ListCtrl控件具有树状列表)

    在MFC(Microsoft Foundation Class)库中,ListCtrl控件是一种常见的用于显示表格数据的控件,它通常用于展示多列、多行的数据。然而,ListCtrl控件本身并不支持直接展示树状结构的数据,这对于需要层次化显示信息...

    MFC中ListBox和ListCtrl的使用

    在Microsoft Foundation Classes (MFC)库中,ListBox和ListCtrl是两种常见的控件,用于在用户界面中显示和管理列表数据。ListBox通常用于简单的单选或多选列表,而ListCtrl则提供了更丰富的功能,如多列显示、图标...

    MFC在ListCtrl中加入Button

    在MFC(Microsoft Foundation Classes)框架中,ListCtrl是一个非常常用的控件,它通常用于显示列表数据,可以自定义列头、图标等。然而,仅靠ListCtrl本身的特性,我们无法直接在其中添加按钮。但是,通过一些技巧...

    mfc的listctrl

    本文将深入探讨MFC中的ListCtrl控件,重点在于自定义绘制(自绘)、项的高度、颜色设置以及如何添加编辑功能。 ListCtrl是MFC中的一个视图类,它继承自CListView,主要用于展示列表数据。它可以显示多列,并且每一...

    在ListCtrl列表控件中添加edit和combo

    在Windows编程中,特别是使用MFC(Microsoft Foundation Classes)库时,`ListCtrl`是一种常用的控件,用于显示多列的列表数据。然而,仅使用`ListCtrl`默认功能有时并不能满足所有需求,比如需要在某列中进行编辑或...

    MFC实现listCtrl双击表格,实现文本输入。

    在Microsoft Foundation Class (MFC)库中,ListCtrl是一个强大的控件,用于显示列式数据,类似于电子表格。本教程将详细介绍如何利用MFC ListCtrl控件,响应用户的双击事件,实现用户能够编辑表格中的文本。 首先,...

    mfc控件ListCtrl常用方法

    控件listctrl的一些常用方法和技巧,着重介绍了listctrl的创建和常用方法。

    mfc下导出listctrl数据到excel表格

    在Microsoft Foundation Classes (MFC) 中,开发人员经常需要与用户界面进行交互,ListCtrl控件就是这样的一个组件,用于显示列表数据。本教程将详细解释如何在MFC环境下将ListCtrl控件中的数据导出到Excel表格。 ...

    mfc下的listctrl控件使用

    listCtrl.InsertColumn(0, "Column1", LVCFMT_LEFT, 100); listCtrl.SetItemText(0, 1, "SubItem1"); ``` ### 3. 数据结构 为了高效地管理数据,可以创建自定义的结构体,存储列表项相关的所有信息。然后,将这些...

    ListCtrl中插入图片,按钮,右键菜单,Edit控件等

    在MFC(Microsoft Foundation Classes)库中,ListCtrl是一个强大的控件,用于显示列式数据,它可以被扩展以实现各种自定义功能。本教程将详细讲解如何在ListCtrl中插入图片、按钮、颜色、Edit控件,以及添加右键...

    ListCtrl Icon模式显示jpg、gif等图片

    总的来说,要在MFC的ListCtrl中显示jpg和gif图片,我们需要理解MFC控件的使用,掌握图像处理技术,以及可能的网络编程。这是一项涉及多方面技能的任务,但通过学习和实践,我们可以有效地实现这一功能,提供用户友好...

    VC/MFC之ListCtrl控件使用经验总结

    在VC/MFC编程中,ListCtrl控件是一个非常常用且功能强大的组件,它允许开发者以多种方式展示数据,包括图标、小图标、列表和报告视图。以下是对ListCtrl控件使用的一些关键知识点的详细说明: 1. **CListCtrl风格**...

    MFC listctrl 控件

    在标题"**MFC listctrl 控件**"中,我们关注的核心知识点就是如何使用MFC的`CListCtrl`类来创建和定制具有报告样式(report view)的列表视图,以及如何实现自定义的颜色和行高。 在描述中提到,“继承listctrl ...

    MFC实现ListCtrl动态加载

    实现ListCtrl控件滚动条滚动到底后动态添加 1、重载WM_VSCROLL、WM_SETCURSOR、WM_MOUSEWHEEL 2、添加采用多线程,界面不卡顿 3、添加时光标变为等待状态,添加完成后还原

    MFC下扩展的listCtrl

    标题“MFC下扩展的listCtrl”指的就是对`CListCtrl`的自定义扩展,以实现这些增强功能。 首先,让我们深入了解一下`CListCtrl`的基本用法。`CListCtrl`继承自`CWnd`,它提供了添加、删除、获取和设置列表项的方法。...

    MFC实现自绘ListControl控件

    本篇将详细探讨如何使用MFC来实现自定义绘制ListControl控件,包括选中行颜色变化、行间距调整以及字体大小设置等功能。 ListControl控件,也称为ListView,是Windows GUI中常用的一种控件,用于展示多列数据,并可...

Global site tag (gtag.js) - Google Analytics