VC中CListCtrl中的LVCOLUMN和LVITEM详细介绍

合集下载

VC中ListCtrl经验总结

VC中ListCtrl经验总结

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

先注明一下,这里,我们用m_listctrl来表示一个CListCtrl的类对象,然后这里我们的ListCtrl 都是report形式,至于其他的如什么大图标,小图标的暂时不讲,毕竟report是大众话的使用。

其次,我们这里用条款一,条款二来描述第一点,第二点,这个是参照《Effective C++》的叫法,俺觉得这么叫比较COOL :)条款一:设置ListCtrl的风格在CSDN上常常看到有人问怎么设置风格的,他们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前面加个checkboxpListCtrl->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 ;}elselvcolumn.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::OnItemClick(NMHDR* pNMHDR, LRESULT* pResult){// TODO: Add your control notification handler code hereint 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的代码吧,反正很简单// 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}}条款十:删除条款九中选中的行这个相对前面九个条款是比较麻烦的,因为如果你要删除多行的话,往往要出错。

MFCCListCtrl控件使用总结整理

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方法来控制刷新。

VC++中listcontrol的用法

VC++中listcontrol的用法

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);//获取当前窗口stylelStyle &= ~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); //设置扩展风格注:listview的style请查阅msdn/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles. asp3. 插入数据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.SetItemT ext(nRow, 1, “jacky”);//设置数据4. 一直选中item选中style中的Show selection always,或者在上面第2点中设置LVS_SHOWSELALWAYS 5. 选中和取消选中一行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);9. 得到listctrl的所有列的header字符串内容LVCOLUMN lvcol;char str[256];int nColNum;CString strColumnName[4];//假如有4列nColNum = 0;lvcol.mask = LVCF_TEXT;lvcol.pszText = str;hT extMax = 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))因为你删除了第一列后,后面的列会依次向上移动。

VC7

VC7

GetSelectionMark SetSelectionMark GetExtendedStyle SetExtendedStyle SubItemHitTest GetWorkAreas GetNumberOfWorkAreas SetItemCountEx SetWorkAreas ApproximateViewRect GetBkImage SetBkImage GetHoverTime SetHoverTime
每一项以全尺寸图标(32×32 像素)出现,下面有一个标签。用户 可在列表视图窗口拖动项到任意位置。 l 小图标视图
每一项以小图标(16×16 像素)出现,右边有一个标签。用户可在 列表视图窗口拖动项到任意位置。 l 列表视图 每一项以小图标出现,下面有一个标签。项按列排列,不能拖动到 列表视图窗口的任何位置。 l 报表视图 每一项在本行上出现,右边有排列成列的附加信息。最左边的列包 含小图标和标签,下一列包含应用指定的子项。嵌入标题控件实现 这些列。要了解报表视图标题控件和列的更多信息,请参阅联机文 档“Visual C++程序员指南”中的“使用 CListCtrl:给控件添加列(报 表视图)”。 控件的当前列表视图风格指定当前视图。要了解这些风格及其用法的更 多信息,请参阅联机文档“Visual C++程序员指南”中的“使用 CListCtrl: 改变列表控件风格”。
项和子项
列表视图控件中的每一项含有一个图标、一个标签、一个当前状态和应 用定义值(称为“项数据”)。一个或更多子项还可与每一项联系。一个 “子项”是一个字符串,在报表视图中可显示在项图标和标签右边的列 里。列表视图控件中的每一项都必须与子项数目相同。 类 CListCtrl 提供一些函数来插入、删除、查找和更改这些项。要了解 更多信息,请参阅“Visual C++程序员指南”中的“使用 CListCtrl:列表 控件中的滚动、排列、排序和查找”。同时请参阅 CListCtrl::GetItem, CListCtrl::InsertItem 和 CListCtrl::FindItem。 缺省时,列表视图控件负责存储一个项的图标和文本属性。然而,除了 这些项类型外,类 CListCtrl 支持“回调项”。一个“回调项”是一个列 表视图项,每个应用——而不是控件——存储文本,图标或两者。回调 掩码用于指定哪个项的属性(文本和/或图标)由应用提供。如果应用

VC++中listcontrol的用法

VC++中listcontrol的用法

少将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);//获取当前窗口stylelStyle &= ~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); //设置扩展风格注:listview的style请查阅msdn/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles. asp3. 插入数据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.SetItemT ext(nRow, 1, “jacky”);//设置数据4. 一直选中item选中style中的Show selection always,或者在上面第2点中设置LVS_SHOWSELALWAYS 5. 选中和取消选中一行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);9. 得到listctrl的所有列的header字符串内容LVCOLUMN lvcol;char str[256];int nColNum;CString strColumnName[4];//假如有4列nColNum = 0;lvcol.mask = LVCF_TEXT;lvcol.pszText = str;hT extMax = 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))因为你删除了第一列后,后面的列会依次向上移动。

