CListCtrl的使用

CListCtrl 風格設置:

 DWORD   dwStyle   =   m_ListCtrl.GetExtendedStyle();  
 dwStyle   |=   LVS_EX_FULLROWSELECT;    //選中某行使整行高亮(只適用與report風格的listctrl)  
 dwStyle   |=   LVS_EX_GRIDLINES;     //網格線(只適用與report風格的listctrl)  
 dwStyle   |=   LVS_EX_SUBITEMIMAGES;    // 設置圖片
 dwStyle   |=   LVS_EX_ONECLICKACTIVATE;    // 點選一個活動行
 m_ListCtrl.SetExtendedStyle(dwStyle);    //設置擴展風格

CListCtrl 中的item插入圖片

LVITEM   lvItem;   
memset(&lvItem,   0,   sizeof(LVITEM));   
 lvItem.iItem = nI;   
lvItem.iSubItem = 2; 
lvItem.mask = LVIF_IMAGE;

lvItem.iImage = 1;    // 不帶鉤的圖片 

 m_ListCtrl.SetItem(&lvItem);

 

CListCtrl改變單個item的顏色

首先必須先重載CListCtrl中的OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)函數,進行重繪,然後設置item顏色。

//*********************************************************************************
//** 函 數 名:OnNMCustomdraw
//** 功能描述:listctrl 控件自繪函數,用來修改控件中的顏色
//** 全局變量:
//** 調用模塊:
//** 作    者:chenbo
//** 日    期:2008-10-23
//** 修 改 者:
//** 日    期:
//** 版    本:1.0      
//*********************************************************************************
void CListCtrlEx::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
 *pResult = CDRF_DODEFAULT;
 NMLVCUSTOMDRAW * lplvdr=(NMLVCUSTOMDRAW*)pNMHDR;
 NMCUSTOMDRAW &nmcd = lplvdr->nmcd;
 
 switch(lplvdr->nmcd.dwDrawStage)
 {
 case CDDS_PREPAINT:
  
  *pResult = CDRF_NOTIFYITEMDRAW;
  break;
  
 case CDDS_ITEMPREPAINT :
  {
   COLORREF ItemColor;
   if( MapItemColor.Lookup(nmcd.dwItemSpec, ItemColor))
   {
    lplvdr->clrText = ItemColor;
    *pResult = CDRF_DODEFAULT;
   }
  }
  break; 
 }

}

//*********************************************************************************
//** 函 數 名:SetItemColor
//** 功能描述:設置item的顏色
//** 全局變量:
//** 調用模塊:
//** 作    者:chenbo
//** 日    期:2008-10-23
//** 修 改 者:
//** 日    期:
//** 版    本:1.0      
//*********************************************************************************
void CListCtrlEx::SetItemColor(DWORD iItem, COLORREF color)
{
 ASSERT(iItem >= 0);
 MapItemColor.SetAt(iItem, color);
 this->RedrawItems(iItem, iItem);
 UpdateWindow();
}
 

 

ClistCtrl中的多選

BOOL CGeoCheckHelp::PreTranslateMessage(MSG* pMsg)
{   
 if(pMsg->message==WM_LBUTTONDOWN)
 {
  // 該函數的返回值爲一個Integer型數(雙字節),要判斷是否按下特定鍵,就看返回值,
  // 如果開關鍵打開,則位0設爲1(開關鍵包括CapsLock, NumLock,ScrollLock);即(0000000000000001)2,
  // 如果某鍵正處於按下狀態,則位15爲1;即(1000000000000000)2,如已經擡起,則爲0。即(0000000000000001)2,
  // 如果某鍵正處於按下狀態,則位15爲1;即(1000000000000000)2,如已經擡起,則爲0

  if (!(GetKeyState(VK_CONTROL)&0x8000) && !(GetKeyState(VK_SHIFT)&0x8000) )
  {
   if(IsMuitSelCur())
   {
    LVHITTESTINFO hitTest;
    UINT   uFlags   =    0 ;  

    CPoint point;
    point.SetPoint(pMsg->pt.x,pMsg->pt.y);

    m_ListCtrl.ScreenToClient(&point);
    hitTest.pt = point;
    hitTest.flags = uFlags;
    m_ListCtrl.HitTest(&hitTest);

    int nRow = m_ListCtrl.HitTest(point);
    CString strTem = m_ListCtrl.GetItemText(nRow,2);
    CString strTep = m_ListCtrl.GetItemText(nRow,8);

    LVHITTESTINFO sublvHit;
    sublvHit.pt = point;
    int nColumn = m_ListCtrl.SubItemHitTest(&sublvHit);

    if(sublvHit.iSubItem == 2)
    {
     POSITION pos = m_ListCtrl.GetFirstSelectedItemPosition();
     if (pos == NULL)
      return TRUE;
     else
     {
      do
      {
       int nItem = m_ListCtrl.GetNextSelectedItem(pos);
       {
        int nCheckID = vec1[nItem];
        CString strCheckID;
        strCheckID.Format(_T("%d"),nCheckID);
        if ( strTem== _T("√") )
        {
         SetTableData(strCheckID,0);
         m_ListCtrl.SetRedraw(false);
         m_ListCtrl.SetItemText(nItem,2,_T("□"));
         m_ListCtrl.SetRedraw(true);

        }else
        {
         SetTableData(strCheckID,-1);
         m_ListCtrl.SetRedraw(false);
         m_ListCtrl.SetItemText(nItem,2,_T("√"));
         m_ListCtrl.SetRedraw(true);
        }
       }

 

 

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

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

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();
 //或者參考

 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_cwnd.3a3a.setredraw.asp


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/sghgcn/archive/2009/03/05/3958219.aspx
      }
      while(pos);
     }
     return TRUE;
    }
    if (sublvHit.iSubItem == 8)
    {
     POSITION pos = m_ListCtrl.GetFirstSelectedItemPosition();
     if (pos == NULL)
      return TRUE;
     else
     {
      do
      {
       int nItem = m_ListCtrl.GetNextSelectedItem(pos);
       {
        int nCheckID = vec1[nItem];
        CString strCheckID;
        strCheckID.Format(_T("%d"),nCheckID);
        if ( strTep== _T("√") )
        {
         SetMoreTableData(strCheckID,0);
         m_ListCtrl.SetRedraw(false);
         m_ListCtrl.SetItemText(nItem,8,_T("□"));
         m_ListCtrl.SetRedraw(true);

        }else
        {
         SetMoreTableData(strCheckID,-1);
         m_ListCtrl.SetRedraw(false);
         m_ListCtrl.SetItemText(nItem,8,_T("√"));
         m_ListCtrl.SetRedraw(true);
        }
       }
      }
      while(pos);
     }
     return TRUE;
    }
   }
  }
 }      
 return   CDialog::PreTranslateMessage(pMsg);
}
 

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