MFC列表控件(ListControl)

转载:https://blog.csdn.net/lsh_2013/article/details/44624239

1. CListCtrl 样式及设置
  1. LVS_ICON: 每个item显示大图标  
  2. LVS_SMALLICON: 每个item显示小图标  
  3. LVS_LIST: 显示一列带有小图标的item  
  4. LVS_REPORT: 显示item详细资料  
  5. 如windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料”  
  6. LONG lStyle;  
  7. lStyle=GetWindowLong(m_ListCtrl.m_hWnd, GWL_STYLE); //获取当前窗口style  
  8. lStyle &= ~LVS_TYPEMASK; //清除显示方式位  
  9. lStyle |= LVS_REPORT; //设置style  
  10. SetWindowLong(m_ListCtrl.m_hWnd, GWL_STYLE, lStyle); //设置style  
 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. 扩展样式设置
  1. DWORD dwStyle = m_ListCtrl.GetExtendedStyle(); //获取当前扩展样式  
  2. dwStyle |= LVS_EX_FULLROWSELECT; //选中某行使整行高亮(report风格时)  
  3. dwStyle |= LVS_EX_GRIDLINES; //网格线(report风格时)  
  4. dwStyle |= LVS_EX_CHECKBOXES; //item前生成checkbox控件  
  5. m_ListCtrl.SetExtendedStyle(dwStyle); //设置扩展风格  
 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. 数据插入
  1. m_ListCtrl.InsertColumn(0,“名称”,LVCFMT_LEFT,50); //插入列  
  2. m_ListCtrl.InsertColumn(1,”备注”,LVCFMT_LEFT,50);  
  3. //直接插入:  
  4. int nRow=m_ListCtrl.InsertItem(0, “VC++”);        //插入行  
  5. m_ListCtrl.SetItemText(nRow,1,”Visual C++ 6.0”);  //设置数据  
  6. //LVITEM 结构插入:  
  7. LVITEM item={0};  
  8. item.iItem=0;  //行号  
  9. item.mask=LVIF_TEXT; /*LVIF_IMAGE支持图标*/;  
  10. item.cchTextMax=15;//插入字符串长度  
  11. item.pszText=”Visual C++ 6.0”;  
  12. int nRow=m_ListCtrl.InsertItem(&item);  
  13. m_ListCtrl.SetItemText(nRow,1,”Visual C++ 6.0”);  
 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

  1. 选中style中的 Show selection always,  
  2. 或者添加扩展样式 LVS_SHOWSELALWAYS  
 选中style中的 Show selection always,
 或者添加扩展样式 LVS_SHOWSELALWAYS

5. 选中和取消选中Item
  1. int nIndex = 0;  
  2. //选中  
  3.  m_ListCtrl.SetItemState(nIndex,LVIS_SELECTED|  
  4.  LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);  
  5. //取消选中  
  6.  m_ListCtrl.SetItemState(nIndex,0,LVIS_SELECTED|LVIS_FOCUSED);  
 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的状态
  1. CString str;  
  2. for(int i=0; i<m_ListCtrl.GetItemCount(); i++)  
  3. {  
  4.   if(m_ListCtrl.GetItemState(i, LVIS_SELECTED)==  
  5.    LVIS_SELECTED || m_ListCtrl.GetCheck(i))  
  6.   {  
  7.     str.Format(_T(”第%d行的checkbox为选中状态”), i);  
  8.     AfxMessageBox(str);  
  9.    }  
  10.  }  
 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中所有选中行的序号
  1. //方法一:  
  2.  CString str;  
  3.  for(int i=0; i<m_ListCtrl.GetItemCount(); i++)  
  4.  {  
  5.    if(m_ListCtrl.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )  
  6.    {  
  7.      str.Format(_T(”选中了第%d行”), i);  
  8.      AfxMessageBox(str);  
  9.     }  
  10.   }  
  11. //方法二:  
  12.  POSITION pos=m_ListCtrl.GetFirstSelectedItemPosition();  
  13.  if(pos==NULL)  
  14.   TRACE0(”No items were selected!/n”);  
  15.  else  
  16.  {  
  17.   while(pos)  
  18.    {  
  19.      int nItem=m_ListCtrl.GetNextSelectedItem(pos);  
  20.      TRACE1(”Item %d was selected!/n”, nItem);  
  21.      //添加其他操作  
  22.     }  
  23.   }  
 //方法一:
  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的信息
  1. TCHAR szBuf[1024];  
  2. LVITEM lvi;  
  3. lvi.iItem = nItemIndex;  
  4. lvi.iSubItem = 0;  
  5. lvi.mask = LVIF_TEXT;  
  6. lvi.pszText = szBuf;  
  7. lvi.cchTextMax = 1024;  
  8. m_ListCtrl.GetItem(&lvi);  
 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);