VC ——CListCtrl使用技巧

VC ——CListCtrl使用技巧

VC ——CListCtrl使用技巧2010年7月7日yanghy跳到评论Description: LVS_ICON: 为每个item显示大图标LVS_SMALLICON: 为每个item显示小图标LVS_LIST: 显示一列带有小图标的itemLVS_REPORT: 显示item详细资料直观的理解:windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料”2. 设置listctrl 风格及扩展风格LONG lStyle;lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口stylelStyle &= ~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); //设置扩展风格注:listview的style请查阅msdn/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistv iewstyles.asp3. 插入数据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<m_list.GetItemCount(); 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<m_list.GetItemCount(); i++){if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED ){str.Format(_T(“选中了第%d行”), i);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超强排序

CListCtrl超强排序

Visual C++ CListCtrl类超强排序注:本示例程序是在Unicode环境下首先必须了解这些:CListCtrl::SortItemsBOOL SortItems(PFNLVCOMPARE pfnCompare,DWORD dwData)返回值:如果成功,则返回非零值,否则为0。

参数:pfnCompare 应用定义的比较函数的地址。

当需要比较两个列表项的相互关系而进行排序操作时,则调用比较函数。

比较函数要么是类的静态成员,要么是不属于任何类的独立函数。

dwData 应用定义的、传递给比较函数的值。

说明:使用应用定义的比较函数对列表视图项进行排序。

为了影响新的次序,每一项的索引需要做一些改变。

比较函数有下列形式:int CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort); 如果第一项在第二项之前,则返回一个负值;若第一项在第二项之后,则返回一个正值;如果两者等价;则返回零。

参数lParam1和lParam2指定了要进行比较的两项的数据,而参数lParamSort与dwData 值相同。

-----------------------------传说中的分割线------------------------------代码开始:struct DATA{CListCtrl *plist;int col;};//回调函数第三个参数对应的数据结构,可以自定义,至少要包含这两项bool fav=false; //排序方法(递增或递减)int CALLBACK MylistCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) {/*回调函数,第一二个参数是列表其中两项(行)相关联的32位值(通常是个指向某一结构的指针),第三个是用户自定义的参数(DATA *)*/DATA* MyData = (DATA*)lParamSort;int col = MyData->col;//点击的列项传递给col,用来判断点击了第几列//取项的字符串CString strItem1, strItem2;strItem1=MyData-> plist-> GetItemText((int)lParam1,col);strItem1=MyData-> plist-> GetItemText((int)lParam2,col);if(col==0){//第一列,对比整型数char ch1[MAX_PATH],ch2[MAX_PATH];wsprintfA(ch1, "%s", (LPCTSTR)strItem1);wsprintfA(ch2, "%s", (LPCTSTR)strItem2);if(fav)return (atoi(ch1)-atoi(ch2));elsereturn (atoi(ch2)-atoi(ch1));}else if(col==1){//第二列,对比浮点数(其他字符串比较太简单了,不值得列出^_^)wsprintfA(ch1, "%s",(LPCTSTR)cstr);wsprintfA(ch2, "%s",(LPCTSTR)cstr2);if(fav)return (int)(100*(atof(ch1)-atof(ch2))); //精确到小数点后两位(可修改) elsereturn (int)(100*(atof(ch2)-atof(ch1)));}return 0;}/*给CListCtrl添加LVN_COLUMNCLICK(点击列表的列)消息响应函数,注:也可以将函数内的代码添加到你需要的地方*/void CXxxxDlg::OnLvnColumnclickList1 (NMHDR *pNMHDR, LRESULT *pResult){LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);DATA data;data.col = pNMLV->iSubItem; //取列data.plist = &m_list1; //取列表指针fav=!fav; //排序每点一次列就变一次,若想固定排序,那就去掉这句//设置列表项相关项,以便于排序int len=m_list1.GetItemCount();for(int i=0;i<len;i++){m_list1.SetItemData(i,(DWORD_PTR)i); //列表项相关项设为项号}m_list1.SortItems(MylistCompare,(LPARAM)&data);*pResult = 0;}。

clistctrl setitemtext

clistctrl setitemtext

clistctrl setitemtext什么是CListCtrl?CListCtrl 是MFC(Microsoft Foundation Classes)中的一个类,它是Windows 提供的一个控件,用于在对话框、窗口或者视图中显示列表数据。

List control 提供了类似于表格的界面,可以显示多列的数据,每列的宽度可以自行调整,也可以支持列和行的排序等功能。

CListCtrl 的作用是什么?CListCtrl 可以用来显示和编辑多行多列的文本,用于在列表视图中显示复杂数据,可以方便地进行数据管理和操作。

它不仅可以显示文本数据,还可以显示图像、按钮等其他控件。

它具有很强的灵活性和扩展性,可以根据需要进行自定义,实现各种复杂的界面效果。

