CListCtrl控件

1. CListCtrl 樣式及設置

2. 擴展樣式設置

3. 數據插入

4. 一直選中Item

5. 選中和取消選中Item

6. 得到CListCtrl中所有行的checkbox的狀態

7. 得到CListCtrl中所有選中行的序號

8. 得到item的信息

9. 得到CListCtrl的所有列的header字符串內容

10. 使CListCtrl中一項可見,即滾動滾動條

11. 得到CListCtrl列數

12. 刪除所有列

13. 得到單擊的CListCtrl的行列號

14. 判斷是否點擊在CListCtrl的checkbox上

15. 右鍵點擊CListCtrl的item彈出菜單

16. CListCtrl進行大數據量更新時,避免閃爍

!時間倉促,此播客內容大多爲網上整理,特向原作者表示感謝!


1. CListCtrl 樣式及設置
 LVS_ICON: 每個item顯示大圖標
 LVS_SMALLICON: 每個item顯示小圖標
 LVS_LIST: 顯示一列帶有小圖標的item
 LVS_REPORT: 顯示item詳細資料

 如windows資源管理器,“查看”標籤下的“大圖標,小圖標,列表,詳細資料”

 

 LONG lStyle;
 lStyle=GetWindowLong(m_ListCtrl.m_hWnd, GWL_STYLE); //獲取當前窗口style
 lStyle &= ~LVS_TYPEMASK; //清除顯示方式位
 lStyle |= LVS_REPORT; //設置style
 SetWindowLong(m_ListCtrl.m_hWnd, GWL_STYLE, lStyle); //設置style


2. 擴展樣式設置

 DWORD dwStyle = m_ListCtrl.GetExtendedStyle(); //獲取當前擴展樣式
 dwStyle |= LVS_EX_FULLROWSELECT; //選中某行使整行高亮(report風格時)
 dwStyle |= LVS_EX_GRIDLINES; //網格線(report風格時)
 dwStyle |= LVS_EX_CHECKBOXES; //item前生成checkbox控件
 m_ListCtrl.SetExtendedStyle(dwStyle); //設置擴展風格


3. 數據插入

 m_ListCtrl.InsertColumn(0,"名稱",LVCFMT_LEFT,50); //插入列
 m_ListCtrl.InsertColumn(1,"備註",LVCFMT_LEFT,50);
 

 //直接插入:

 int nRow=m_ListCtrl.InsertItem(0, "VC++");        //插入行
 m_ListCtrl.SetItemText(nRow,1,"Visual C++ 6.0");  //設置數據

 

 //LVITEM 結構插入:

 LVITEM item={0};
 item.iItem=0;  //行號
 item.mask=LVIF_TEXT; /*LVIF_IMAGE支持圖標*/;
 item.cchTextMax=15;//插入字符串長度
 item.pszText="Visual C++ 6.0";

 int nRow=m_ListCtrl.InsertItem(&item);

 m_ListCtrl.SetItemText(nRow,1,"Visual C++ 6.0");


4. 一直選中Item

 選中style中的 Show selection always,

 或者添加擴展樣式 LVS_SHOWSELALWAYS


