MFC中使CListCTrl控件排序
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,即可在界面上看到该控件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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()成员函数,它会自动调用排序函数,完成排序功能.。