如何使用CListCtrl 设置每个单元格的内容?要设置每个单元格的内容,我们可以使用CListCtrl 类中的SetItemText() 函数。

该函数有两个参数,第一个参数是行号(0-based),第二个参数是列号(0-based),第三个参数是要设置的内容。

以下是具体的步骤:步骤1:创建一个CListCtrl 对象并添加列首先,在对话框类中添加一个成员变量,类型为CListCtrl,用于存储列表控件对象。

然后,在OnInitDialog() 函数中初始化列表控件对象,设置初始属性(如显示行选中、网格线等),并添加列表的列名。

步骤2:设置每个单元格的内容在需要设置每个单元格内容的地方,调用SetItemText() 函数即可。

假设我们要设置第一行第一列的内容为"Hello, World!",可以使用以下代码:m_ListCtrl.SetItemText(0, 0, _T("Hello, World!"));这样就设置了第一行第一列的内容为"Hello, World!"。

步骤3:重复步骤2根据需要,重复调用SetItemText() 函数设置其他单元格的内容。

如何使用CListCtrl 列表框控制

如何使用CListCtrl 列表框控制
step3:添加行:
例如:
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. }

VC中使用ListCtrl和LVITEM 经验总结

VC中使用ListCtrl和LVITEM 经验总结

VC中使用ListCtrl和LVITEM 经验总结(转)默认分类2009-10-04 22:22 阅读78 评论1字号:大中小VC中使用ListCtrl和LVITEM 经验总结(博客搬家)2008-08-04 12:19:54此文转至:/BlogView.asp?logID=961VC中使用ListCtrl和LVITEM 经验总结ListCtrl在工作中,常常用到,也常常看到大家发帖问怎么用这个控件,故总结了一下自己的使用经验,以供参考使用。

先注明一下,这里,我们用m_listctrl来表示一个CListCtrl的类对象,然后这里我们的ListCtrl都是report形式,至于其他的如什么大图标,小图标的暂时不讲,毕竟report是大众话的使用。

其次,我们这里用条款一,条款二来描述第一点,第二点,这个是参照《Effective C++》的叫法,俺觉得这么叫比较COOL :)条款一:设置ListCtrl的风格在CSDN上常常看到有人问怎么设置风格的,他们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前面加个checkboxpListCtrl->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 ;}elselvcolumn.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 的使用有时候,你想对于某一行,加入一些额外的信息,那么就可以使用这个lParammsdn是这么描述的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::OnItemClick(NMHDR* pNMHDR, LRESULT* pResult){// TODO: Add your control notification handler code hereint nItem = -1;LPNMITEMACTIVA TE 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}}条款十:删除条款九中选中的行这个相对前面九个条款是比较麻烦的,因为如果你要删除多行的话。

VC++ 列表控件(CLIST) 使用方法 (2)

VC++ 列表控件(CLIST) 使用方法 (2)

VC++ 列表控件(CList) 使用方法 (2)列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值。

MFC中使用CListCtrl类来封装列表控件的各种操作。

通过调用BOOL Create( DWORD dwStyle, const RECT&amp;rect, CWnd* pParentWnd, UINT nI D );创建一个窗口,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);通过调用intInsertItem( intnItem, LPCTSTR lpszItem );可以在列表控件中nItem指明位置插入一项,lpszItem为显示字符。

除LVS_REPORT风格外其他三种风格都只需要直接调用InsertItem就可以了,但如果使用报表风格就必须先设置列表控件中的列信息。

通过调用intInsertColumn( intnCol, LPCTSTR lpszColumnHeading, intnFormat , intnWidth, intnSubItem);可以插入列。

vs listview使用方法

vs listview使用方法

vs listview使用方法以vs listview使用方法为标题,写一篇文章。

一、介绍ListView是Android开发中常用的控件之一,用于展示可滚动的列表。

在Visual Studio中,我们可以使用Xamarin.Forms来创建ListView,并通过数据绑定来填充列表项。

本文将详细介绍如何在Visual Studio中使用ListView控件。

二、创建ListView控件1. 打开Visual Studio,并创建一个新的Xamarin.Forms项目。

2. 在XAML页面中,添加一个ListView控件。

可以通过拖拽控件或手动编写代码来实现。

3. 设置ListView的布局属性,如宽度、高度、对齐方式等。

三、绑定数据源1. 定义一个数据模型类,用于存储列表项的数据。

可以包含多个属性,如名称、图片、描述等。

2. 在XAML页面中,设置ListView的ItemsSource属性为数据模型的集合。

3. 定义一个数据模板,用于展示列表项的布局和样式。

可以通过DataTemplate标签来实现。

四、自定义列表项1. 在XAML页面中,为ListView添加一个ItemTemplate属性,并设置为自定义的数据模板。

2. 在数据模板中,可以使用各种布局控件来定义列表项的布局,如StackLayout、Grid、RelativeLayout等。