9. 得到CListCtrl的所有列的header字符串内容
  1. LVCOLUMN lvcol;  
  2. char  str[256];  
  3. int   nColNum;  
  4. CString strColumnName[3];//假如有3列  
  5. nColNum = 0;  
  6. lvcol.mask = LVCF_TEXT;  
  7. lvcol.pszText = str;  
  8. lvcol.cchTextMax = 256;  
  9. while(m_list.GetColumn(nColNum, &lvcol))  
  10. {   
  11.   strColumnName[nColNum] = lvcol.pszText;  
  12.   nColNum++;  
  13.  }  
 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中一项可见,即滚动滚动条
  1. m_ListCtrl.EnsureVisible(i, FALSE);  
 m_ListCtrl.EnsureVisible(i, FALSE);
11. 得到CListCtrl列数
  1. int nHeadNum=m_ListCtrl.GetHeaderCtrl()->GetItemCount();  
 int nHeadNum=m_ListCtrl.GetHeaderCtrl()->GetItemCount();
12. 删除所有列
  1. 方法一:  
  2.  while(m_ListCtrl.DeleteColumn(0))  
  3.  //因为你删除了第一列后,后面的列会依次向上移动。  
  4. 方法二:  
  5.  int nColumns = 3; //列数  
  6.  for(int i=nColumns-1; i>=0; i–)  
  7.   m_ListCtrl.DeleteColumn(i);  
 方法一:
  while(m_ListCtrl.DeleteColumn(0))
  //因为你删除了第一列后,后面的列会依次向上移动。
 方法二:
  int nColumns = 3; //列数
  for(int i=nColumns-1; i>=0; i--)
   m_ListCtrl.DeleteColumn(i);
13. 得到单击的CListCtrl的行列号
  1. 添加listctrl控件的NM_CLICK消息相应函数  
  2. void CMyDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)  
  3. {  
  4.  //方法一:  
  5.  DWORD dwPos=GetMessagePos();  
  6.  CPoint point( LOWORD(dwPos), HIWORD(dwPos));  
  7.  m_ListCtrl.ScreenToClient(&point);  
  8.  LVHITTESTINFO lvinfo;  
  9.  lvinfo.pt=point;  
  10.  lvinfo.flags=LVHT_ABOVE;  
  11.  int nItem=m_ListCtrl.SubItemHitTest(&lvinfo);  
  12.  if(nItem!=-1)  
  13.  {  
  14.    CString strtemp;  
  15.    strtemp.Format(”单击的是第%d行第%d列”,  
  16.    lvinfo.iItem, lvinfo.iSubItem);  
  17.    AfxMessageBox(strtemp);  
  18.   }  
  19.  // 方法二:  
  20.  NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;  
  21.  if(pNMListView->iItem!=-1)  
  22.  {  
  23.    CString strtemp;  
  24.    strtemp.Format(”单击的是第%d行第%d列”,  
  25.    pNMListView->iItem, pNMListView->iSubItem);  
  26.    AfxMessageBox(strtemp);  
  27.   }  
  28.   *pResult = 0;  
  29. }  
 添加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上
  1. 添加listctrl控件的NM_CLICK消息相应函数  
  2. void CMyDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)  
  3. {  
  4.   DWORD dwPos=GetMessagePos();  
  5.   CPoint point(LOWORD(dwPos), HIWORD(dwPos));  
  6.   m_ListCtrl.ScreenToClient(&point);  
  7.   LVHITTESTINFO lvinfo;  
  8.   lvinfo.pt=point;  
  9.   lvinfo.flags=LVHT_ABOVE;  
  10.   UINT nFlag;  
  11.   int nItem=m_ListCtrl.HitTest(point, &nFlag);  
  12.   //判断是否点在checkbox上  
  13.   if(nFlag==LVHT_ONITEMSTATEICON)  
  14.   {  
  15.     AfxMessageBox(”点在listctrl的checkbox上”);  
  16.   }   
  17.   *pResult = 0;  
  18. }  
 添加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弹出菜单
  1. 添加CListCtrl控件的NM_RCLICK消息相应函数  
  2. void CMyDlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)  
  3. {  
  4.   NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;  
  5.   if(pNMListView->iItem!=-1)  
  6.   {  
  7.     DWORD dwPos = GetMessagePos();  
  8.     CPoint point( LOWORD(dwPos), HIWORD(dwPos) );  
  9.     CMenu menu;  
  10.     VERIFY( menu.LoadMenu( IDR_MENU1 ) );  
  11.     CMenu* popup = menu.GetSubMenu(0);  
  12.     ASSERT( popup != NULL );  
  13.     popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,  
  14.     point.x, point.y, this );  
  15.    }   
  16.    *pResult = 0;  
  17. }  
 添加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进行大数据量更新时,避免闪烁
  1. m_ListCtrl.SetRedraw(FALSE);  
  2. //更新内容  
  3. m_ListCtrl.SetRedraw(TRUE);  
  4. m_ListCtrl.Invalidate();  
  5. m_ListCtrl.UpdateWindow();  
 m_ListCtrl.SetRedraw(FALSE);
 //更新内容
 m_ListCtrl.SetRedraw(TRUE);
 m_ListCtrl.Invalidate();
 m_ListCtrl.UpdateWindow();

 //或者参考  地址

