CListCtrl成员函数集(中文版)
- 格式:pdf
- 大小:924.88 KB
- 文档页数:6
CListCtrl控件(2)可编辑单元格的CListCtrl控件CListCtrl控件⽣成之后,⽆论你单击还是双击它的单元格,都没有任何反应,如果我们需要像EXCEL那样双击⼀个单元格后即可编辑该单元格的内容,那怎么办呢?⼀个⽅法就是双击单元格之后,在该单元格的地⽅⽣成⼀个编辑框,然后让输⼊焦点落在该编辑框上,我们即可对该编辑框进⾏⽂字编辑,当输⼊焦点从编辑框上消失时(通常是⽤户在编辑框外的地⽅单击,就像EXCEL当编辑完⼀个单元格的内容后⽤户在单元格外的地⽅单击⼀下以⽰确认输⼊完毕⼀样。
),就理解为编辑完毕,然后把编辑框的内容设置为该单元格的内容,最后隐藏或销毁编辑框。
1.从CListCtrl类继承,新建⼀个⾃⼰的列表框类,在这⾥我取名为CPage2ListCtrl,下⾯就要在CPage2ListCtrl 类实现双击单元格编辑功能。
上⾯也已经说道,双击单元格后要显⽰⼀个编辑框,我们把那个编辑框看做是CPage2ListCtrl 类的成员。
接下来就要为这个编辑框新建⼀个从CEdit继承的类,为什么不直接⽤CEdit类呢,以后就知道为什么的了。
这个从CEdit继承的编辑框类我取名为CListEdit。
2.为CPage2ListCtrl类添加成员变量和函数:public:void DisposeEdit(); //这个函数的作⽤是.....往下看就知道的了。
CListEdit m_edit; //这个就是双击单元格后显⽰的编辑框。
int row,col; //⽤来记录双击的单元格是第⼏⾏第⼏列。
3.重写CPage2ListCtrl类的PreSubclassWindow()虚函数,这个函数的作⽤是什么,这⾥就不说了,我们要在这个函数⾥设置CPage2ListCtrl类的基本样式和扩展样式,还有创建m_edit成员变量的编辑框。
void CPage2ListCtrl::PreSubclassWindow(){// TODO: Add your specialized code here and/or call the base classModifyStyle(LVS_EDITLABELS,0);ModifyStyle(0,LVS_REPORT);ModifyStyle(0,LVS_SHOWSELALWAYS);SetExtendedStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);m_edit.Create(WS_CHILD|WS_CLIPSIBLINGS|WS_EX_TOOLWINDOW|WS_BORDER,CRect(0,40,10,50),this,1001);CListCtrl::PreSubclassWindow();}4.对CPage2ListCtrl类添加消息处理,对双击事件进⾏响应,消息名称是WM_LBUTTONDBLCLK。
CListCtrl用法一、CListCtrl在MFC中共有四种view可供选择,每种view用不同的方式显示列表的内容。
· 图标视图(Icon view)每一项以全尺寸图标(32×32像素)出现,下面有一个标签。
用户可在列表视图窗口拖动项到任意位置。
· 小图标视图(Small icon view)视图每一项以小图标(16×16像素)出现,右边有一个标签。
用户可在列表视图窗口拖动项到任意位置。
· 列表视图(List view)每一项以小图标出现,下面有一个标签。
项按列排列,不能拖动到列表视图窗口的任何位置。
· 报表视图(Report view)每一项在本行上出现,右边有排列成列的附加信息。
最左边的列包含小图标和标签,下一列包含应用指定的子项。
二、使用List Control控件有两种方法。
1.在对话框体上添加,直接从工具箱里点List Control拖拉即可,在属性里view项设置视图类型。
CListCtrl *pMyList;pMyList = (CListCtrl*)GetDlgItem(IDC_LIST);2.无对话框体,直接显示在程序初始视图窗口里面。
这时,如果基于CListView的类,声明变量,然后调用CListView类里的成员函数GetListCtrl()。
CListCtrl *pMyList;pMyList = &GetListCtrl();pMyList->ModifyStyle(0,LVS_ICON);//设置为视图类型三、其它设置。
如显示样式、位置、背景等。
设置显示样式:网格,选中时整行高亮pMyList->SetExtendedStyle( LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES );如要固定每列不能用鼠标拖动,添加如下代码:CHeaderCtrl* pHeaderCtrl = (CHeaderCtrl*)pMyList->GetHeaderCtrl();pHeaderCtrl->EnableWindow( FALSE ) ;四、之后可以插入行、列。
CListCtrl使用详解CListCtrl使用详解2009年04月07日星期二 10:56 P.M.1。
先来介绍REPORT类型的CListCtrl:首先使用下面的语句设置CListCtrl的style:DWORD SetExtendedStyle( DWORD dwNewStyle );其中LVS_EX_CHECKBOXES 表示添加CheckBoxLVS_EX_FULLROWSELECT 表示选择整行LVS_EX_GRIDLINES 表示添加表格线如果设置了LVS_EX_CHECKBOXES属性,则可以用BOOL GetCheck( int nItem ) const;来得到某一行是否Checked。
可以先用下面的语句来删除以前的东西:for(int k=2;k>=0;k--) //注意要从后往前删,否则出错m_ListCtrl.DeleteColumn(k);m_ListCtrl.DeleteAllItems();用下面的语句新建列:m_ListCtrl.InsertColumn(0,_T("文件名"),LVCFMT_IMAGE|LVCFMT_LEFT);m_ListCtrl.InsertColumn(1,_T("仪器类别"));m_ListCtrl.InsertColumn(2,_T("项目类别"));其中LVCFMT_IMAGE表示可以在第一列加入图标。
如果不要图标可以删去。
然后设置列宽:for(j=0;j<3;j++)m_ListCtrl.SetColumnWidth(j ,100);以下为列表加入图标,如果不需要图标,可以跳过这一步。
注意只在第一次加入,如果多次加入会出错!先在头文件中加入声明:CImageList m_ImageList;这是必要的,如果在cpp的某个函数中加入由于生命期结束,CImageList自动释放,则效果是列表中看不到图标,只看到一个白方块。
VC中CList用法及其成员的使用初学mfc者,往往对CList等mfc的Collect类的使用感到迷惑,在使用中经常会遇到许多问题,导致对vc中的Collect类的使用产生了惧怕。
以下,就个人经历而言,告诉大家如何使用CListoCList是一个双向链表类。
1、头文件名不可少Clist类定义在Afxtempl. h头文件中,因此在使用该类时,需要加这个头文件名。
2、理解CList的声明和构造方法CList的声明如下:template< class TYPE, class ARG_TYPE >class CList : public CObject山此,我们知道CList是一个模版类,那么他的两个class是什么意思呢?下面看一个例子:CList<CString , CString&> list;//链表对象1CList<CString, CString> list2;//链表对象 2这里的第一个参数CString是实例化的类型,第二个参数是类的成员函数的参数的调用形式,通常是类型引用,当然也可以是对象,而不是引用。
对象和引用的区别,可以看一下C卄基础知识方面的书。
/////////////////////////////////////////////////////////////////////////////// MSDN:使用时要#include <afxtemp1. h>ConstructionCList Constructs an empty ordered list・建立一个链表example:CList<int, int> myList;//建立一个int 链表CList<CString, CString&> myList (16) ;//建立一个cstring 的链表,后面的16表示链表里面数据的个数,如果不写的话,可能是不限个数?CList<MYTYPE, MYTYPE&> myList;// 建立一个MYTYPE 类型(自定义)的链表如果不存入数据的话,刚建立的链表是空的,头尾都为空Head/Tail AccessGetHead Returns the head element of the list (cannot be empty)・返回链表的头数据例子:CList〈int,int> myList:for (int i=0; i< 10000; i++) { myList. AddTail (int (i)) ; }〃存入数据int tmp=myList. GetHeadO ;//tmp 被赋予了0GetTail Returns the tail element of the list (cannot be empty)・返回链表的尾数据CLisnt,int> myList;for (int i=0; i< 10000; i++) { myList. AddTail (int (i)) ; }〃存入数据int tmp=myList. GetTail () ;//tmp 被赋予了9999OperationsRemoveHead Removes the element from the head of the list・移除链表头数据,链表数据个数减1,返回缩减前的头数据例子:CLis,int> myList;for (int i=0; i< 10000; i++) { myList. AddTail (int (i)) ; }〃存入数据int tmp二myList. RemoveHead() ://tmp被赋予了之询的头数据:0;同时数据个数变为9999;RemoveTail Removes the element from the tail of the list・移除链表尾数据,链表数据个数减1,返回缩减前的尾数据例子:CList<int, int> myList;for (int i=0; i< 10000; i++) { myList. AddTail (int (i)) : }〃存入数据int tmp=myList. RemoveTail () ;//tmp 被赋予了之前的尾数据:9999;同时数据个数变为9999;AddHead Adds an element (or all the elements in another list) to the head of the list (makes a new head).在链表头处插入新数据,链表数据个数加1,返回新的链表头位置(POSITION); 例子:CList<int, int〉myList;for (int i=0; i<10000; i++) { myList. AddTail (int (i)) ; }//存入数据POSITION pos=myList. AddHead(int (314)) ;//链表有了一个新的头数据:314; 同时链表个数变为10001 ;pos为新的头的位置;AddTail Adds an element (or all the elements in another list) to the tail of the list (makes a new tail).在链表尾处插入新数据,链表数据个数加1,返回新的链表尾位置(POSITION); 例子:POSITION pos=myList. AddTail (int (314)) ;//链表有了一个新的尾数据:314; 同时链表个数变为10001 ;pos为新的尾的位置;RemoveAll Removes all the elements from this list・清空链表,其头尾皆变成空指针;IterationGetHeadPosition Returns the position of the head element of the list.返回链表头的位置;CLisint> myList;for (int i=0; i< 10000; i++) { myList. AddTail (int (i)) ; }〃存入数据POSITION pos=myList. GetHeadPositionO ;//获得链表头的位置GetTailPosition Returns the position of the tail element of the list.返回链表尾的位置;CList<int, int> myList;for (int i=0; i< 10000; i++) { myList. AddTail (int (i)) ; }〃存入数据POSITION pos=myList. GetTailPosition() ;//获得链表尾的位置GetNext Gets the next element for iterating.返回当前位置的数据,之后,位置后移一位;CList<int, int> myList;for (int i=0; i< 10000; i++) { myList. AddTail (int (i)) : }〃存入数据POSITION pos=myList. GetHeadPositionO ;//获得链表头的位置int tmp二myList. GetNext (pos) ://tmp 被赋予了头数据的值:0;同时pos 指向第二个数据1;GetPrev Gets the previous element for iterating.返回当前位置的数据,之后,位置前移一位;CList<int, int〉myList;for (int i=0; i< 10000; i++) { myList. AddTail (int (i)) ; }〃存入数据POSITION pos=myList. GetTailPositionO ;//获得链表尾的位置int tmp二myList. GetNext (pos) ://tmp 被赋予了尾巴数据的值:9999;同时pos 指向倒数第二个数据9998;Retrieval/ModificationGetAt Gets the element at a given position.返回指定位置的数据;POSITION pos=myList. GetTailPositionO ;//获得链表尾的位置,还可以继续改变pos,以指向其他数据int tmp=myList. GetAt (pos) ://tmp 被赋予链表尾的数据SetAt Sets the element at a given position.CList<int, int〉myList;for (int i=0; i<10000; i++) { myList. AddTail (int (i)) ; }//存入数据POSITION pos二myList. GetTailPositionO ;//获得链表尾的位置,还可以继续改变pos,以指向其他数据myList. SetAt (pos, int (222)) ;//将链表尾部的数据赋成222RemoveAt Removes an element from this list, specified by position.清除指定位置处的数据;同时数据个数减1 ;CLisint> myList;for (int i=0; i<10000; i++) { myList. AddTail (int (i)) ; }〃存入数据POSITION pos=myList. GetTailPositionO ;//获得链表尾的位置myList. RemoveAt (pos) ;//链表pos (尾部)位置的数据被清除,数据个数变为9999; InsertionInsertBefore Inserts a new element before a given position.在指定位置前插入一个新数据,数据个数加1;CList<int, int> myList;for (int i=0; i< 10000; i++) { myList. AddTail (int (i)) ; }〃存入数据POSITION pos=myList. GetHeadPositionO ;//获得第一个数据的位置myList. InsertBefore (pos, int (123)) ;//在第一个数据前插入一个新数据:123,同时数据个数变为10001InsertAfter Inserts a new element after a given position.在指定位置后插入一个新数据,数据个数加1;CList<int, int> myList;for (int i=0; i< 10000; i++) { myList. AddTail (int (i)) ; }〃存入数据POSITION pos=myList. GetHeadPositionO ;//获得第一个数据的位置myList. InsertAfter (pos, int (123)) ;//在第一个数据后插入一个新数据:123, 同时数据个数变为10001SearchingFind Gets the position of an element specified by pointer value. 返回指定数据对应的位置;POSITION pos=myList. Find(int (0));〃获得0 (链表头)的位置Findindex Gets the position of an element specified by a zero-based index. 返回索引号对应的位置;POSITION pos=myList. Findindex(0) ;//0 表示链表头,以此类推Status GetCount Returns the number of elements in this list・返回链表的数据个数int num=myList. GetCount () ;//获得链表的数据个数IsEmpty Tests for the empty list condition (no elements)・判定链表是否为空;返回1表示链表是空,返回0表示链表非空;BOOL empty二myList・IsEmptyO ;。
MFC总结之CListCtrl用法及技巧(二).续第一篇:MFC总结之CListCtrl用法及技巧(一)/zwgdft/article/details/7560592本篇重点介绍:禁止拖动表头、让第一列居中显示、设置行高与字体、虚拟列表技术、点击表头时进行归类、向上与向下移动、动态调整大小问题、避免闪烁问题。
6、禁止拖动表头重载OnNotify消息响应函数,屏蔽两个消息通知码:HDN_BEGINTRACKW 和HDN_DIVIDERDBLCLICKW。
示例如下:[cpp] view plaincopyprint?1.BOOL CXXXX::OnNotify(WPARAM wParam, LPARAM lPara m, LRESULT* pResult)2.{3.// TODO: Add your specialized code here and/or call the base class4.//屏蔽两个消息通知码,使得禁止拖动List表头5.NMHEADER* pNMHeader = (NMHEADER*)lParam;6.if(((pNMHeader->hdr.code == HDN_BEGINTRACKW) |7.(pNMHeader->hdr.code == HDN_DIVIDERDBLCLICKW)))8.{9.*pResult = TRUE;10.return TRUE;11.}12.13.return CDialog::OnNotify(wParam, lParam, pResult);14.}7、让第一列居中显示在插入列时,我们可以通过参数nFormat来设置文本居中显示,但是这种设置对于第一列是没有作用的。
这时我们可以考虑将我们的内容从第二列开始插入(设置为居中显示)。
先插入第一列,然后删除第一列,这样原先的第二列就充当了第一列。
8、设置行高和字体设置CListCtrl的行高没有函数接口,可以通过自绘来实现,但是比较麻烦。
CListCtrl控件的使用
在系统中,经常会用到ListCtrl来对数据进行显示,那么在系统中,对ListCtrl的使用主要是两个函数进行使用。
结合主界面对ListCtrl的用法进行一下介绍:
第一步,从控件列表栏里面,拖动一个ListCtrl在主界面上:
第二步,修改ListCtrl的样式
第三步,修改ListCtrl的资源ID
第四步,为ListCtrl绑定一个变量。
右键点击ListCtrl控件,然后选择“建立类向导”,
按下图进行设置
第五步,添加设置ListCtrl表头的函数。
在类视图中右键点击“CAMSDlg”类,然后选择“”,弹出“添加成员函数”界面,输入函数类型及函数描述,选择可见域为“Private”,如下图所示,并点击“确定”
第六步,在InitListCtrlStyle函数中添加如下代码,设置ListCtrl的列头及样式:
第七步,添加ListCtrl的绑定数据的函数RefreshListCtrlData()。
在函数里面做如下操作,首先获取ListCtrl的记录行数n,然后在第n行依次往各列插入数据。
代码如下:
运行程序,界面图如下:。
控件CListCtr详解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 cchT extMax; //标题正文缓冲区的长度(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 cchT extMax; //标题正文缓冲区的长度(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结构,函数根据该结构来创建新的列。
clistctrl控件scroll函数
CListCtrl是MFC(Microsoft Foundation Classes)库中的一个类,用于创建和管理一个列表控件。
如果你想使用CListCtrl的Scroll函数,你需要先确保你的CListCtrl控件已经被正确地初始化并添加到你的对话框或其他窗口中。
在CListCtrl中,Scroll函数主要有两个重载版本:
1.Scroll(int nHorzScroll, int nVertScroll)
2.Scroll(POINT point, RECT rcUpdate)
第一个版本允许你根据水平和垂直滚动量来滚动列表。
nHorzScroll是水平滚动的量,nVertScroll是垂直滚动的量。
这些参数可以是正数(表示向右或向下滚动)或负数(表示向左或向上滚动)。
第二个版本允许你根据一个点的位置和一个更新区域来滚动列表。
point参数表示要滚动到的位置,rcUpdate参数表示一个矩形区域,该区域将被更新以反映新的滚动位置。
下面是一个使用Scroll函数的简单示例:
cpp复制代码
// 假设你有一个 CListCtrl* pListCtrl 指向你的 CListCtrl 控件
// 你想要向下滚动50个单位
pListCtrl->Scroll(0, 50);
请注意,使用Scroll函数可能会导致数据的重绘,这可能会对性能产生影响。
在处理大量数据时,考虑使用其他方法来滚动列表,例如分页或虚拟模式。
cgridlistctrlex使用示例CGridListCtrlEx是一个非常有用的MFC控件,它可以在Windows 程序中创建一个网格列表,并提供了许多功能和选项来定制和管理列表中的数据。
使用CGridListCtrlEx,我们可以轻松地显示和编辑数据,并且具有灵活的布局和样式选项。
我们需要在项目中包含CGridListCtrlEx类的头文件,并在对话框类中声明一个成员变量。
然后,在OnInitDialog()函数中,我们可以将该成员变量与对应的对话框控件进行绑定。
接下来,我们可以使用InsertColumn()函数来插入列标题,并使用InsertItem()函数来插入行数据。
对于每个单元格,我们可以使用SetItemText()函数来设置文本内容。
此外,我们还可以使用SetItemData()函数将自定义数据与每个单元格相关联,以便后续处理。
另一个重要的功能是排序。
通过调用SetSortColumn()函数,我们可以指定要按照哪一列进行排序,以及升序还是降序。
排序后,可以使用GetItemText()和GetItemData()函数来获取排序后的数据。
除了基本的插入和排序功能,CGridListCtrlEx还提供了许多其他功能。
例如,我们可以使用SetItemFormat()函数来设置单元格的格式,包括对齐方式和文本颜色。
我们还可以使用SetItemState()函数来设置单元格的状态,例如可编辑、选中等。
除了显示和编辑数据,CGridListCtrlEx还支持行选择和单元格选择。
我们可以使用GetSelectedItem()函数来获取当前选中的行,并使用GetSelectedCell()函数来获取当前选中的单元格。
总结一下,CGridListCtrlEx是一个功能强大且易于使用的MFC控件,可以帮助我们在Windows程序中创建和管理网格列表。
它提供了许多功能和选项,可以满足各种需求。
无论是显示数据,还是进行排序和编辑,CGridListCtrlEx都是一个不可或缺的工具。