3. 可以在数据模板中绑定数据模型的属性,以展示列表项的具体内容。

五、处理列表项的点击事件1. 在XAML页面中,为ListView添加一个ItemSelected事件处理程序。

2. 在事件处理程序中,可以获取被点击的列表项的数据,并进行相应的处理。

六、其他常用属性和方法1. 可以设置ListView的SelectionMode属性来定义选择模式,如单选或多选。

2. 可以使用ListView的ScrollTo方法来滚动到指定的列表项。

3. 可以使用ListView的RefreshCommand属性来实现下拉刷新功能。

clistctrl 列数

clistctrl 列数

clistctrl 列数1. 什么是 clistctrl?clistctrl 是一个在 MFC(Microsoft Foundation Classes)框架下的控件,用于在窗口界面中显示和编辑表格数据。

它提供了一种方便的方式来展示和操作数据,类似于表格或者列表。

2. clistctrl 的基本功能clistctrl 控件可以用于显示和管理数据表格,具有以下基本功能:•显示数据:clistctrl 可以显示多行多列的数据表格,每个单元格可以显示文本、图像或者其他自定义内容。

•排序:clistctrl 支持根据某一列的内容对数据进行排序,方便用户查找和比较数据。

•编辑:用户可以直接在 clistctrl 中编辑单元格内容,可以实时更新数据。

•选择:用户可以选择一行或多行数据进行操作,例如删除、复制等。

•滚动:当数据超过 clistctrl 控件的可见区域时,可以通过滚动条来查看隐藏的数据。

•样式定制:clistctrl 可以通过设置样式和属性来改变表格的外观和行为,例如行高、列宽、背景颜色等。

3. clistctrl 的使用方法要使用 clistctrl 控件,需要进行以下步骤:步骤 1:创建 clistctrl 控件对象在 MFC 的窗口类中声明一个成员变量,类型为 clistctrl,例如:CListCtrl m_listCtrl;步骤 2:创建 clistctrl 控件在窗口类的 OnInitDialog() 函数中,调用 Create() 函数创建 clistctrl 控件,并设置其样式和属性,例如:m_listCtrl.Create(WS_VISIBLE | WS_CHILD | LVS_REPORT, CRect(10, 10, 400, 300), this, IDC_LIST_CTRL);步骤 3:添加列使用 InsertColumn() 函数添加列,指定列的索引、标题和宽度,例如:m_listCtrl.InsertColumn(0, _T("姓名"), LVCFMT_LEFT, 100);m_listCtrl.InsertColumn(1, _T("年龄"), LVCFMT_LEFT, 100);步骤 4:添加行和数据使用 InsertItem() 函数添加行,指定行的索引和文本,例如:m_listCtrl.InsertItem(0, _T("张三"));m_listCtrl.SetItemText(0, 1, _T("20"));步骤 5:处理 clistctrl 事件clistctrl 控件提供了一系列的事件,例如单击、双击、选择等。

Clistcontrl用法2

Clistcontrl用法2

VC CListCtrl控件的使用方法收藏在VC中使用控件一直是件让我头痛的事件,从控件的创建到控件的操作管理,都得写一大堆代码,相比于Delphi/VB,实在是麻烦多了。

其实在之前学习SDK 的时候,就有想过专门花点儿时间来学习VC中控件的使用,但一直没空。

最近准备写一个小工具,要用到ListCtrl控件,所以又不得不好好的恶补一翻。

我是在MFC的对话框模式下使用CListCtrl控件的,其实不管在SDK或文档/视图模式下,VC控件的使用都差不多,下面来好好的写写CListCtrl控件的使用笔记。

一、CListCtrl控件的创建由于我是在MFC的对话框模式下使用CListCtrl控件的,所以只需要在控件栏上选择CListCtrl的图形按钮,接着添加到对话框中就行了。

二、CListCtrl控件样式的设置第一步:在使用CListCtrl控件之前,首先需要为该控件关联一个变量(只针对于对话框模式):CListCtrl m_BlogAccountList;第二步:由于CListCtrl控件要做一些初始化操作,比如设置控件样式,设置控件的行列并填入一些数据。

初始化操作的代码是在对话框的OnInitDialog事件中写入的。

默认情况下,CListCtrl控件的样式是非常简陋的,大多情况下我们都需要对CListCtrl控件的样式进行修改,比如设置为报表样式,可以进行整行选择等,如有需要还有调整CListCtrl控件的行高。

诸如这些设置都需要用到CListCtrl控件的扩展样式,所以首先得了解这些扩展样式。

我在MSDN中没有找到CListCtrl控件的扩展样式资料,只好上百度百科找了找。

