欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

CListCtrl的用法总结

发布时间:2025/3/12 编程问答 36 豆豆
生活随笔 收集整理的这篇文章主要介绍了 CListCtrl的用法总结 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1 CListCtrl的风格

CListCtrl的风格有四种:

  • LVS_ICON: 为每个item显示大图标
  • LVS_SMALLICON: 为每个item显示小图标
  • LVS_LIST: 显示一列带有小图标的item
  • LVS_REPORT: 显示item详细资料

分别对应着资源管理器查看菜单下的大图标,小图标,列表,详细资料。

可以在控件属性视图下设置:View属性.

也可以用代码来设置,如下:

[cpp] view plaincopy print?
  • DWORD SetView(  
  •    int iView   
  • );  
  • DWORD SetView(int iView );

    以下解说均以report风格为例.


    2 设置CListCtrl风格及扩展风格

    获取及设置风格代码示例代码如下:

    [cpp] view plaincopy print?
  • LONG lStyle;  
  • lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style  
  • lStyle &= ~LVS_TYPEMASK; //清除显示方式位  
  • lStyle |= LVS_REPORT; //设置style  
  • SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style  
  • LONG lStyle; lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style lStyle &= ~LVS_TYPEMASK; //清除显示方式位 lStyle |= LVS_REPORT; //设置style SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style

    获取及设置扩展风格示例代码如下:

    [cpp] view plaincopy print?
  • DWORD 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); //设置扩展风格  
  • DWORD 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 插入数据

    插入列,示例代码如下:

    [cpp] view plaincopy print?
  • m_list_av.InsertColumn(0,"PID");  
  • m_list_av.InsertColumn(1,"name");  
  • m_list_av.InsertColumn(2,"value");  
  •   
  • CRect rect;  
  • m_list_av.GetClientRect(rect);                    //获得当前客户区信息  
  • m_list_av.SetColumnWidth(0,rect.Width()/6);       //设置列的宽度。  
  • m_list_av.SetColumnWidth(1,rect.Width()/2);  
  • m_list_av.SetColumnWidth(2,rect.Width()/3);  
  • m_list_av.InsertColumn(0,"PID"); m_list_av.InsertColumn(1,"name"); m_list_av.InsertColumn(2,"value");CRect rect; m_list_av.GetClientRect(rect); //获得当前客户区信息 m_list_av.SetColumnWidth(0,rect.Width()/6); //设置列的宽度。 m_list_av.SetColumnWidth(1,rect.Width()/2); m_list_av.SetColumnWidth(2,rect.Width()/3);

    也可用另一种方式,如:

    [cpp] view plaincopy print?
  • m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列,LVCFMT_LEFT为对齐方式,40为列宽  
  • m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );  
  • m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列,LVCFMT_LEFT为对齐方式,40为列宽 m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );

    插入行,示例代码如下:

    [cpp] view plaincopy print?
  • CString str;  
  • for(int i=0; i<m_av_count; i++){  
  •     m_list_av.InsertItem(i,m_avs[i].name);  
  •     str.Format("%04x",m_avs[i].pid);  
  •     m_list_av.SetItemText(i,0,str);  
  •     m_list_av.SetItemText(i,1,m_avs[i].name);  
  •     GetValueAsStirng(&m_avs[i],str);  
  •     m_list_av.SetItemText(i,2,str);  
  • }  
  • CString str; for(int i=0; i<m_av_count; i++){m_list_av.InsertItem(i,m_avs[i].name);str.Format("%04x",m_avs[i].pid);m_list_av.SetItemText(i,0,str);m_list_av.SetItemText(i,1,m_avs[i].name);GetValueAsStirng(&m_avs[i],str);m_list_av.SetItemText(i,2,str); }

    另一个示例如下:

    [cpp] view plaincopy print?
  • CString strText;  
  • int nColumnCount = m_myListCtrl.GetHeaderCtrl()->GetItemCount();  
  •   
  • // Insert 10 items in the list view control.  
  • for (int i = 0; i < 10; i++)  
  • {  
  •     strText.Format(TEXT("item %d"), i);  
  •   
  •     // Insert the item, select every other item.  
  •     m_myListCtrl.InsertItem(LVIF_TEXT | LVIF_STATE, i, strText,   
  •         (i % 2) == 0 ? LVIS_SELECTED : 0, LVIS_SELECTED, 0, 0);  
  •   
  •     // Initialize the text of the subitems.  
  •     for (int j = 1; j < nColumnCount; j++)  
  •     {  
  •         strText.Format(TEXT("sub-item %d %d"), i, j);  
  •         m_myListCtrl.SetItemText(i, j, strText);  
  •     }  
  • }  
  • CString strText; int nColumnCount = m_myListCtrl.GetHeaderCtrl()->GetItemCount();// Insert 10 items in the list view control. for (int i = 0; i < 10; i++) {strText.Format(TEXT("item %d"), i);// Insert the item, select every other item.m_myListCtrl.InsertItem(LVIF_TEXT | LVIF_STATE, i, strText, (i % 2) == 0 ? LVIS_SELECTED : 0, LVIS_SELECTED, 0, 0);// Initialize the text of the subitems.for (int j = 1; j < nColumnCount; j++){strText.Format(TEXT("sub-item %d %d"), i, j);m_myListCtrl.SetItemText(i, j, strText);} }

    4 一直选中一行

    在默认情况下,当选一行,再点击其它地方时,原先选中的一行会推动高亮显示,如果你想保留高亮显示,则可以在属性面板上找到属性Always Show Selection,并设置为true.

    也可用设置扩展风格的方式设置,如:

    [cpp] view plaincopy print?
  • dwStyle |= LVS_SHOWSELALWAYS;  
  • m_list.SetExtendedStyle(dwStyle); //设置扩展风格  
  • dwStyle |= LVS_SHOWSELALWAYS; m_list.SetExtendedStyle(dwStyle); //设置扩展风格


    5 选中和取消一行

    [cpp] view plaincopy print?
  • int nIndex = 0;  
  • //选中  
  • m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);  
  • //取消选中  
  • m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);  
  • int nIndex = 0; //选中 m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); //取消选中 m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);

    另一种方式,包含获取选择项和设置:

    [cpp] view plaincopy print?
  • // Set the selection mark to the first item only if no other item is   
  • // selected.  
  • if (m_myListCtrl.GetSelectionMark() == -1)  
  •     m_myListCtrl.SetSelectionMark(0);  
  • // Set the selection mark to the first item only if no other item is // selected. if (m_myListCtrl.GetSelectionMark() == -1)m_myListCtrl.SetSelectionMark(0);

    在单选时可用以上方法。

    6 获取选择项

    [cpp] view plaincopy print?
  • 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);  
  •      }  
  • }  
  • 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);} }

    另一种方法:

    [cpp] view plaincopy print?
  • 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  
  •     }  
  • }  
  • 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} }

    获取单选项的示例代码:

    [cpp] view plaincopy print?
  • POSITION pos =m_CLC_Record.GetFirstSelectedItemPosition();  
  • if (pos == NULL)  
  • {  
  •     AfxMessageBox("请先选择一项记录!");  
  •     return;  
  • }  
  • else  
  • {  
  •     int nSel =m_CLC_Record.GetNextSelectedItem(pos);  
  •     //do something  
  • }  
  • POSITION pos =m_CLC_Record.GetFirstSelectedItemPosition(); if (pos == NULL) {AfxMessageBox("请先选择一项记录!");return; } else {int nSel =m_CLC_Record.GetNextSelectedItem(pos);//do something }


     

    7 绑定数据

    [cpp] view plaincopy print?
  • // If any item's data is equal to zero then reset it to -1.  
  • for (int i=0; i < m_myListCtrl.GetItemCount(); i++)  
  • {  
  •     if (m_myListCtrl.GetItemData(i) == 0)  
  •     {  
  •         m_myListCtrl.SetItemData(i, (DWORD) -1);  
  •     }  
  • }  
  • // If any item's data is equal to zero then reset it to -1. for (int i=0; i < m_myListCtrl.GetItemCount(); i++) {if (m_myListCtrl.GetItemData(i) == 0){m_myListCtrl.SetItemData(i, (DWORD) -1);} }


    参考:http://www.cnblogs.com/cy163/archive/2006/10/15/529790.html


     8 隐藏表头

    有两种方法:

    第一种:在属性面板中找到No Column Header属性,设置为true。

    第二种:动态创建时使用LVS_NOCOLUMNHEADER。

     

    9 获取总行数

    [cpp] view plaincopy print?
  • int nCount =m_myListCtr.GetItemCount();  
  • int nCount =m_myListCtr.GetItemCount();


     10 滚屏

    [cpp] view plaincopy print?
  • //滚屏  
  • m_CLC_Record.EnsureVisible(nCount-1,false);  
  • //滚屏 m_CLC_Record.EnsureVisible(nCount-1,false);


     11 双击一行

    为CListCtrl添加NM_DBLCK事件.

    示例代码:

    [cpp] view plaincopy print?
  • void CTestDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)  
  • {  
  •     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);  
  •     // TODO: Add your control notification handler code here  
  •     NMLISTVIEW* pMListView=(NMLISTVIEW*) pNMHDR;  
  •         int nIndex = pMListView->iItem;  
  •   
  •     RecordData *pdata =(RecordData *)m_CLC_Record.GetItemData(nIndex);  
  •     m_ComboSendType.SetCurSel(pdata->SendFmt);  
  •     m_ComboSendFrmType.SetCurSel(pdata->FrameType);  
  •     m_ComboSendFrmFmt.SetCurSel(pdata->FramFmt);  
  •     m_EditSendFrmID.Format("%08x",pdata->FrameID);  
  •     m_EditSendData =m_CLC_Record.GetItemText(nIndex,4);  
  •     m_Delay =pdata->DelayTime;  
  •     UpdateData(false);  
  •     *pResult = 0;  
  • }  
  • void CTestDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult) {LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);// TODO: Add your control notification handler code hereNMLISTVIEW* pMListView=(NMLISTVIEW*) pNMHDR;int nIndex = pMListView->iItem;RecordData *pdata =(RecordData *)m_CLC_Record.GetItemData(nIndex);m_ComboSendType.SetCurSel(pdata->SendFmt);m_ComboSendFrmType.SetCurSel(pdata->FrameType);m_ComboSendFrmFmt.SetCurSel(pdata->FramFmt);m_EditSendFrmID.Format("%08x",pdata->FrameID);m_EditSendData =m_CLC_Record.GetItemText(nIndex,4);m_Delay =pdata->DelayTime;UpdateData(false);*pResult = 0; }


    12 获取Item字符串

    [cpp] view plaincopy print?
  • m_EditSendData =m_CLC_Record.GetItemText(nIndex,4);  
  • m_EditSendData =m_CLC_Record.GetItemText(nIndex,4);


     

    总结

    以上是生活随笔为你收集整理的CListCtrl的用法总结的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。