5. 選中和取消選中Item
 int nIndex = 0;
 //選中
  m_ListCtrl.SetItemState(nIndex,LVIS_SELECTED|

  LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
 //取消選中
  m_ListCtrl.SetItemState(nIndex,0,LVIS_SELECTED|LVIS_FOCUSED);


6. 得到CListCtrl中所有行的checkbox的狀態
 CString str;
 for(int i=0; i<m_ListCtrl.GetItemCount(); i++)

 {
   if(m_ListCtrl.GetItemState(i, LVIS_SELECTED)==

    LVIS_SELECTED || m_ListCtrl.GetCheck(i))
   {
     str.Format(_T("第%d行的checkbox爲選中狀態"), i);
     AfxMessageBox(str);
    }

  }


7. 得到CListCtrl中所有選中行的序號

 //方法一:
  CString str;
  for(int i=0; i<m_ListCtrl.GetItemCount(); i++)
  {
    if(m_ListCtrl.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
    {
      str.Format(_T("選中了第%d行"), i);
      AfxMessageBox(str);
     }
   }

 //方法二:
  POSITION pos=m_ListCtrl.GetFirstSelectedItemPosition();
  if(pos==NULL)
   TRACE0("No items were selected!/n");
  else
  {
   while(pos)
    {
      int nItem=m_ListCtrl.GetNextSelectedItem(pos);
      TRACE1("Item %d was selected!/n", nItem);
      //添加其他操作

     }
   }


8. 得到item的信息
 TCHAR szBuf[1024];
 LVITEM lvi;
 lvi.iItem = nItemIndex;
 lvi.iSubItem = 0;
 lvi.mask = LVIF_TEXT;
 lvi.pszText = szBuf;
 lvi.cchTextMax = 1024;
 m_ListCtrl.GetItem(&lvi);

 

 關於得到設置item的狀態,還可以參考msdn文章
 Q173242: Use Masks to Set/Get Item States in CListCtrl
 http://support.microsoft.com/kb/173242/en-us


9. 得到CListCtrl的所有列的header字符串內容
 LVCOLUMN lvcol;
 char  str[256];
 int   nColNum;
 CString strColumnName[3];//假如有3列

 nColNum = 0;
 lvcol.mask = LVCF_TEXT;
 lvcol.pszText = str;
 lvcol.cchTextMax = 256;
 while(m_list.GetColumn(nColNum, &lvcol))
 { 
   strColumnName[nColNum] = lvcol.pszText;
   nColNum++;
  }


10. 使CListCtrl中一項可見,即滾動滾動條
 m_ListCtrl.EnsureVisible(i, FALSE);


11. 得到CListCtrl列數
 int nHeadNum=m_ListCtrl.GetHeaderCtrl()->GetItemCount();


12. 刪除所有列
 方法一:
  while(m_ListCtrl.DeleteColumn(0))
  //因爲你刪除了第一列後,後面的列會依次向上移動。

 方法二:
  int nColumns = 3; //列數
  for(int i=nColumns-1; i>=0; i--)

   m_ListCtrl.DeleteColumn(i);


13. 得到單擊的CListCtrl的行列號
 添加listctrl控件的NM_CLICK消息相應函數
 void CMyDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
 {
  //方法一:

  DWORD dwPos=GetMessagePos();
  CPoint point( LOWORD(dwPos), HIWORD(dwPos));

  m_ListCtrl.ScreenToClient(&point);
  

  LVHITTESTINFO lvinfo;
  lvinfo.pt=point;
  lvinfo.flags=LVHT_ABOVE;
  

  int nItem=m_ListCtrl.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. 判斷是否點擊在CListCtrl的checkbox上
 添加listctrl控件的NM_CLICK消息相應函數
 void CMyDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
 {

   DWORD dwPos=GetMessagePos();
   CPoint point(LOWORD(dwPos), HIWORD(dwPos));

   m_ListCtrl.ScreenToClient(&point);
  

   LVHITTESTINFO lvinfo;
   lvinfo.pt=point;
   lvinfo.flags=LVHT_ABOVE;
     
   UINT nFlag;
   int nItem=m_ListCtrl.HitTest(point, &nFlag);
   //判斷是否點在checkbox上
   if(nFlag==LVHT_ONITEMSTATEICON)
   {
     AfxMessageBox("點在listctrl的checkbox上");
   } 
   *pResult = 0;
 }


15. 右鍵點擊CListCtrl的item彈出菜單
 添加CListCtrl控件的NM_RCLICK消息相應函數
 void CMyDlg::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. CListCtrl進行大數據量更新時,避免閃爍
 m_ListCtrl.SetRedraw(FALSE);
 //更新內容
 m_ListCtrl.SetRedraw(TRUE);
 m_ListCtrl.Invalidate();
 m_ListCtrl.UpdateWindow();


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章