CListCtrl控件使用

来源:互联网 发布:设置数据选择 编辑:程序博客网 时间:2024/06/05 22:59
  1. 1
    ClistCtrl有四种样式,ICON,small icon,list,report,其中前三种一般使用的都很少,report是ClistCtrl的重点也是他的精髓,当然这四种样式的样式图例,大家可以参照windows的资源管理器,大图标,小图标,列表和详细信息。现在先说一下前三种的使用方法。

  2. 2

    前三种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的操作方法,当然下面的操作也适用于图标样式,关于ClistCtrl的成员函数讲解,参照MSDN,这里只说明使用方法

    END

Report风格的CListCtrl的使用

  1. 1

    创建列,也就是为标头控件添加节点

    m_ListCtrl4.InsertColumn( 0, TEXT("Main_1"), LVCFMT_LEFT, 70 );

    m_ListCtrl4.InsertColumn( 1, TEXT("Main_2"), LVCFMT_LEFT, 70 );

    m_ListCtrl4.InsertColumn( 2, TEXT("Main_3"), LVCFMT_LEFT, 70 );

  2. 2

    设置风格

    之前我们修改窗口属性的时候都是使用的SetWindowLong函数或者ModifyStyle,这次CListCtrl为我们提供一个新函数,SetExtendedStyle,当然通过它只能修改扩展属性

    支持的扩展属性很多,但是常用的就几个而已,其他的可以参照msdn,这里讲解两个常用的样式

    LVS_EX_CHECKBOXES:将CListCtrl添加check控件LVS_EX_FULLROWSELECT:未添加该样式,选择一个节点,只能选中节点的第一个元素,而这个属性则可以让选择节点的时候选中整行

    当然这些属性可以多个同时存在

    m_ListCtrl4.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT );

  3. 3

    添加图标,图标的添加方式和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. 4

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

    void CListCtrlDlg::OnBnClickInsert()

    {

        int nCount = m_ListCtrl4.GetItemCount();

        int nRow = m_ListCtrl4.InsertItem(LVIF_IMAGE|LVIF_TEXT|LVIF_PARAM,0,TEXT("Item_1"),0,0,2,0);

        m_ListCtrl4.SetItemText(nRow, 1, TEXT("Item_2"));

        m_ListCtrl4.SetItemText(nRow, 2, TEXT("Item_3"));

    }

  5. 5

    判断节点是否被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]"),i);

                str1+=str;

            }

        }

         

        AfxMessageBox(str1);

    }

  6. 6

    获取选中行的索引,默认情况下,CListCtrl是支持多选的,支持Ctrl和Shift操作,如果需要单选,可以将控件的Single Selection设为true或者添加LVS_SINGLESEL属性,这里介绍两种方法:

    方法1:我们通过遍历所有行,然后挨行判断当前的状态即可

    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();

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

    POSITION pos = m_ListCtrl4.GetFirstSelectedItemPosition();

    if (pos == NULL)

    {

        str1 = TEXT("没有选中任何节点");

    }

    else

    {

        while (pos)

        {

            int nItem = m_ListCtrl4.GetNextSelectedItem(pos);

                 

            str.Format(TEXT("[%d]"),nItem);

            str1+=str;

        }

    }

         

    AfxMessageBox(str1);

    m_ListCtrl4.SetFocus();

  7. 7

    获取列数,这里我们就使用了CHeaderCtrl控件

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

  8. 8

    获取节点的信息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);

    }

  9. 9

    滚动到要显示的行上,很多时候,我们的数据比较大,而我们通过查找获取获取到了行数后,我们想快速定位的该行,这里我们就可以用EnsureVisible,这里举例定位到最后一行,并且选中该行

    void CListCtrlDlg::OnBnClickVis()

    {

        int nItem = m_ListCtrl4.GetItemCount()-1;

        m_ListCtrl4.EnsureVisible(nItem, FALSE);

         

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

        m_ListCtrl4.SetSelectionMark(nItem);

        m_ListCtrl4.SetFocus();

    }

  10. 10

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

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

    m_ListCtrl4.SetSelectionMark(nItem);

    m_ListCtrl4.SetFocus();

  11. 11

    取消选中

    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();

    }

  12. 12

    获取标头控件的节点文本

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

    }

  13. 13

    删除所有行

    m_ListCtrl4.DeleteAllItems();

  14. 14

    删除指定行,举例删除最后一行

    m_ListCtrl4.DeleteItem(m_ListCtrl4.GetItemCount()-1);

  15. 15

    删除所有,包括标头控件,这里还是用两种方法去做

    方法1:当删除了节点0之后,下面的节点都会往上移动,重新排列,所以我们只要依次把所有的第一个节点都删除即可

    while( m_ListCtrl4.DeleteColumn(0) );

    方法2:这里和第一种方法原理类似,这次是从后往前删除

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

    for (int i=nColumnCount-1; i>=0; i--)

        m_ListCtrl4.DeleteColumn (i);

  16. 16

    左键消息,添加ON_NOTIFY的NM_CLICK消息,这里我们举例单击事件的区域位置,即鼠标在哪行哪列点击了,仍然举两种方法

    方法1:

    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;

    }

    方法2:

    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;

    }

  17. 17

    右键消息:添加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;

    }


0 0
原创粉丝点击