MFC中使CListCTrl控件排序
MFC中使CListCTrl控件排序
∙阅读:(1130) 评论:(0) 发表时间:2009-08-24作者:不二周助
∙列表控件(CListCtrl)的排序功能不像其它直接调用API就可以完成的功能一样.它比较复杂.今天将我的一点体会简单地谈一下. 列表控件的顶部有一排按钮,用户可以通过选择不同的列来对记录进行排序。
但是CListCtrl并没有自动排序的功能,我们需要自己添加一个用于排序的回调函数来比较两个数据的大小,此外还需要响应排序按钮被点击的消息。
回调函数就好像是一个中断处理函数,操作系统在符合你设定的条件时自动调用。
·CListCtrl提供了用于排序的函数
函数原型为:
BOOL CListCtrl::SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData);
其中第一个参数为全局排序函数(它就是回调函数)的地址,
第二个参数为用户数据,你可以根据你的需要传递一个数据或是指针。
该函数返回-1,代表第一项排应在第二项前面;
返回1代表第一项排应在第二项后面;
返回0代表两项相等。
·排序函数原形为:
int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
其中第三个参数为调用者传递的数据(即调用SortItems时的第二个参数
dwData)。
第一和第二个参数为用于比较的两项的ItemData,你可以通过DWORD
CListCtrl::GetItemData( int nItem )/
BOOL CListCtrl::SetItemData( int nItem, DWORD dwData )来对每一项的ItemData 进行存取。
在添加项时选用特定的CListCtrl::InsertItem也可以设置该值。
由于你在排序时只能通过该值来确定项的位置所以你应该比较明确的确定该值的含义。
·我们什么时候需要排序(消息映射)呢?
实现这点可以在父窗口中对LVN_COLUMNCLICK消息进行处理来实现。
例子: //排序回调函数实现
static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
// lParamSort contains a pointer to the list view control.
// The lParam of an item is just its index.
//以第一列为根据排序
CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
CString strItem1 = pListCtrl->GetItemText(lParam1, 0);
CString strItem2 = pListCtrl->GetItemText(lParam2, 0);
//比较两个数
LPCTSTR s1=(LPCTSTR)strItem1;
LPCTSTR s2=(LPCTSTR)strItem2;
int n1=atoi(s1);
int n2=atoi(s2);if (n1>n2)
return -1;
else
return 1;
}
void C***::OnColumnclickList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here //调用排序函数
m_ShowData.SortItems( MyCompareProc, (DWORD)&m_ShowData );
*pResult = 0;}
整个过程是这样的: 当你点击列表控件的表头时,此时它会向父窗口发送
LVN_COLUMNCLICK消息,此时响应函数OnColumnclickList(),在该函数里面再调用列表控件的SortItems()成员函数,它会自动调用排序函数,完成排序功能.。
mfc clistctrl 使用
mfc clistctrl 使用(实用版)目录1.MFC CListCtrl 简介2.MFC CListCtrl 控件的使用方法3.MFC CListCtrl 的常用属性和事件4.MFC CListCtrl 的优缺点5.MFC CListCtrl 的应用实例正文一、MFC CListCtrl 简介MFC CListCtrl(也称为 CMFCListCtrl)是 MFC(Microsoft Foundation Class)库中的一个常用控件,它是基于 Windows 操作系统中的 List Control 控件进行封装的。
CListCtrl 控件主要用于在窗口中显示一个列表,用户可以通过它来选择和修改列表中的项目。
二、MFC CListCtrl 控件的使用方法要在 MFC 应用程序中使用 CListCtrl 控件,需要遵循以下步骤:1.在 Visual Studio 中新建一个 MFC 项目。
2.在 Visual Studio 的“Class View”窗口中,找到“MFCClistCtrl”类,并双击以打开其对话框。
3.在对话框中,选择“Add to”选项,将 CListCtrl 控件添加到对话框中。
4.在属性窗口中,设置 CListCtrl 控件的相关属性,如列表样式、颜色等。
5.在代码窗口中,编写相关代码以实现 CListCtrl 的功能。
三、MFC CListCtrl 的常用属性和事件CListCtrl 控件具有许多常用的属性和事件,以下是其中一些:1.属性:- m_nListStyle:设置列表样式,如 LS_SORTALL、LS_SORTASCEND、LS_SORTDESCEND 等。
- m_nColumnWidth:设置列表中每列的宽度。
- m_nRowHeight:设置列表中每行的高度。
- m_nFont:设置列表中字体。
- m_nTextColor:设置列表中文本的颜色。
- m_nBkColor:设置列表背景色。
CListCtrl用法
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 ) ;四、之后可以插入行、列。
MFCCListCtrl控件使用总结整理
MFCCListCtrl控件使用总结整理一、基本操作:1. 创建CListCtrl实例,可以通过对话框资源添加控件或代码创建:```cppCListCtrl m_listCtrl;```2.设置列表样式,例如设置为报表样式:```cppm_listCtrl.Create(WS_VISIBLE , WS_CHILD , LVS_REPORT, CRect(10, 10, 500, 300), this, IDC_LIST_CTRL);```3.设置列表列头:```cppm_listCtrl.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 50);m_listCtrl.InsertColumn(1, _T("姓名"), LVCFMT_LEFT, 100);m_listCtrl.InsertColumn(2, _T("年龄"), LVCFMT_LEFT, 50);```4.添加行数据:```cppint nItemIndex = m_listCtrl.InsertItem(0, _T("1"));m_listCtrl.SetItemText(nItemIndex, 1, _T("张三"));m_listCtrl.SetItemText(nItemIndex, 2, _T("20"));``````cppm_listCtrl.DeleteItem(nItemIndex); // 删除```二、高级操作:1.设置列宽:```cppm_listCtrl.SetColumnWidth(0, LVSCW_AUTOSIZE_USEHEADER);m_listCtrl.SetColumnWidth(1, LVSCW_AUTOSIZE);m_listCtrl.SetColumnWidth(2, LVSCW_AUTOSIZE);```2.设置行高:```cppm_listCtrl.SetItemHeight(0, 50);```3.设置行选中状态:```cppm_listCtrl.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);```4.设置行背景色:```cppm_listCtrl.SetItemState(0, LVIS_SELECTED , LVIS_FOCUSED, LVIS_SELECTED , LVIS_FOCUSED);m_listCtrl.SetSelectionMark(0);m_listCtrl.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);```5.设置行图标:```cppm_listCtrl.SetItemImage(nItemIndex, nImageIndex);```6.获取行数和列数:```cppint nItemCount = m_listCtrl.GetItemCount(;int nColumnCount = m_listCtrl.GetHeaderCtrl(->GetItemCount(;```7.获取行数据:```cppCString strItemText = m_listCtrl.GetItemText(nItemIndex, nSubItemIndex);```三、自定义操作:1.列排序:```cpp```2.行拖拽排序:```cppm_listCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT ,LVS_EX_GRIDLINES , LVS_EX_HEADERDRAGDROP);``````cppm_listCtrl.ModifyStyle(0, LVS_EDITLABELS);```4.行点击事件:```cppON_NOTIFY(NM_CLICK, IDC_LIST_CTRL, OnLButtonDown)```5.自定义绘制:```cppON_WM_DRAWITEM```四、注意事项和优化建议:1. 大量数据时,慎用SetRedraw方法来控制刷新。
MFC总结之CListCtrl用法及技巧(二).
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的行高没有函数接口,可以通过自绘来实现,但是比较麻烦。
mfc中listcontrol用法
mfc中listcontrol用法MFC中的List Control是一种典型的列表框控件,它可以显示多列数据,并具备排序、选择、编辑等功能。
这篇文章将会阐述MFC中List Control的用法,以帮助读者更好地理解和运用这个控件。
一、创建List Control在MFC中,可以使用控件向导创建List Control,具体步骤如下:1. 打开Visual Studio;2. 创建一个MFC应用程序;3. 在创建对话框的过程中,添加一个List Control控件;4. 在对话框的OnInitDialog函数中,添加以下代码:CListCtrl* pListCtrl =(CListCtrl*)GetDlgItem(IDC_LIST1);pListCtrl->InsertColumn(0, _T("列1"), LVCFMT_LEFT, 60);pListCtrl->InsertColumn(1, _T("列2"), LVCFMT_LEFT, 100);pListCtrl->InsertColumn(2, _T("列3"), LVCFMT_LEFT, 100);pListCtrl->InsertItem(0, _T("第一行"));pListCtrl->SetItemText(0, 1, _T("第一行第二列"));pListCtrl->SetItemText(0, 2, _T("第一行第三列"));二、添加数据在创建好List Control之后,就可以通过以下代码添加数据:CListCtrl* pListCtrl =(CListCtrl*)GetDlgItem(IDC_LIST1);CString strText;strText = _T("第二行");int nRow = pListCtrl->InsertItem(1, strText);strText = _T("第二行第二列");pListCtrl->SetItemText(nRow, 1, strText);strText = _T("第二行第三列");pListCtrl->SetItemText(nRow, 2, strText);三、排序List Control可以通过自带的“排序”功能,对列表中的数据进行排序。
MFC CListCtrl的用法详解
以下未经说明,listctrl默认view 风格为report相关类及处理函数MFC:CListCtrl类SDK:以“ListView_”开头的一些宏。
如 ListView_InsertColumn1. CListCtrl 风格LVS_ICON: 为每个item显示大图标LVS_SMALLICON: 为每个item显示小图标LVS_LIST: 显示一列带有小图标的itemLVS_REPORT: 显示item详细资料直观的理解:windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料”2. 设置listctrl 风格及扩展风格LONG lStyle;lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style lStyle &= ~LVS_TYPEMASK; //清除显示方式位lStyle |= LVS_REPORT; //设置styleSetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置styleDWORD dwStyle = m_list.GetExtendedStyle();dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report 风格的listctrl)dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件m_list.SetExtendedStyle(dwStyle); //设置扩展风格3. 插入数据m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );int nRow = m_list.InsertItem(0, “11”);//插入行m_list.SetItemText(nRow, 1, “jacky”);//设置数据4. 一直选中item选中style中的Show selection always,或者在上面第2点中设置LVS_SHOWSELALWAYS5. 选中和取消选中一行int nIndex = 0;//选中m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);//取消选中m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);6. 得到listctrl中所有行的checkbox的状态m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);CString str;for(int i=0; i {if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i)){str.Format(_T("第%d行的checkbox为选中状态"), i); AfxMessageBox(str);}}7. 得到listctrl中所有选中行的序号方法一:CString str;for(int i=0; i {if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED ) {str.Format(_T("选中了第%d行"), i);nbsp; AfxMessageBox(str);}}方法二:POSITION pos = m_list.GetFirstSelectedItemPosition();if (pos == NULL)TRACE0("No items were selected!\n");else{while (pos){int nItem = m_list.GetNextSelectedItem(pos);TRACE1("Item %d was selected!\n", nItem);// you could do your own processing on nItem here}}8. 得到item的信息TCHAR szBuf[1024];LVITEM lvi;lvi.iItem = nItemIndex;lvi.iSubItem = 0;lvi.mask = LVIF_TEXT;lvi.pszText = szBuf;hTextMax = 1024;m_list.GetItem(&lvi);关于得到设置item的状态,还可以参考msdn文章Q173242: Use Masks to Set/Get Item States in CListCtrl/kb/173242/en-us9. 得到listctrl的所有列的header字符串内容LVCOLUMN lvcol;char str[256];int nColNum;CString strColumnName[4];//假如有4列nColNum = 0;lvcol.mask = LVCF_TEXT;lvcol.pszText = str;hTextMax = 256;while(m_list.GetColumn(nColNum, &lvcol)){strColumnName[nColNum] = lvcol.pszText;nColNum++;}10. 使listctrl中一项可见,即滚动滚动条m_list.EnsureVisible(i, FALSE);11. 得到listctrl列数int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();12. 删除所有列方法一:while ( m_list.DeleteColumn (0))因为你删除了第一列后,后面的列会依次向上移动。
如何使用CListCtrl 列表框控制
例如:
1. void BlankCheckDlg::AddItemToListCtrl(SectorBlankCheckItem * pItem) 2. { 3. CListCtrl *pCListControl =(CListCtrl *)GetDlgItem(IDC_LT_BLANKCK); 4. 5. CString strText; 6. /*int nColumnCount = pCListControl->GetHeaderCtrl()->GetItemCount();*/ 7. 8. 9. strText.Format(TEXT("%d"), pItem->m_SectorNo); 10. 11. // Insert the item, select every other item. 12. //sector no 13. pCListControl->InsertItem(LVIF_TEXT | LVIF_STATE, pItem->m_SectorNo, strText, 14. (pItem->m_SectorNo % 2) == 0 ? LVIS_SELECTED : 0, LVIS_SELECTED, 0, 0); 15. //sector size 16. strText.Format(TEXT("%d"), pItem->m_SectorSize); 17. pCListControl->SetItemText(pItem->m_SectorNo, 1, strText); 18. //start address 19. strText.Format(TEXT("0x%08x"), pItem->m_StartAddress); 20. pCListControl->SetItemText(pItem->m_SectorNo, 2, strText); 21. //end address 22. strText.Format(TEXT("0x%08x"), pItem->m_EndAddress); 23. pCListControl->SetItemText(pItem->m_SectorNo, 3, strText); 24. //blank 25. pCListControl->SetItemText(pItem->m_SectorNo, 4, pItem->m_Status); 26. //address 27. pCListControl->SetItemText(pItem->m_SectorNo, 5, pItem->m_strAddress); 28. //content 29. pCListControl->SetItemText(pItem->m_SectorNo, 6, pItem->m_strContent); 30. }
mfc clistctrl 使用
mfc clistctrl 使用摘要:一、MFC CListCtrl 控件简介1.MFC (Microsoft Foundation Class)2.CListCtrl 控件的作用和特点3.CListCtrl 与标准列表框的区别二、CListCtrl 基本使用方法1.添加CListCtrl 控件2.设置CListCtrl 属性3.向CListCtrl 添加项目4.选择和操作CListCtrl 项目三、CListCtrl 常用消息处理1.列表框通知消息2.列表框编辑消息3.列表框鼠标消息四、CListCtrl 高级应用技巧1.自定义CListCtrl 样式2.添加图像列表3.实现多列列表框4.实现选择模式五、CListCtrl 在实际项目中的应用1.文件管理器2.资源管理器3.程序界面正文:MFC(Microsoft Foundation Class)是微软提供的一个用于开发Windows 应用程序的C++ 类库。
在MFC 中,CListCtrl 是一个功能强大的列表控件,可以方便地实现类似于资源管理器、文件管理器等应用程序的列表功能。
CListCtrl 不仅具有标准列表框的基本功能,还提供了许多高级特性,使得开发人员可以轻松地实现复杂的界面和功能。
一、MFC CListCtrl 控件简介MFC CListCtrl 控件是MFC 类库中的一个重要组件,继承自CCommonControl。
它可以看作是标准列表框(CListBox)的增强版,提供了更多的属性和功能。
CListCtrl 主要用于显示一系列项目,用户可以选择、编辑和操作这些项目。
与标准列表框相比,CListCtrl 提供了更丰富的样式和布局选项,可以自定义列表项的外观,满足不同的用户需求。
二、CListCtrl 基本使用方法在MFC 应用程序中,首先需要添加CListCtrl 控件。
通过向对话框或视图类中添加CListCtrl 成员变量,并在“资源编辑器”中设置其ID,即可在界面上看到该控件。
cmfcshelllistctrl 扩展名
cmfcshelllistctrl 扩展名cmfcshelllistctrl扩展名,指的是在MFC中的一个控件扩展名。
MFC (Microsoft Foundation Class)是一套用于Windows操作系统的C++类库,主要用于开发基于Windows平台的图形用户界面(Graphical User Interface)应用程序。
cmfcshelllistctrl是其中的一个扩展名,它提供了强大的文件管理功能,使开发者能够轻松地在自己的应用程序中实现文件浏览、选择和管理功能。
在本文中,我们将详细介绍cmfcshelllistctrl扩展名的使用方法和功能。
第一步:了解cmfcshelllistctrl控件cmfcshelllistctrl控件是MFC中的一个扩展名,用于显示文件和文件夹列表。
它提供了像Windows资源管理器一样的界面,可以方便地浏览系统中的文件和文件夹,并对其进行操作。
第二步:创建一个cmfcshelllistctrl控件要使用cmfcshelllistctrl控件,首先需要在MFC应用程序中创建一个控件。
在Visual Studio中,可以通过如下步骤创建:1. 打开Visual Studio,在解决方案资源管理器中选择MFC应用程序项目。
2. 在主对话框设计器中添加一个“列表框”控件。
3. 在控制变量向导中,选择需要关联的变量类型为“CMFShellListCtrl”。
4. 点击“完成”按钮,完成控件的创建。
第三步:设置cmfcshelllistctrl控件的属性在创建完cmfcshelllistctrl控件后,需要通过设置控件的属性来定制其外观和功能。
以下是一些常见的控件属性设置:1. 列表显示模式:可以设置列表控件的显示模式,如图标模式、详细信息模式等。
2. 排序:可以根据文件属性进行排序,如名称、大小、修改日期等。
3. 过滤:可以设置文件过滤器,只显示符合条件的文件或文件夹。
mfc中clistctrl操作
mfc中clistctrl操作MFC中CListCtrl操作一、简介MFC(Microsoft Foundation Classes)是微软公司提供的一组C++类库,用于开发Windows应用程序。
CListCtrl是MFC中的一个控件类,用于显示列表数据。
本文将介绍如何在MFC中使用CListCtrl进行数据的增删改查操作。
二、创建CListCtrl控件在MFC应用程序中,可以通过拖拽方式或代码方式创建CListCtrl 控件。
拖拽方式是将CListCtrl控件拖拽到对话框上,然后在属性窗口中进行相应设置;代码方式是在对话框类的头文件中添加成员变量,并在OnInitDialog函数中进行初始化。
三、设置列表风格和列标题在CListCtrl控件创建完成后,需要设置列表的风格和列标题。
可以使用SetExtendedStyle函数设置风格,常用的风格包括网格线、全行选中和显示图标等。
使用InsertColumn函数添加列标题,可以设置标题文本和宽度等属性。
四、添加列表项和子项使用InsertItem函数可以添加列表项,可以设置项文本和图标等属性。
使用SetItemT ext函数可以设置子项文本。
可以通过循环添加多个列表项和子项。
五、获取和修改列表项和子项的值使用GetItemText函数可以获取列表项和子项的文本值。
使用SetItemText函数可以修改列表项和子项的文本值。
可以通过循环遍历列表项和子项来获取和修改多个值。
六、删除列表项和子项使用DeleteItem函数可以删除列表项,可以通过传入列表项的索引来删除指定的项。
使用DeleteAllItems函数可以删除所有列表项。
七、排序列表项可以通过调用SortItems函数对列表项进行排序。
需要为SortItems函数提供一个比较函数,用于指定排序规则。
八、其他操作除了上述的基本操作外,CListCtrl还提供了其他常用的操作功能,例如设置列表项的图标、获取选中项的索引、设置行高等。
