• CListCtrl控件使用指南(大全)


    -------------------------------------------------------------------------------------------------------------------------------------------
    本文主要介绍的是MFC中一个重要的控件CListCtrl,其使用范围广,很多软件中都能看到CListCtrl的身影。当然,一些基本的概念和操作MSDN有相关说明,这里汇总并整理了网上一些比较实用的实际操作,每一个都有对应简单案例。

    CListCtrl有四种样式:Icon;Smal lcon;List;Report。前三种一般使用很少,最后一种Report是CListCtrl的重点,也是其精髓。

    -------------------------------------------------------------------------------------------------------------------------------------------

    一、CListCtrl外观风格
    只能选下面四种的一种:

    LVS_ICON: 为每个item显示大图标;
    LVS_SMALLICON: 为每个item显示小图标;
    LVS_LIST: 显示一列带有小图标的item;
    LVS_REPORT: 显示item详细资料。
    直观的理解:windows资源管理器,【查看】标签下的“大图标,小图标,列表,详细信息”

    先来说一下前三种使用方法:

    前三种Icon,Small Icon,List都是通过图标的形式存在,那么他的重点也就是怎么加载图标。

    首先需要创建CImageList对象,例如m_ImageList1

    //创建大图标,Craete创建一个图标列表,当然大小可以随意设置,这里采用的是加载ICON
    if ( m_ImageList1.GetSafeHandle() == NULL )
    {
        m_ImageList1.Create(80,80,ILC_MASK|ILC_COLOR32, 0, 0);
        m_ImageList1.Add(AfxGetApp()->LoadIcon(IDR_MAINFRAME));
        m_ListCtrl1.SetImageList(&m_ImageList1, LVSIL_NORMAL);
    }
    //加载BMP图片
    if (m_StatusImage.GetSafeHandle()==NULL)
    {
         CBitmap Image;
         BITMAP ImageInfo;
         Image.LoadBitmap(IDB_SERVER_LIST_IMAGE);
         Image.GetBitmap(&ImageInfo);
         m_StatusImage.Create(18,ImageInfo.bmHeight,ILC_COLOR16|ILC_MASK,0,0);
         m_StatusImage.Add(&Image,RGB(255,0,255));
    }
    m_ListCtrl2.SetImageList(&m_StatusImage,LVSIL_SMALL);
    m_ListCtrl3.SetImageList(&m_StatusImage,LVSIL_SMALL);
    //插入节点
    for (int i=0;i<40;i++)
    {
        m_ListCtrl1.InsertItem(i, TEXT("Item"));
        m_ListCtrl2.InsertItem(i, TEXT("Item"));
        m_ListCtrl3.InsertItem(i, TEXT("Item"));
    }
    

      


    二、下面大篇幅主要介绍Report风格

    1、创建列
    也就是为标头控件添加节点,用InsertColumn()函数。

    ①参数1:新列的索引。 ②参数2:列标题的显示文本。③列的对齐方式;它的值可以是下面三个之一:LVCFMT_LEFT、 LVCFMT_RIGHT或 LVCFMT_CENTER。④参数4:列的宽度,以像素为单位。

    //插入三个列
    m_ListCtrl4.InsertColumn( 0, TEXT("姓名"), LVCFMT_LEFT, 70 );
    m_ListCtrl4.InsertColumn( 1, TEXT("年龄"), LVCFMT_LEFT, 70 );
    m_ListCtrl4.InsertColumn( 2, TEXT("学号"), LVCFMT_LEFT, 70 );
    

      

    2、设置列表风格
    之前我们修改窗口属性的时候都是使用的SetWindowLong函数或者ModifyStyle,这次CListCtrl为我们提供一个新函数,SetExtendedStyle,当然通过它只能修改列表的扩展属性。
    支持的扩展属性很多,但是常用的就几个而已,其他的可以参照msdn,这里讲解两个常用的样式
    LVS_EX_CHECKBOXES:将CListCtrl添加复选框check控件

    LVS_EX_FULLROWSELECT:未添加该样式,选择一个节点,默认只能选中节点的第一个元素,而这个属性则可以让选择节点的时候选中整行。
    当然这些属性可以通过或运算而多个同时存在。

        LONG lStyle;
        lStyle = GetWindowLong(m_ListCtrl4.m_hWnd, GWL_STYLE);//获取当前窗口style
        lStyle &= ~LVS_TYPEMASK; //清除显示方式位
        lStyle |= LVS_REPORT; //设置style
        SetWindowLong(m_ListCtrl4.m_hWnd, GWL_STYLE, lStyle);//设置style
     
        DWORD dwStyle = m_ListCtrl4.GetExtendedStyle();
        dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
        dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
        dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
        m_ListCtrl4.SetExtendedStyle(dwStyle); //设置扩展风格
    

      

    样式风格大全:

    LVS_ALIGNLEFT : 用来确定表项的大小图标以左对齐方式显示;
    LVS_ALIGNTOP : 用来确定表项的大小图标以顶对齐方式显示;
    LVS_AUTOARRANGE : 用来确定表项的大小图标以自动排列方式显示;
    LVS_EDITLABELS : 设置表项文本可以编辑,父窗口必须设有LVN_ENDLABELEDIT风格;
    LVS_ICON : 用来确定大图标的显示方式;
    LVS_LIST : 用来确定列表方式显示;
    LVS_NOCOLUMNHEADER : 用来确定在详细资料方式时不显示列表头;
    LVS_NOLABELWRAP : 用来确定以单行方式显示图标的文本项;
    LVS_NOSCROLL : 用来屏蔽滚动条;
    LVS_NOSORTHEADER : 用来确定列表头不能用作按钮功能;
    LVS_OWNERDRAWFIXED : 在详细列表方式时允许自绘窗口;
    LVS_REPORT : 用来确定以详细资料即报告方式显示;
    LVS_SHAREIMAGELISTS : 用来确定共享图像列表方式;
    LVS_SHOWSELALWAYS : 用来确定一直显示被选中表项方式;
    LVS_SINGLESEL : 用来确定在某一时刻只能有一项被选中;
    LVS_SMALLICON : 用来确定小图标显示方式;
    LVS_SORTASCENDING : 用来确定表项排序时是基于表项文本的升序方式;
    LVS_SORTDESCENDING : 用来确定表项排序时是基于表项文本的降序方式;


    扩展风格大全:

    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_REGIONAL
    LVS_EX_INFOTIP
    LVS_EX_UNDERLINEHOT
    LVS_EX_UNDERLINECOLD
    LVS_EX_MULTIWORKAREAS : 多工作区


    3、添加列表图标
      首先你需要设置列表控件所使用的ImageList,如果你使用大图标显示风格,你就需要以如下形式调用:

    CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL); 
    

      如果使用其它三种风格显示而不想显示图标你可以不进行任何设置,否则需要以如下形式调用:

    CImageList* SetImageList( CImageList* pImageList, LVSIL_SMALL);
    

      Report的图标的添加方式和Icon一样,这里我们以添加bmp图片为例:

    //加载BMP图标
    if (m_StatusImage.GetSafeHandle()==NULL)
    {
        CBitmap Image;
        BITMAP ImageInfo;
        Image.LoadBitmap(IDB_SERVER_LIST_IMAGE);
        Image.GetBitmap(&ImageInfo);
        m_StatusImage.Create(18,ImageInfo.bmHeight,ILC_COLOR16|ILC_MASK,0,0);
        m_StatusImage.Add(&Image,RGB(255,0,255));
    }
    m_ListCtrl4.SetImageList(&m_StatusImage,LVSIL_SMALL);
    

    4、插入节点并设置节点的文本内容

    int nCount = m_ListCtrl4.GetItemCount();
    //插入行
    int nRow=m_ListCtrl4.InsertItem(LVIF_IMAGE|LVIF_TEXT|LVIF_PARAM,0,_T("Item_1"),0,0,2,0);
    m_ListCtrl4.SetItemText(nRow, 1, TEXT("Item_2"));//设置文本内容
    m_ListCtrl4.SetItemText(nRow, 2, TEXT("Item_3"));
    

    5、设置文本或背景颜色

    ①、设置显示文本的颜色:

    BOOL SetTextColor( RGB(0,255,0) );//例如设置文本为绿色
    

    ②、获取显示文本的颜色:

    COLORREF GetTextColor( );
    

    ③、设置背景颜:

    BOOL SetTextBkColor( RGB(255,0,0));//例如设置背景为红色
    

    ④、获取背景颜色:

    COLORREF GetTextBkColor( );
    

    ⑤、设置背景位图:

    BOOL SetBkImage(HBITMAP hbm, BOOL fTile , int xOffsetPercent, int yOffsetPercent);
    

      

    6、总是显示选定内容
    总是显示选定内容,即便控件没有焦点。

    方法一:将控件的Always Show selection 属性设为TRUE;

    方法二:在设置列表风格时,添加宏LVS_SHOWSELALWAYS 。


    7、选中和取消选中一行
    用SetItemState()函数。①参数1:被设置项的索引;②参数2:状态位的新值;③参数3:指定的状态位掩码更改。

    int nIndex = 0;
    //选中
    m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
    //取消选中
    m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);
    

    8、判断节点是否被Check选中

    用GetCheck()函数

    void CListCtrlDlg::OnBnClickCheckState()
    {
        CString str,str1=TEXT("被Check的行数分别为:");
         
        for(int i=0; i<m_ListCtrl4.GetItemCount(); i++)
        {
            if( m_ListCtrl4.GetCheck(i))
            {
                str.Format(TEXT("第%d行的checkbox为选中状态"),i);
                str1+=str;
            }
        }
         
        AfxMessageBox(str1);
    }
    

    9、判断节点是否被高亮选中

    通过该项的选中状态(LVIS_SELECTED)来判断

    m_ListCtrl4.SetExtendedStyle(LVS_EX_CHECKBOXES);
    CString str;
    for(int i=0; i<m_ListCtrl4.GetItemCount(); i++)
    {
         if( m_ListCtrl4.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
         {
              str.Format(_T("第%d行为高亮选中状态"), i);
              AfxMessageBox(str);
         }
    }
    

    注意:这里跟上面的check选中有所不同,通过下图来说明:①处为Check选中;②处为高亮选中。

    10、获取选中行的索引
    默认情况下CListCtrl是支持多选的,即支持键盘上的“Ctrl”和“Shift”按键的操作,若要需要单选(即每次只能选取列表的一项),可将控件的Single Selection属性设为TRUE,或者添加LVS_SINGLESEL属性样式。

    这里介绍两种方法来获取选中行的索引:

    方法一:通过遍历所有行,然后挨行判断当前的选取状态。

    CString str,str1=TEXT("选中的行数分别为:");
    for(int i=0; i<m_ListCtrl4.GetItemCount(); i++)
    {
        if( m_ListCtrl4.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
        {
            str.Format(TEXT("第%d行为高亮选中状态!"),i);
            str1+=str;
        }
    }
    AfxMessageBox(str1);
    m_ListCtrl4.SetFocus();
    

    方法二:通过迭代的方式进行遍历

    POSITION pos = m_ListCtrl4.GetFirstSelectedItemPosition();
    if (pos == NULL)
    {
        str1 = TEXT("没有高亮选中任何节点");
    }
    else
    {
        while (pos)
        {
            int nItem = m_ListCtrl4.GetNextSelectedItem(pos);
                 
            str.Format(TEXTT("列表中第%d行被高亮选中!"),nItem);
            str1+=str;
        }
    }
         
    AfxMessageBox(str1);
    m_ListCtrl4.SetFocus();
    

     

    11、获取列数

    这里使用到了CHeaderCtrl控件

    int nColumnCount = m_ListCtrl4.GetHeaderCtrl()->GetItemCount();
    

    12、获取节点信息

    通过GetItem()函数,我们以获取最后一行的信息为例:

    void CListCtrlDlg::OnBnClickInfo()
    {
        TCHAR szBuffer[MAX_PATH]=TEXT("");//存放文本结果的缓存
        CString str=TEXT("节点信息分别为:");
         
        //获取列数
        int nColumnCount = m_ListCtrl4.GetHeaderCtrl()->GetItemCount();
         
        LVITEM lvi;//结构体,表示一行
        lvi.iItem = m_ListCtrl4.GetItemCount()-1;
        lvi.mask = LVIF_TEXT;
        lvi.cchTextMax = CountArray(szBuffer);
         
        for (int i=0;i<nColumnCount; i++)
        {
            lvi.iSubItem = i;
            lvi.pszText = szBuffer;
            m_ListCtrl4.GetItem(&lvi);
         
            str+=TEXT("[");
            str+=szBuffer;
            str+=TEXT("] ");
        }
         
        AfxMessageBox(str);
    }
    

      注意:mask指明你要获取那些信息,例如LVIF_TEXT:文本信息;LVIF_IMAGE:图像信息;LVIF_STATE:状态信息。

    13、滚动到要显示的行上

    很多时候,我们的数据量比较大,而我们通过查找获取到了行数后,我们想快速定位到该行,这里我们可以用EnsureVisible()函数。这样可以使列表的某一指定行可见。

    这里以定位到最后一行并选中该行为例:

    void CListCtrlDlg::OnBnClickVis()
    {
       int nItem = m_ListCtrl4.GetItemCount()-1;
       m_ListCtrl4.EnsureVisible(nItem, FALSE);//滚动滚动条,使列表的第i行可见
         
       m_ListCtrl4.SetItemState(nItem,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED);
       m_ListCtrl4.SetSelectionMark(nItem);
       m_ListCtrl4.SetFocus();
    }
    

      14、选中行

    注意:这句代码只是让指定行高亮显示,如果使用后再用GetSelectionMark函数来得到选中行,结果往往是错误的。比如,先用鼠标点击选中第5行,调用GetSelectionMark函数得到的是4(即第5行,下标从0开始),再调用SetItemState函数选中第2行,然后调用GetSelectionMark函数得到的还是4,所以,需要在设置选中行高亮显示时,一般与SetSelectionMark函数连用。

    m_ListCtrl4.SetItemState(nItem,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED);
    m_ListCtrl4.SetSelectionMark(nItem);
    m_ListCtrl4.SetFocus();
    

      

    15、取消选中

    void CListCtrlDlg::OnBnClickUnSel()
    {
        for(int i=0; i<m_ListCtrl4.GetItemCount(); i++)
        {
            if( m_ListCtrl4.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
            {//通过改变选中状态来实现
                m_ListCtrl4.SetItemState(i,0,LVIS_SELECTED);
            }
        }
         
        m_ListCtrl4.SetSelectionMark(-1);
        m_ListCtrl4.SetFocus();
    }
    

      

    16、获取标头控件的节点文本

     

    即列的Header字符串的内容

    void CListCtrlDlg::OnBnClickHead()
    {
        LVCOLUMN lvcol;
        TCHAR  szBuffer[MAX_PATH]=TEXT("");
         
        int nColumnIndex;;
         
        CString str=TEXT("标题头文本分别为:");
         
        nColumnIndex = 0;
        lvcol.mask = LVCF_TEXT;
        lvcol.pszText = szBuffer;
        lvcol.cchTextMax = CountArray(szBuffer);
         
        while(m_ListCtrl4.GetColumn(nColumnIndex, &lvcol))
        {
            str+=TEXT("[");
            str+= lvcol.pszText;
            str+=TEXT("]");
         
            nColumnIndex++;
        }
         
        AfxMessageBox(str);
    }
    

      

    17、删除指定行

     

    以删除最后一行为例:

    m_ListCtrl4.DeleteItem(m_ListCtrl4.GetItemCount()-1);//参数为指定行的索引
    

      

    18、删除所有行

    m_ListCtrl4.DeleteAllItems();
    

      

    19、删除所有标头(列)

     

    包括标头控件。

    方法一:当删除下标为0的节点后,后面的节点都会依次向前移动,重新排列,所以我们只要依次把所有第一个节点删除即可。

    while( m_ListCtrl4.DeleteColumn(0) );
    

    方法二:和方法一原理类似,这次是从后往前删除

    int nColumnCount = m_ListCtrl4.GetHeaderCtrl()->GetItemCount();
    for (int i=nColumnCount-1; i>=0; i--)
        m_ListCtrl4.DeleteColumn (i);
    

      20、左键消息,得到单击处的行列号

             列表控件的消息映射同样使用ON_NOTIFY宏,形式如同:ON_NOTIFY( wNotifyCode, id, memberFxn ),wNotifyCode为通知代码,id为产生该消息的窗口ID,memberFxn为处理函数,函数的原型如同void OnXXXList(NMHDR* pNMHDR, LRESULT* pResult),其中pNMHDR为一数据结构,在具体使用时需要转换成其他类型的结构。

    添加ON_NOTIFY的NM_CLICK消息,这里以单击事件的区域位置为例,即鼠标在哪行那列点击了。

    方法一:

    void CListCtrlDlg::OnLclickList4(NMHDR *pNMHDR, LRESULT *pResult)
    {
        LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
             
        //方法一:
        DWORD dwPos = GetMessagePos();
        CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
         
        m_ListCtrl4.ScreenToClient(&point);
         
        LVHITTESTINFO lvinfo;
        lvinfo.pt = point;
        lvinfo.flags = LVHT_ABOVE;
        int nItem = m_ListCtrl4.SubItemHitTest(&lvinfo);
         
        if(nItem != -1)
        {
            CString str;
            str.Format(TEXT("单击的是第%d行第%d列"), lvinfo.iItem, lvinfo.iSubItem);
            AfxMessageBox(str);
        }
         
        *pResult = 0;
    }
    

    方法二:

    void CListCtrlDlg::OnLclickList4(NMHDR *pNMHDR, LRESULT *pResult)
    {
        LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
         
        // 方法二:
        NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
        if(pNMListView->iItem != -1)
        {
            CString str;
            str.Format(TEXT("单击的是第%d行第%d列"),pNMListView->iItem, pNMListView->iSubItem);
            AfxMessageBox(str);
        }
         
        *pResult = 0;
    }
    

      

    21、右键消息

     

    添加ON_NOTIFY的NM_RCLICK消息,这里以右键弹出菜单为例:

    void CListCtrlDlg::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;
            if (menu.CreatePopupMenu()==FALSE) return;
            menu.AppendMenu(0,2000,TEXT("菜单节点"));
            menu.AppendMenu(0,2001,TEXT("菜单节点"));
            menu.AppendMenu(0,2002,TEXT("菜单节点"));
         
            menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,this);
        }
        *pResult = 0;
    }
    

      

    22、判断是否点击在控件的CheckBox上

    添加CListCtrl控件的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;
    }
    

      

    23、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;
    }
    

      

    24、列表内容进行大数据量更新时,避免闪烁

    	m_list.SetRedraw(FALSE);
    	//更新内容
    	m_list.SetRedraw(TRUE);
    	m_list.Invalidate();
    	m_list.UpdateWindow();
    

      

    25、CListCtrl的排序

    步骤一:排序用的比较函数

    static int CALLBACK MyCompareProc(LPARAMlParam1, LPARAMlParam2, LPARAMlParamSort)
    {
         CString &lp1 = *((CString *)lParam1);
         CString &lp2 = *((CString *)lParam2);
         int &sort = *(int *)lParamSort;
         if (sort == 0)
         {
             returnlp1.CompareNoCase(lp2);
         }
         else
         {
             returnlp2.CompareNoCase(lp1);
         }
    }
    

      步骤二:要处理的事件

    ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, &CDlg::OnLvnColumnclickList1)
    

      步骤三:排序处理代码

    voidCDlg::OnLvnColumnclickList1(NMHDR *pNMHDR, LRESULT *pResult)
    {
         LPNMLISTVIEWpNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
         intLength = m_ListCtrl.GetItemCount();
         CArray<CString,CString> ItemData;
         ItemData.SetSize(Length);
         for (inti = 0; i < Length; i++)
         {
             ItemData[i] = m_ListCtrl.GetItemText(i,pNMLV->iSubItem);
             m_ListCtrl.SetItemData(i,(DWORD_PTR)&ItemData[i]);//设置排序关键字
        }
         staticintsort = 0;
         staticintSubItem = 0;
         if (SubItem != pNMLV->iSubItem)
         {
             sort = 0;
             SubItem = pNMLV->iSubItem;
         }
         else
         {
             if (sort == 0)
             {
                  sort = 1;
             }
             else
             {
                  sort = 0;
             }
         }
         m_ListCtrl.SortItems(MyCompareProc,(DWORD_PTR)&sort);//排序
         *pResult = 0;
    }
    

      

    26、在CListCtrl显示文件,并根据文件类型来显示图标

    网上找的一段代码,供大家参考:

    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;
    }
    

      

    12、获取节点信息

    通过GetItem()函数,我们以获取最后一行的信息为例:

  • 相关阅读:
    疫情环境下的网络学习笔记 python 5.8 数据库入门终章
    疫情环境下的网络学习笔记 python 5.7 navicat数据库,例题,sql注入
    疫情环境下的网络学习笔记 python 5.6 暂时看看
    疫情环境下的网络学习笔记 python 5.5 MYSql 表关系,外键
    疫情环境下的网络学习笔记 python 5.4 数据库基础
    疫情环境下的网络学习笔记 python 4.30 初识数据库
    疫情环境下的网络学习笔记 python 4.29 网络小项目
    XJOI 夏令营501-511测试11 游戏
    XJOI 夏令营501-511测试11 统计方案
    CF1197D Yet Another Subarray Problem
  • 原文地址:https://www.cnblogs.com/WinkJie/p/16247600.html
Copyright © 2020-2023  润新知