zoukankan      html  css  js  c++  java
  • CListCtrl用法总结(二)

    网站来源:http://blog.csdn.net/lhy2199/article/details/5177032

    CListCtrl类封装“列表视图控件”功能,显示每个包含图标(列表视图中)和标签的收集。除图标和标签外,每一项还能有显示在图标和标签的右边的列中的信息。此控件(以及CListCtrl类)只适用于运行于Windows 95和Windows NT 3.51及更高版本的程序。
    下面是CListCtrl类的主要概况。对于详细的、概念性的讨论,请参阅联机文档“Visual C++程序员指南”中的“使用ClistCtrl”和“控件主题”。

    视图
    列表视图控件可用四种不同方式显示其内容,称为“视图”。
    · 图标视图
    每一项以全尺寸图标(32×32像素)出现,下面有一个标签。用户可在列表视图窗口拖动项到任意位置。
    · 小图标
    视图每一项以小图标(16×16像素)出现,右边有一个标签。用户可在列表视图窗口拖动项到任意位置。
    · 列表视图
    每一项以小图标出现,下面有一个标签。项按列排列,不能拖动到列表视图窗口的任何位置。
    · 报表视图
    每一项在本行上出现,右边有排列成列的附加信息。最左边的列包含小图标和标签,下一列包含应用指定的子项。嵌入标题控件实现这些列。要了解报表视图标题控件和列的更多信息,请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:给控件添加列(报表视图)”。
    控件的当前列表视图风格指定当前视图。要了解这些风格及其用法的更多信息,请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:改变列表控件风格”。

    扩展风格
    除了标准列表风格,类CListCtrl支持一系列提供丰富功能的扩展风格。此功能的一些示例包括:
    · 逗留选择
    有效时,若光标保持在某项上一段时间,则允许自动选择该项。
    · 虚列表视图
    如果有效,允许控件支持DWORD项。通过把管理应用项数据放在最顶上而成为可能。除了项选择和焦点信息,所有项信息必须由应用管理。要了解更多信息,请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:虚列表控件”。
    · 单击或双击激活
    如果有效,允许热跟踪(项文本自动高亮显示)和高亮显示项的单击和双击激活。
    · 拖放列表命令
    如果有效,允许拖放列表视图控件中列的记录。只对报表视图有效。
    要了解使用新扩展风格的更多信息,请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:改变列表控件风格”。

    项和子项
    列表视图控件中的每一项含有一个图标、一个标签、一个当前状态和应用定义值(称为“项数据”)。一个或更多子项还可与每一项联系。一个“子项”是一个字符串,在报表视图中可显示在项图标和标签右边的列里。列表视图控件中的每一项都必须与子项数目相同。
    类CListCtrl提供一些函数来插入、删除、查找和更改这些项。要了解更多信息,请参阅“Visual C++程序员指南”中的“使用CListCtrl:列表控件中的滚动、排列、排序和查找”。同时请参阅CListCtrl::GetItem,CListCtrl::InsertItem和CListCtrl::FindItem。
    缺省时,列表视图控件负责存储一个项的图标和文本属性。然而,除了这些项类型外,类CListCtrl支持“回调项”。一个“回调项”是一个列表视图项,每个应用棗而不是控件棗存储文本,图标或两者。回调掩码用于指定哪个项的属性(文本和/或图标)由应用提供。如果应用使用回调项,它必须可以提供按需要提供文本和/或图标属性。回调项在你的应用已有部分这种信息时很有帮助。要了解更多信息,请参阅CListCtrl::GetCallBackMask和“使用CListCtrl:回调项和回调掩码”。

    图象列表
    图标、标题项图象和应用定义的列表视图项状态包含在一些图象列表中(由类CImageList实现),可创建和指派到列表视图控件中。每个列表视图控件可有四个以上的图象列表类型:
    · 大图标
    在图标视图中使用,得到全尺寸图标。
    · 小图标
    用于小图标、列表和报表视图中,得到图标视图中使用的小版本的图标。
    · 应用定义的状态
    包含状态图象,在项图标旁显示以指示一个应用定义状态。
    · 标题项
    用于在报表视图中,得到出现在每个标题控件项中的小图象。
    缺省时,列表视图控件删除指派给它的图象列表(当它删除时);然而,开发者可通过删除由应用定义的不再使用的图象列表。要了解更多信息,请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:列表项和图象列表”。
    #include <afxcmn.h>

    请参阅:CImageList


    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 为指定的项构造一个拖动图象列表

     

    1.     基本风格设置

    (1)函数: ModifyStyle( )
    (2)重要参数:    LVS_ICON // 大图标
          LVS_SMALLICON // 小图标
          LVS_LIST // 列表
          LVS_REPORT // 报表
    (3)说明:
    用的比较多的是最后的报表视图.因为它可以有多列,正好代表数据库中的多个属性.所以下面的用法都是针对这种风格的.当然这些风格也可以在控件的属性中设置
    (4) 注意
    我们知道在窗口各种各样的风格之间,有时是可以用” |”,表示属性叠加.如:
        WS_CHILD | WS_VISIBLE;
    但是上面的四种风格是不可能放在一起的.所以不要用到 “ |”操作符.
    也正是因此,防止用户出错, 微软干脆把LVS_ICON, LVS_SMALLICON, LVS_LIST, LVS_REPORT这些都不设置成位标志,因此不能叠加.同时还设置了一个多余的掩码:
    LVS_TYPEMASK.它是用来屏蔽的.

    (5) 举例:
    如果我们要判断一个CListCtrl的风格: 
       DWORD dwStyle = m_listctrl.GetStyle( );
    // 判断是否大图标样式
       If ( dwStyle & LVS_ICON )
         …….
    这种写法是错误的.正确的写法涉及到掩码:
        DWORD dwStyle = m_listctrl.GetStyle( ) & LVS_TYPEMASK;
        If ( dwStyle = = LVS_ICON)
        …….
    同理,我们在改变风格时,应该这样写:
        ModifyStyle( LVS_TYPEMASK, LVS_ICON);

    2.     扩展风格设置
    (1) 函数 : SetExtendedStyle( )   GetExtendedStyle ( )
    (2) 重要参数:
       LVS_EX_FULLROWSELECT //选中某行使整行高亮(只适用与报表风格)
       LVS_EX_GRIDLINES //网格线(只适用与报表风格)
       LVS_EX_CHECKBOXES //设置checkbox状态
    (3)举例
        DWORD dwStyle = GetExtendedStyle();
                  dwStyle |= LVS_EX_FULLROWSELECT; 
                  dwStyle |= LVS_EX_GRIDLINES;
                  SetExtendedStyle(dwStyle);

    3.其他风格设置:
    函数: SetTextColor ( ) // 设置文字颜色 
    SetBkColor ( ) // 设置边框颜色
    SetTextBkColor ( ) // 设置文字背景颜色

    //下面直接举例说明

    4.图标设置 
    可以给大图标风格和小图标风格设置图标:
    HICON icon=AfxGetApp()->LoadIcon(IDI_ICON1);
    m_icon.Add(icon);
    m_listctrl.SetImageList(&m_icon,LVSIL_SMALL);//小图标
    m_listctrl.SetImageList(&m_icon,LVSIL_NORMAL)// 大图标

    5插入一列
    m_listctrl.InsertColumn(0,”哈哈”,LVCFMT_LEFT,80);
    其中: 0是索引项,”哈哈”是列标题,LVCFMT_LEFT是显示方式(靠左),80表示列的宽


    6插入一行
    m_listctrl.InsertItem(0, “123”,0);// 插入为第一行第一列的内容,最后一个0是图标的索引
    m_listctrl.SetItemText( 0,1, “123”) ; // 设置第一行第2列的内容
    m_ listctrl.SetItemText(0,2, “123”) ; // 设置第一行第3列的内容

    7得到所有的行数
    m_listctrl.GetItemCount( ) ;

    8.得到所有的列数
    m_listctrl.GetHeaderCtrl().GetItemCount( ) ;

    9.得到被单击的项的行列号
    void Cmylist::OnClick(NMHDR* pNMHDR, LRESULT* pResult) //单击消息
    {

    NM_LISTVIEW *info=(NM_LISTVIEW*)pNMHDR;
       selectedIndex=info->iItem; // 行号
    selectedsub=info->iSubItem; // 列号
    }     
    (Cmylist为CListCtrl的派生类,以selectedIndex和selectedsub为接口,方便使用)        

    10.得到被单击的列头索引号
    void Cmylist::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
            selectedField=pNMListView->iSubItem;//列头号
    }
    同上,也是以selectedField为接口,方便用户调用

    11.选中或者取消一行
    plistctrl->SetItemState(index,LVIS_SELECTED,LVIS_SELECTED);//选中一行
    plistctrl->SetItemState(index,0,LVIS_SELECTED);//取消一行
    DWORD style=plistctrl->GetItemState(index,LVIS_SELECTED);//获得选中信息

    12.获得被选中的多行
       POSITION p=m_listctrl.GetFirstSelectedItemPosition();// 得到第一次选中的位置
       while(p)
       {
        int index=m_listctrl.GetNextSelectedItem(p);
        …
       }

    13.删除一行或者一列
    m_listctrl.DeleteItem( index );
    m_listctrl.DeleteColumn(index);

    14.删除多行或者多列
    注意要从后面开始删起,比如,如果我想删除第一行和第二行,应该:
       m_listctrl.DeleteItem(1);
       m_listctrl.DeleteItem(0);
    而不能:
       m_listctrl.DeleteItem(0);
    m_listctrl.DeleteItem(1);
    因为每次删除一行或者一列,后面的索引号都要变化,所以从后面开始删除就没关系. 
    如果用for循环,应该递减:
    For(int k=m_listctrl.GetItemCount( )-1;k>=0;k--)
       m_listctrl.DeleteItem(k);
    这就是删除所有行,当然也可以用CListCtrl::DeleteAllItems


    15 根据索引号得到某一列的信息
        HDITEM   hdi;   
        TCHAR     lpBuffer[256];     
        hdi.mask   =   HDI_TEXT;   
        hdi.pszText   =   lpBuffer;   
        hdi.cchTextMax   =   256;   
        plistctrl->GetHeaderCtrl()->GetItem(index,   &hdi);
        CString str=hdi.pszText;

     

    13. 得到单击的listctrl的行列号

          添加listctrl控件的NM_CLICK消息相应函数
          void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
          {
               // 方法一:
               /*
               DWORD dwPos = GetMessagePos();
               CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
       
               m_list.ScreenToClient(&point);
       
               LVHITTESTINFO lvinfo;
               lvinfo.pt = point;
               lvinfo.flags = LVHT_ABOVE;
         
               int nItem = m_list.SubItemHitTest(&lvinfo);
               if(nItem != -1)
               {
                    CString strtemp;
                    strtemp.Format("单击的是第%d行第%d列", lvinfo.iItem, lvinfo.iSubItem);
                    AfxMessageBox(strtemp);
               }
              */
       
              // 方法二:
              /*
               NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
               if(pNMListView->iItem != -1)
               {
                    CString strtemp;
                    strtemp.Format("单击的是第%d行第%d列",
                                    pNMListView->iItem, pNMListView->iSubItem);
                    AfxMessageBox(strtemp);
               }
              */
               *pResult = 0;
          }

     


    14. 判断是否点击在listctrl的checkbox上

          添加listctrl控件的NM_CLICK消息相应函数
          void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
          {
               DWORD dwPos = GetMessagePos();
               CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
       
               m_list.ScreenToClient(&point);
       
               LVHITTESTINFO lvinfo;
               lvinfo.pt = point;
               lvinfo.flags = LVHT_ABOVE;
         
               UINT nFlag;
               int nItem = m_list.HitTest(point, &nFlag);
               //判断是否点在checkbox上
               if(nFlag == LVHT_ONITEMSTATEICON)
               {
                    AfxMessageBox("点在listctrl的checkbox上");
               } 
               *pResult = 0;
          }

     


    15. 右键点击listctrl的item弹出菜单

          添加listctrl控件的NM_RCLICK消息相应函数
          void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
          {
               NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
               if(pNMListView->iItem != -1)
               {
                    DWORD dwPos = GetMessagePos();
                    CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
        
                    CMenu menu;
                    VERIFY( menu.LoadMenu( IDR_MENU1 ) );
                    CMenu* popup = menu.GetSubMenu(0);
                    ASSERT( popup != NULL );
                    popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );
               } 
               *pResult = 0;
    }

     

     


    16. item切换焦点时(包括用键盘和鼠标切换item时),状态的一些变化顺序

          添加listctrl控件的LVN_ITEMCHANGED消息相应函数
          void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)
          {
               NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
               // TODO: Add your control notification handler code here
        
               CString sTemp;

               if((pNMListView->uOldState & LVIS_FOCUSED) == LVIS_FOCUSED && 
                (pNMListView->uNewState & LVIS_FOCUSED) == 0)
               {
                    sTemp.Format("%d losted focus",pNMListView->iItem);
               }
               else if((pNMListView->uOldState & LVIS_FOCUSED) == 0 &&
                   (pNMListView->uNewState & LVIS_FOCUSED) == LVIS_FOCUSED)
               {
                    sTemp.Format("%d got focus",pNMListView->iItem);
               } 

               if((pNMListView->uOldState & LVIS_SELECTED) == LVIS_SELECTED &&
                (pNMListView->uNewState & LVIS_SELECTED) == 0)
               {
                    sTemp.Format("%d losted selected",pNMListView->iItem);
               }
               else if((pNMListView->uOldState & LVIS_SELECTED) == 0 &&
                (pNMListView->uNewState & LVIS_SELECTED) == LVIS_SELECTED)
               {
                    sTemp.Format("%d got selected",pNMListView->iItem);
               }
        
               *pResult = 0;
          }



     


    17. 得到另一个进程里的listctrl控件的item内容

    http://www.codeproject.com/threads/int64_memsteal.asp



    18. 选中listview中的item

    Q131284: How To Select a Listview Item Programmatically
    http://support.microsoft.com/kb/131284/en-us



    19. 如何在CListView中使用CListCtrl的派生类

    http://www.codeguru.com/cpp/controls/listview/introduction/article.php/c919/



    20. listctrl的subitem添加图标

          m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);
          m_list.SetItem(..); //具体参数请参考msdn

     


    21. 在CListCtrl显示文件,并根据文件类型来显示图标

          网上找到的代码,share
          BOOL CTest6Dlg::OnInitDialog()
          {
               CDialog::OnInitDialog();
       
               HIMAGELIST himlSmall;
               HIMAGELIST himlLarge;
               SHFILEINFO sfi;
               char cSysDir[MAX_PATH];
               CString strBuf;

               memset(cSysDir, 0, MAX_PATH);
       
               GetWindowsDirectory(cSysDir, MAX_PATH);
               strBuf = cSysDir;
               sprintf(cSysDir, "%s", strBuf.Left(strBuf.Find("//")+1));

               himlSmall = (HIMAGELIST)SHGetFileInfo ((LPCSTR)cSysDir, 
                          0, 
                          &sfi, 
                          sizeof(SHFILEINFO), 
                          SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
       
               himlLarge = (HIMAGELIST)SHGetFileInfo((LPCSTR)cSysDir, 
                          0, 
                          &sfi, 
                          sizeof(SHFILEINFO), 
                          SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
       
               if (himlSmall && himlLarge)
               {
                    ::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,
                                 (WPARAM)LVSIL_SMALL, (LPARAM)himlSmall);
                    ::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,
                                 (WPARAM)LVSIL_NORMAL, (LPARAM)himlLarge);
               }
               return TRUE; // return TRUE unless you set the focus to a control
          }

          void CTest6Dlg::AddFiles(LPCTSTR lpszFileName, BOOL bAddToDocument)
          {
               int nIcon = GetIconIndex(lpszFileName, FALSE, FALSE);
               CString strSize;
               CFileFind filefind;

               // get file size
               if (filefind.FindFile(lpszFileName))
               {
                    filefind.FindNextFile();
                    strSize.Format("%d", filefind.GetLength());
               }
               else
                    strSize = "0";
       
               // split path and filename
               CString strFileName = lpszFileName;
               CString strPath;

               int nPos = strFileName.ReverseFind('//');
               if (nPos != -1)
               {
                    strPath = strFileName.Left(nPos);
                    strFileName = strFileName.Mid(nPos + 1);
               }
       
               // insert to list
               int nItem = m_list.GetItemCount();
               m_list.InsertItem(nItem, strFileName, nIcon);
               m_list.SetItemText(nItem, 1, strSize);
               m_list.SetItemText(nItem, 2, strFileName.Right(3));
               m_list.SetItemText(nItem, 3, strPath);
          }

          int CTest6Dlg::GetIconIndex(LPCTSTR lpszPath, BOOL bIsDir, BOOL bSelected)
          {
               SHFILEINFO sfi;
               memset(&sfi, 0, sizeof(sfi));
       
               if (bIsDir)
               {
                SHGetFileInfo(lpszPath, 
                             FILE_ATTRIBUTE_DIRECTORY, 
                             &sfi, 
                             sizeof(sfi), 
                             SHGFI_SMALLICON | SHGFI_SYSICONINDEX |
                             SHGFI_USEFILEATTRIBUTES |(bSelected ? SHGFI_OPENICON : 0)); 
                return sfi.iIcon;
               }
               else
               {
                SHGetFileInfo (lpszPath, 
                             FILE_ATTRIBUTE_NORMAL, 
                             &sfi, 
                             sizeof(sfi), 
                             SHGFI_SMALLICON | SHGFI_SYSICONINDEX | 
                             SHGFI_USEFILEATTRIBUTES | (bSelected ? SHGFI_OPENICON : 0));
                return   sfi.iIcon;
               }
               return -1;
          }

  • 相关阅读:
    sikiA计划问题记录
    列表+泛型
    查看别人项目找代码的方法
    Unity3d 异常与解决方案集合(持续)
    实现继承+接口继承+虚方法+隐藏方法+this/base+抽象类+密封类/方法+修饰符
    定义类+类实例化+属性+构造函数+匿名类型var+堆与栈+GC回收机制+值类型与引用类型
    局部变量和成员变量的区别
    数组元素二分查找(折半查找)
    数组元素冒泡排序
    数组元素选择排序
  • 原文地址:https://www.cnblogs.com/lovelyx/p/4867139.html
Copyright © 2011-2022 走看看