17.举例

  1. BOOL CImageDlg::OnInitDialog()  
  2. {  
  3.     CDialog::OnInitDialog();  
  4.     // Add “About…” menu item to system menu.  
  5.     // IDM_ABOUTBOX must be in the system command range.  
  6.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);  
  7.     ASSERT(IDM_ABOUTBOX < 0xF000);  
  8.     CMenu* pSysMenu = GetSystemMenu(FALSE);  
  9.     if (pSysMenu != NULL)  
  10.   {  
  11.     CString strAboutMenu;  
  12.     strAboutMenu.LoadString(IDS_ABOUTBOX);  
  13.     if (!strAboutMenu.IsEmpty())  
  14.     {  
  15.     pSysMenu->AppendMenu(MF_SEPARATOR);  
  16.     pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);  
  17.      }  
  18.    }  
  19.     DWORD dwStyle = m_list.GetExtendedStyle(); //获取当前扩展样式  
  20.     dwStyle |= LVS_EX_FULLROWSELECT; //选中某行使整行高亮(report风格时)  
  21.     dwStyle |= LVS_EX_GRIDLINES; //网格线(report风格时)  
  22.     m_list.SetExtendedStyle(dwStyle); //设置扩展风格  
  23.     m_list.InsertColumn(0,”ID”);  
  24.     m_list.InsertColumn(1,”位置(X)”);  
  25.     m_list.InsertColumn(2,”位置(Y)”);  
  26.     m_list.InsertColumn(3,”旋转角度(Angle)”);  
  27.     m_list.InsertColumn(4,”匹配分数(Score)”);  
  28.     CRect rect;  
  29.     m_list.GetClientRect(rect);  
  30.     m_list.SetColumnWidth(0,rect.Width()/5);  
  31.     m_list.SetColumnWidth(1,rect.Width()/5);  
  32.     m_list.SetColumnWidth(2,rect.Width()/5);  
  33.     m_list.SetColumnWidth(3,rect.Width()/5);  
  34.     m_list.SetColumnWidth(4,rect.Width()/5);</span>  
  35.     // Set the icon for this dialog.  The framework does this automatically  
  36.     //  when the application’s main window is not a dialog  
  37.     SetIcon(m_hIcon, TRUE);// Set big icon  
  38.     SetIcon(m_hIcon, FALSE);// Set small icon  
  39.     // TODO: Add extra initialization here  
  40.     return TRUE;  // return TRUE  unless you set the focus to a control  
  41. }  
BOOL CImageDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    // Add "About..." menu item to system menu.
    // IDM_ABOUTBOX must be in the system command range.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);
    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
  {
    CString strAboutMenu;
    strAboutMenu.LoadString(IDS_ABOUTBOX);
    if (!strAboutMenu.IsEmpty())
    {
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
     }
   }
    DWORD dwStyle = m_list.GetExtendedStyle(); //获取当前扩展样式
    dwStyle |= LVS_EX_FULLROWSELECT; //选中某行使整行高亮(report风格时)
    dwStyle |= LVS_EX_GRIDLINES; //网格线(report风格时)
    m_list.SetExtendedStyle(dwStyle); //设置扩展风格
    m_list.InsertColumn(0,"ID");
    m_list.InsertColumn(1,"位置(X)");
    m_list.InsertColumn(2,"位置(Y)");
    m_list.InsertColumn(3,"旋转角度(Angle)");
    m_list.InsertColumn(4,"匹配分数(Score)");
    CRect rect;
    m_list.GetClientRect(rect);
    m_list.SetColumnWidth(0,rect.Width()/5);
    m_list.SetColumnWidth(1,rect.Width()/5);
    m_list.SetColumnWidth(2,rect.Width()/5);
    m_list.SetColumnWidth(3,rect.Width()/5);
    m_list.SetColumnWidth(4,rect.Width()/5);</span>
    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);// Set big icon
    SetIcon(m_hIcon, FALSE);// Set small icon
    // TODO: Add extra initialization here
    return TRUE;  // return TRUE  unless you set the focus to a control
}

以上是本人做项目知识记录,部分内容来自网络,本着知识共享原则,不侵犯任何人权益!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值