CListCtrl控件的扩展样式LVS_EX_GRIDLINES //绘制表格线LVS_EX_SUBITEMIMAGES//子项目图标列表LVS_EX_CHECKBOXES //带复选框LVS_EX_TRACKSELECT //自动换行LVS_EX_HEADERDRAGDROP//报表头可以拖拽LVS_EX_FULLROWSELECT //选择整行LVS_EX_ONECLICKACTIVATE//单击激活LVS_EX_TWOCLICKACTIVATE//双击激活LVS_EX_FLATSB//扁平滚动条LVS_EX_REGIONALLVS_EX_INFOTIPLVS_EX_UNDERLINEHOTLVS_EX_UNDERLINECOLDLVS_EX_MULTIWORKAREAS//多工作区对话框模式下创建的CListCtrl控件样式只有一个,就是WS_BORDER,而我需要为CListCtrl设置为报表样式,并能选择整行,下面就可以开始写代码了://通过GetWindowLong来获取CListCtrl已有的样式DWORD dwStyle = GetWindowLong(m_BlogAccountList.m_hWnd,GWL_STYLE);//在原有样式的基本上,添加LVS_REPORT扩展样式SetWindowLong(m_BlogAccountList.m_hWnd, GWL_STYLE,dwStyle|LVS_REPORT);//获取已有的扩展样式DWORD dwStyles = m_BlogAccountList.GetExStyle();//取消复选框样式dwStyles &= ~LVS_EX_CHECKBOXES;//添加整行选择和表格线扩展样式m_BlogAccountList.SetExtendedStyle(dwStyles|LVS_EX_FULLROWSELECT |LVS_EX_GRIDLINES);通过以上四句代码,就已经能满足我的需求了。

虚拟列表控件(CListCtrl)

虚拟列表控件(CListCtrl)

虚拟列表控件(CListCtrl)2009年05月05日星期二16:00一、什么是虚拟列表控件虚拟列表控件是指带有LVS_OWNERDATA风格的列表控件。

二、为什么使用虚拟列表控件我们知道,通常使用列表控件CListCtrl,需要调用InsertItem把要显示的数据插入列表中,之后我们就不必关心数据在哪里了,这是因为控件自己开辟了内存空间来保存这些数据。

现在假设我们要显示一个数据库,里面的信息量很大,有几十万条记录。

通常有两种方法解决这个问题:1是仅仅在ListCtrl中插入少量的数据,比如100个,然后通过[上一页][下一页]两个按钮进行控制,某一时刻显示的只是从xxx到xxx+100之间的记录。

2是把所有数据全部插入到ListCtrl中,然后让用户通过滚动来查看数据。

无疑,很多用户喜欢采用第二种方式,特别是对于已经排序的数据,用户只需用键盘输入某行的开头字符,就可以快速定位到某一行。

但是,如果这样做,InsertItem插入数据的过程将是很漫长的,而且用户会看到ListCtrl刷新速度也很慢,而且所有数据都位于内存中消耗了大量的内存,当数据多达上万以后几乎是不能忍受的。

为此,mfc特别提供了虚拟列表的支持。

一个虚拟列表看起来和普通的ListCtrl一样,但是不用通过InsertI tem来插入数据,它仅仅知道自己应该显示多少数据。

但是它如何知道要显示什么数据呢?秘密就在于当列表控件需要显示某个数据的时候,它向父窗口要。

假设这个列表控件包含100个元素,第10到20个元素(行)是可见的。

当列表控件重画的时候,它首先请求父窗口给它第10个元素的数据,父窗口收到请求以后,把数据信息填充到列表提供的一个结构中,列表就可以用来显示了,显示第10个数据后,列表会继续请求下一个数据。

在虚拟的样式下,ListCtrl可以支持多达DWORD个数据项。

(缺省的listctrl控件最多支持int个数据项)。

但是,虚拟列表的最大优点不在于此,而是它仅仅需要在内存中保持极少量的数据,从而加快了显示的速度。

clistctrl 使用例子

clistctrl 使用例子

clistctrl 使用例子CListCtrl 是 MFC 中的一个控件类,用于在对话框或视图中显示和管理列表数据。

它类似于 Windows 下的 ListView 控件,但提供了更多的功能和灵活性。

下面列举了十个 CListCtrl 的使用例子。

1. 显示静态数据:使用 CListCtrl 添加列表项并设置文本,可以用于显示固定的数据列表,比如一个学生名单或商品列表。

2. 动态添加数据:通过代码动态地添加列表项和数据,可以实现动态更新的列表,比如显示实时的股票价格或服务器状态。

3. 列表排序:通过设置 CListCtrl 的排序功能,可以让列表根据某一列的值自动排序,使数据更易于查找和理解。

4. 列表编辑:通过设置 CListCtrl 的编辑功能,可以在列表中直接编辑数据,比如修改一个学生的分数或产品的价格。

5. 列表选择:通过设置 CListCtrl 的选择功能,可以让用户选择列表中的一项或多项数据,并进行相应操作,比如删除或复制。

