MFC列表控件(ListControl)
2015-03-25 17:21
513 查看
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);
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();
//或者参考
地址
17.举例
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 }
以上是本人做项目知识记录,部分内容来自网络,本着知识共享原则,不侵犯任何人权益!
相关文章推荐
- 【MFC-12】VS2010/MFC之列表框控件动态编辑(List Control Edit)
- (转载)VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)
- VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)
- MFC List Control控件添加单元格编辑和单元格下拉列表项以适用于数据库相关操作
- MFC 列表视图控件List Control 使用一
- VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)
- MFC列表控件(ListControl)
- VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)
- MFC之列表视图控件List Control
- MFC List Control 控件添加单元格编辑和单元格下拉列表项
- VS2013/MFC编程入门之二十七(常用控件:列表视图控件List Control 上)
- VS2010/MFC编程初识一【ListControl列表视图控件和SliderControl滑块控件的 基本用法】
- (转载)VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)
- VS2013/MFC编程入门之二十八(常用控件:列表视图控件List Control 下)
- 自绘MFC List Control列表控件时无法改变表头CHeaderCtrl高度问题的解决方法
- MFC编程入门之二十八(常用控件:列表视图控件List Control上)
- MFC List Control 控件添加单元格编辑和单元格下拉列表项
- VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)
- VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)
- MFC中ListControl控件的使用