List Control使用总结

3.1 ClistCtrl风格

1. CListCtrl 风格 

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

LVS_ALIGNLEFT 

 当显示格式是大图标或小图标时,标题放在图标的左边.缺省情况下标题放在图标的下面. 

 LVS_ALIGNTOP 

 当显示格式是大图标或小图标时,标题放在图标的上边. 

 LVS_AUTOARRANGE 

 当显示格式是大图标或小图标时,自动排列控件中的表项. 

 LVS_EDITLABELS 

 用户可以修改标题. 

 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 

 按降序排列表项.

除上表的风格外,一般还要指定WS_CHILD和WS_VISIBLE窗口风格.风格组合WS_CHILD| WS_VISIBLE|LVS_REPORT|LVS_AUTOARRANGE|LVS_EDITLABLES|LVS_SINGLESEL将指定一个自动排列的、可编辑标题的、单选择报告式列表视图控件.要指定大图标、小图标或列表式的列表视图控件,则应该把LVS_REPORT换成LVS_ICON、LVS_SMALLICON或LVS_LIST. 

 对于用对话框模板创建的列表视图控件,可以在控件的属性对话框中指定上表中列出的控件风格。例如,在属性对话框的Styles页的View栏中选择Icon,相当于指定了LVS_ICON风格. 
-------------------------------------------------------------------------------- 

2. 设置listctrl 风格及扩展风格 

      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 
       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. 一直选中item 

选中style中的Show selection always,或者在上面第2点中设置LVS_SHOWSELALWAYS 

3.2 插入数据

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");//
设置其它列数据

   //新插入的数据在下面

   int nIndex =m_list.GetItemCount();
    LV_ITEM lvItem;
    lvItem.mask = LVIF_TEXT ; 
    lvItem.iItem = nIndex;     //
行数
    lvItem.iSubItem = 0;
    lvItem.pszText = (char*)(LPCTSTR)strCount;   //
第一列
    //
在最后一行插入记录值.
         m_list.InsertItem(&lvItem); 
    //
插入其它列
    m_list.SetItemText(nIndex,1,strLat);
-------------------------------------------------------------------------------- 

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

3.4 得到listctrl中所有行的checkbox的状态得到listctrl中所有选中行的序号

    CString str;

    for (int i = 0; i

    {

         if (m_CtrTime.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_CtrTime.GetCheck(i))

         {

             str.Format(_T("第%d行的checkbox为选中状态"), i);

             AfxMessageBox(str);

         }

    }
-------------------------------------------------------------------------------- 

3.5 得到listctrl中所有选中行的序号

方法一: 
       CString str; 
       for(int i=0; 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 itemswere 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 
           } 
       } 
-------------------------------------------------------------------------------- 

3.6 得到item的信息

CString str;

    CString strSelected;

    int delcout;

    for (int i = 0; i

    {

         if (m_ctrList.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED)

         {

             str.Format(_T("选中了第%d行"), i);

             strSelected =m_ctrList.GetItemText(i,0);

             AfxMessageBox(str);

             AfxMessageBox(strSelected);

             delcout++;

         }

    }

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

3.7 得到listctrl的所有列的header字符串内容

LVCOLUMN lvcol; 
       char   str[256]; 
       int   nColNum; 
       CString   strColumnName[4];//
假如有4 
       nColNum = 0; 
       lvcol.mask = LVCF_TEXT; 
       lvcol.pszText = str; 
       lvcol.cchTextMax = 256; 
       while(m_list.GetColumn(nColNum,&lvcol)) 
       { 
          strColumnName[nColNum] = lvcol.pszText; 
           nColNum++; 
       } 
-------------------------------------------------------------------------------- 

LV_COLUMN lvColumn;

    char uin[20];

    lvColumn.pszText = uin;

    lvColumn.cchTextMax = 50;

    lvColumn.mask = LVCF_TEXT;

    if (this->GetColumn(col, &lvColumn))

    {

         CString df = lvColumn.pszText;

         MessageBox(df);

    }

3.8 使listctrl中一项可见,即滚动滚动条

m_list.EnsureVisible(i, FALSE); 
-------------------------------------------------------------------------------- 

3.9 得到listctrl列数

int nHeadNum =m_list.GetHeaderCtrl()->GetItemCount(); 
-------------------------------------------------------------------------------- 

3.10 删除所有行列 

//首先删除所有行

       m_ListCtrl.DeleteAllItems();

       //得到列数

       intnItmcount = m_ListCtrl.GetHeaderCtrl()->GetItemCount();

       //删除所有列

       for(int i = 0; i

       {

              m_ListCtrl.DeleteColumn(0);

       }

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

3.11 得到单击的listctrl的行列号

添加listctrl控件的NM_CLICK消息相应函数 
       void CTest6Dlg::OnClickList1(NMHDR*pNMHDR, LRESULT* pResult) 
       { 
           // 
方法一: 
           /* 
           DWORD dwPos =GetMessagePos(); 
           CPoint point(LOWORD(dwPos), HIWORD(dwPos) ); 
          m_list.ScreenToClient(&point); 
           LVHITTESTINFOlvinfo; 
           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; 
       } 
-------------------------------------------------------------------------------- 

3.12 判断是否点击在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); 
           LVHITTESTINFOlvinfo; 
           lvinfo.pt =point; 
           lvinfo.flags =LVHT_ABOVE; 
           UINT nFlag; 
           int nItem =m_list.HitTest(point, &nFlag); 
           //
判断是否点在checkbox 
           if(nFlag == LVHT_ONITEMSTATEICON) 
           { 
                AfxMessageBox("
点在listctrlcheckbox"); 
           } 
           *pResult =0; 
       } 
-------------------------------------------------------------------------------- 

3.13 右键点击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; 
   }

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

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

添加listctrl控件的LVN_ITEMCHANGED消息相应函数 
       void CTest6Dlg::OnItemchangedList1(NMHDR*pNMHDR, LRESULT* pResult) 
       { 
           NM_LISTVIEW*pNMListView = (NM_LISTVIEW*)pNMHDR; 
           // TODO: Add yourcontrol notification handler code here 
           CStringsTemp; 
          if((pNMListView->uOldState & LVIS_FOCUSED) == LVIS_FOCUSED &&(pNMListView->uNewState & LVIS_FOCUSED) == 0) 
           { 
                sTemp.Format("%d losted focus",pNMListView->iItem); 
           } 
           elseif((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; 
-------------------------------------------------------------------------------- 

3.15 listctrl的subitem添加图标

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

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

 

你可能感兴趣的:(MFC)