6. 列表筛选:通过设置 CListCtrl 的筛选功能,可以根据用户输入的条件对列表数据进行筛选,只显示符合条件的数据。

7. 列表分组:通过设置 CListCtrl 的分组功能,可以将列表数据按照某一列的值进行分组显示,比如按照地区或类别分组。

8. 列表图标:通过设置 CListCtrl 的图标功能,可以在列表中显示图标,比如显示文件的图标或显示不同状态的图标。

9. 列表链接:通过设置 CListCtrl 的链接功能,可以在列表中显示链接,比如显示网页链接或打开文件的链接。

10. 列表导出:通过设置 CListCtrl 的导出功能,可以将列表数据导出为 Excel 或 CSV 格式,方便进行数据分析和处理。

以上是关于 CListCtrl 的十个使用例子,通过这些例子可以发现,CListCtrl 是一个非常强大和灵活的控件,可以用于各种不同的应用场景。

无论是显示静态数据还是进行复杂的数据操作和分析,CListCtrl 都可以提供很好的支持。

clist

clist

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自动释放,则效果是列表中看不到图标,只看到一个白方块。

下面生成CImageList,并将其绑定到CListCtrl中,这是CImageList中还没有图标,只是一个容器:static int flag=2;if(flag==2){//只调用一次SetImageList,否则出错m_ImageList.Create(128, 128, ILC_COLORDDB|ILC_MASK, 20, 1);m_ListCtrl.SetImageList(&m_ImageList,LVSIL_SMALL);}flag=(flag+1)%2;如果CListCtrl已经用过,曾经加过图标进去,这时就要删除上次放进m_ImageList 中的Imagefor(int kk=0;kk<m_ImageList.GetImageCount();kk++)m_ImageList.Remove(k);下面介绍如何向CListCtrl里面加入行,并同时为每一行动态加入图标:假设m_listRowCount为要加入的行数。

列表视图控件CListCtrl成员函数详解

列表视图控件CListCtrl成员函数详解

CListCtrl类的成员函数列表如下:构造函数:ClistCtrl构造一个CListCtrl对象Create创建列表控件并将其附加给CListCtrl对象属性设置:GetBkColor获取列表视图控件的背景色SetBkColor设置列表视图控件的背景色GetImageList获取用于绘制列表视图项的图象列表的句柄SetImageList指定一个图象列表到列表视图控件GetItemCount获取列表视图控件中的项的数量GetItem获取列表视图项的属性GetCallbackMask获取列表视图控件的回调掩码SetCallbackMask设置列表视图控件的回调掩码GetNextItem查找指定特性和指定指定项关系的列表视图项GetFirstSeletedItemPosition在列表视图控件中获取第一个选择的列表视图项的位置GetNextSeletedItem为重复而获取下一个选择的列表视图GetItemRect获取项的有界矩形SetItemPosition在列表视图控件中移动一项到指定位置GetItemPosition获取列表视图项的位置GetStringWidth指定需要显示所有指定字符串的最小列宽GetEditControl获取用于编辑一个项文本的编辑控件的句柄GetColumn获取控件的列的属性SetColumn设置列表视图列的属性GetColumnWidth获取报表视图或列表视图中的列的宽度SetColumnWidth改变报表视图或列表视图中的列的宽度GetCheck获取与某项相关的状态图象的当前显示状态SetCheck设置与某项相关的状态图象的当前显示状态GetViewRect获取列表视图控件中所有项的有界矩形GetTextColor获取列表视图控件的文本颜色SetTextColor设置列表视图控件的文本颜色GetTextBkColor获取列表视图控件的文本背景色SetTextBkColor设置列表视图控件的文本背景色GetTopIndex获取最高级项的索引GetCountPerPage计算可正好垂直放入列表视图控件中的项的数目GetOrigin获取列表视图控件的最初的当前视图SetItemState改变列表视图控件的项的状态GetItemState获取列表视图控件的项的状态GetItemText获取列表视图项或子项的文本SetItemText设置列表视图项或子项的文本SetItemCount准备一个列表视图控件以添加大量的项GetItemData获取与某项相关的应用所指定的值SetItemData设置项的应用指定的值GetSelectedCount获取列表视图控件中选择项的数量SetColumnOrderArray设置列表视图控件的列序(左或右)GetColumnOrderArray获取列表视图控件的列序(左或右)SetIconSpacing设置列表视图控件中的图标的距离GetHeaderCtrl获取列表视图控件的标题控件GetHotCursor获取在热调试对列表视图控件有效时使用的游标SetHotCursor设置在热调试对列表视图控件有效时使用的游标GetSubItemRect获取列表视图控件中某项的有界矩形GetHotItem获取当前在游标下的列表视图项SetHotItem设置列表视图控件的当前热项GetSelectionMark获取列表视图控件的选择屏蔽SetSelectionMark设置列表视图控件的选择屏蔽GetExtendedStyle获取列表视图控件的当前扩展风格SetExtendedStyle设置列表视图控件的当前扩展风格SubItemHitTest指定哪个列表视图项在指定位置GetWorkAreas获取列表视图控件的当前工作区GetNumberOfWorkAreas获取列表视图控件的当前工作区数量SetItemCountEx设置虚列表视图控件的项的数量SetWorkAreas设置列表视图控件中图标可以显示的区域ApproximateViewRect指定显示列表视图控件项所需的宽度和高度GetBkImage获取列表视图控件的当前背景图象SetBkImage设置列表视图控件的当前背景图象GetHoverTime获取列表视图控件的当前逗留时间SetHoverTime设置列表视图控件的当前逗留时间操作函数:InsertItem在列表视图控件中插入一个新项DeleteItem从控件中删除一项DeleteAllItems从控件中删除所有项FindItem查找具有指定的字符的列表视图项SortItems使用应用定义的比较函数排序列表视图项HitTest指定哪个列表视图在指定的位置上EnsureVisible保证项是可见的Scroll滚动列表视图控件的内容ReDrawItems强迫列表视图控件刷新一些项Update强迫控件刷新一个指定的项Arrange调整一栏里的项EditLabel开始项文本该处编辑InsertColumn插入列表视图控件中的新列DeleteColumn从列表视图控件中删除一列CreateDragImage为指定的项构造一个拖动图象列表可覆盖的函数:DrawItem当自绘制控件的可视部分改变时被调用一些函数的详解:1 Create:创建列表控件并将其附加给CListCtrl对象BOOL Create(DWORD dwStyle,const RECT& rect,CWnd* pParentWnd,UINT nID);返回值:如果成功,则返回非零值,否则返回0.参数如下:dwStyle: 为列表中的控件指定其风格.可为控件使用控件风格列表中的任意组合. rect: 为列表中的控件指定其大小和位置.它既可以是一个CRect对象,也可以是一个Rect 结构.pParentWnd: 为列表中的控件指定其父窗口,通常为CDialog.它不应当为空.nID: 为列表中的控件指定其ID号.说明:可以用两步来构造一个CListCtrl.首先调用构造函数,然后调用Create函数.这样将创建一个列表视图控件,并将附加给CListCtrl对象.参数dwStyle可以是以下值的组合:LVS_ALIGNLEFT 在图标和小图标视图中指定项左对齐.LVS_ALIGNTOP 在图标和小图标视图中指定项在控件的顶端对齐.LVS_AUTOARRANGE 在图标或小图标视图中指定图标自动保持对齐.LVS_EDITABELS 允许项文本能够适本地进行编辑.父窗口必须运行了LVN_ENDLABLEDIT通知消息.LVS_ICON 指定为图标视图.LVS_LIST 指定为列表视图.LVS_NOCOLUMNHEADER 指定在报表视图中不显示列标题.缺省时,在报表视图中列有标题.LVS_NOLABELWRAP 在图标视图的单行中显示项文本,缺省时,在图标视图中项文本有可能被遮住.LVS_NOSCROLL 不允许滚动,所有项都必须在客户可视的区域内.LVS_NOSORTHEADER 指定列标题不象按钮那样工作.这种风格是有用的,例如,当在报表视图中单击列标题,将不会带来例如排序那样的动作.LVS_OWNERDRAWFIXED 在报表视图中允许所有者窗口为项着色.列表视图控件发送一条WM_DRAWITWM 消息来为每一项着色;但它不为每一子项发送独立的消息.DRAWITEMSTRUCT结构中的itemDate成员则包含了指定列表视图项的项数据.LVS_REPORT 指定报表视图.LVS_SHAREIMAGELISTS 指定控件没有归属于它的图象列表的所有权(也就是说,当控件被销毁后,图象列表不会被销毁).该风格能够是同一个图象列表用于多个列表视图控件中.LVS_SHOWSELALWAYS 总是显示选择框,即使任何控件都没有焦点.LVS_SINGLESEL 允许每次只能选择一个项.缺省时,同时能选择多项.LVS_SMALLICON 指定为小图标视图.LVS_SORTASCENDING 使项按照项文本的升序方式排列.LVS_SORTDESCENDING 使项按照项文本的降序方式排列.2 InsertColumn:插入列表视图控件中的新列函数原型:int InsertColumn(int nCol, const LVCOLUMN* pColumn);int InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1);参数如下:nCol表示要插入列的列号.pColumn为新建列属性的LVCOLUMN结构的地址.对于第二种函数重载,参数lpszcolumnHeading 为列标题的字符串的地址,所以可以使用一个字符串,比如"姓名".nFormat指定列对齐方式的整数,缺省值是左对齐.它可以为下列值之一:LVCFMT_LEFT,LVCFMT_RIGHT或LVCFMT_CENTER.nWidth以像素为单位的列宽.缺省值为-1,表示没有设置列宽.nSubItem与列相关联的子项的索引.缺省值为-1,表示没有子项与列相关.3 InsertItem:在列表视图控件中插入一个新项函数原型如下:int InsertItem( const LVITEM* pItem );int InsertItem( int nItem, LPCTSTR lpszItem );int InsertItem( int nItem, LPCTSTR lpszItem, int nImage );int InsertItem( UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam );其中,nItem是控件中行的索引、lpszItem是控件头的名字.一般用的比较多的是第二种和第三种,其中第三种是建立一个带有头标的项.返回值: 如果插入成功的话,就返回新项的索引,否则就返回-1.4 SetExtendedStyle:设置列表视图控件的当前扩展风格函数声明如下:DWORD SetExtendedStyle(DWORD dwNewStyle ); 其中dwNewStyle为指定的扩展样式,可以为下列值:LVS_EX_GRIDLINES //绘制表格LVS_EX_SUBITEMIMAGES//子项目图标列表LVS_EX_CHECKBOXES //带复选框LVS_EX_TRACKSELECT //自动换行LVS_EX_HEADERDRAGDROP//报表头可以拖拽LVS_EX_FULLROWSELECT //选择整行LVS_EX_ONECLICKACTIVATE//单击激活LVS_EX_TWOCLICKACTIVATE//双击激活LVS_EX_FLATSB//扁平滚动条LVS_EX_REGIONALLVS_EX_INFOTIP//将提示信息窗口的消息通知父窗口LVS_EX_UNDERLINEHOTLVS_EX_UNDERLINECOLDLVS_EX_MULTIWORKAREAS//多工作区5 SetItemText:设置列表视图项或子项的文本BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );例子:InsertItem(0,"");SetItemText(0,0,"1.培训时间");SetItemText(0,1,"[ ]");6 EnsureVisible:保证项是可见的BOOL EnsureVisible(int nItem,BOOL bPartialOK)返回值:如果成功,则返回非零值,否则为0.参数:nItem: 将可视的列表视图项的索引值.bPartialOK: 指定是否部分可视是可以接受的.说明:调用该函数将使列表视图项至少部分可视.如果必要,可以滚动列表视图控件.同时,如果参数bPartialOK等于零,那么当项部分可视时,将不发生滚动.7 DeleteAllItems从控件中删除所有项BOOL DeleteAllItems()返回值:如果成功,则返回非零值,否则为0.。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC中CListCtrl中的LVCOLUMN和LVITEM详细介绍
2011-10-09 18:56
列表视图控件(List Control)
列表视图控件是一种非常常用的控件,在需要以报表形式显示数据时,列表控件通常是最好的选择,许多专用的数据报表控件,也是在它的基础上派生而来。

