现在的位置: 首页 > 综合 > 正文

CListCtrl的使用

2012年02月01日 ⁄ 综合 ⁄ 共 10503字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.