与树视图类似,列表控件可以由多个子项目组成,并且支持大图标、小图标、列表和报表4种方式显示信息,如图1所示。

图1 列表视图的4种显示方式
列表视图包含一个项目列表,而其中每个项目由图标、项目名称和多个子项组成,每一个子项所包含的项目的数目必须相同,属性相同的每个子项显示在同一个列中。

列表视图控件有两个重要的数据结构LVCOLUMN和LVITEM。

LVCOLUMN用于定义报表方式下的“列”的结构;LVITEM用于定义“项”的结构。

这两个结构的定义及说明如下:
typedef struct _LVCOLUMN {
UINT mask; //说明此结构中哪些成员是有效的
int fmt; //列的对齐方式
int cx; //列的初始宽度
LPTSTR pszText; //列的标题
int cchTextMax; //pszText所指向的缓冲区的大小
int iSubItem; //与列关联的子项的索引值,从0开始
int iImage; //与列关联的图像列表中指定图像的索引值
int iOrder; //第几列,0代表最左一列
} LVCOLUMN, FAR *LPLVCOLUMN;
typedef struct _LVITEM {
UINT mask; //说明LVITEM结构中哪些成员有效
int iItem; //项目的索引值(可以视为行号)从0开始
int iSubItem; //子项的索引值(可以视为列号)从0开始
UINT state; //子项的状态
UINT stateMask; //状态有效的屏蔽位
LPTSTR pszText; //主项或子项的名称
int cchTextMax; //pszText所指向的缓冲区大小
int iImage; //关联图像列表中指定图像的索引值
LPARAM lParam; //程序定义的32位参数
int iIndent; //表示图像位置缩进的单位
} LVITEM, FAR *LPLVITEM;
列表项常用的属性如下:
View指定程序运行后列表视图控件最初显示的方式,可以设置为Icon(大图标)、SmallIcon(小图标)、List(列表)或Report(报表);Single selection
表示每次只能选中一个项;
Auto arrange使得项目在Icon和Small Icon显示方式下能够自动排序;Edit Labels表示可以编辑项目的卷标;No column header表示取消控件所有列的标题。

相关文档
最新文档