1.获取CListCtrl 列数
//m_List是一个CListCtrl
CHeaderCtrl* pHeaderCtrl = m_List.GetHeaderCtrl();
if(pHeaderCtrl)
{
int n = pHeaderCtrl-> GetItemCount();
}
2.获取选择的行数
void CInfoDlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
NMLISTVIEW* pList = (NMLISTVIEW*)pNMHDR;
CString str;
// 获取总行数
int nItem=m_cListCtrl.GetItemCount();
// 获取总列数
CHeaderCtrl* pHeaderCtrl = m_cListCtrl.GetHeaderCtrl();
if(pHeaderCtrl)
{
int n = pHeaderCtrl-> GetItemCount();
以下未经说明,listctrl默认view 风格为report
-------------------------------------------------------------------------------
1. CListCtrl 风格
LVS_ICON: 为每个item显示大图标
LVS_SMALLICON: 为每个item显示小图标
LVS_LIST: 显示一列带有小图标的item
LVS_REPORT: 显示item详细资料
直观的理解:windows资源管理器,\"查看\"标签下的\"大图标,小图标,列表,详细资料
--------------------------------------------------------------------------------
2. 设置listctrl 风格及扩展风格
LONG lStyle;
lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style
lStyle &= ~LVS_TYPEMASK; //清除显示方式位
lStyle |= LVS_REPORT; //设置style
SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style
DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_list.SetExtendedStyle(dwStyle); //设置扩展风格
注:listview的style请查阅msdn
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp
--------------------------------------------------------------------------------
3. 插入数据
m_list.InsertColumn( 0, \"ID\插入列
m_list.InsertColumn( 1, \"NAME\
//新插入的在上面
int nRow = m_list.InsertItem(0, \"11\");// 插入行
m_list.SetItemText(nRow, 1, \"jacky\");//设置其它列数据
//新插入的数据在下面
int nIndex = m_list.GetItemCount();
LV_ITEM lvItem;
lvItem.mask = LVIF_TEXT ;
lvItem.iItem = nIndex; //行数
lvItem.iSubItem = 0;
lvItem.pszText = (char*)(LPCTSTR)strCount; //第一列
//在最后一行插入记录值.
m_list.InsertItem(&lvItem);
//插入其它列
m_list.SetItemText(nIndex,1,strLat);
--------------------------------------------------------------------------------
4. 一直选中item
选中style中的Show selection always,或者在上面第2点中设置LVS_SHOWSELALWAYS
--------------------------------------------------------------------------------
5. 选中和取消选中一行
int nIndex = 0;
//选中
m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED);
LVIS_SELECTED|LVIS_FOCUSED,
//取消选中
m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);
--------------------------------------------------------------------------------
6. 得到listctrl中所有行的checkbox的状态
m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);
CString str;
for(int i=0; i if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i)) { str.Format(_T(\"第%d行的checkbox为选中状态\"), i); AfxMessageBox(str); } } -------------------------------------------------------------------------------- 7. 得到listctrl中所有选中行的序号 方法一: CString str; for(int i=0; i if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED ) { str.Format(_T(\"选中了第%d行\"), i); AfxMessageBox(str); } } 方法二: POSITION pos = m_list.GetFirstSelectedItemPosition(); if (pos == NULL) TRACE0(\"No items were selected!\\n\"); Else { while (pos) { int nItem = m_list.GetNextSelectedItem(pos); TRACE1(\"Item %d was selected!\\n\ // you could do your own processing on nItem here } } -------------------------------------------------------------------------------- 8. 得到item的信息 TCHAR szBuf[1024]; LVITEM lvi; lvi.iItem = nItemIndex; lvi.iSubItem = 0; lvi.mask = LVIF_TEXT; lvi.pszText = szBuf; lvi.cchTextMax = 1024; m_list.GetItem(&lvi); 关于得到设置item的状态,还可以参考msdn文章 Q173242: Use Masks to Set/Get Item States in ClistCtrl http://support.microsoft.com/kb/173242/en-us -------------------------------------------------------------------------------- 9. 得到listctrl的所有列的header字符串内容 LVCOLUMN lvcol; char str[256]; int nColNum; CString strColumnName[4];//假如有4列 nColNum = 0; lvcol.mask = LVCF_TEXT; lvcol.pszText = str; lvcol.cchTextMax = 256; while(m_list.GetColumn(nColNum, &lvcol)) { strColumnName[nColNum] = lvcol.pszText; nColNum++; } -------------------------------------------------------------------------------- 10. 使listctrl中一项可见,即滚动滚动条 m_list.EnsureVisible(i, FALSE); -------------------------------------------------------------------------------- 11. 得到listctrl列数 int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount(); -------------------------------------------------------------------------------- 12. 删除所有列 方法一: while ( m_list.DeleteColumn (0)) 因为你删除了第一列后,后面的列会依次向上移动。 方法二: int nColumns = 4; for (int i=nColumns-1; i>=0; i--) m_list.DeleteColumn (i); -------------------------------------------------------------------------------- 13. 得到单击的listctrl的行列号 添加listctrl控件的NM_CLICK消息相应函数 void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) { // 方法一: /* DWORD dwPos = GetMessagePos(); CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); m_list.ScreenToClient(&point); LVHITTESTINFO lvinfo; lvinfo.pt = point; lvinfo.flags = LVHT_ABOVE; int nItem = m_list.SubItemHitTest(&lvinfo); if(nItem != -1) { CString strtemp; strtemp.Format(\"单击的是第%d行第%dlvinfo.iSubItem); 列\lvinfo.iItem, 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. 判断是否点击在listctrl的checkbox上 添加listctrl控件的NM_CLICK消息相应函数 void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) { DWORD dwPos = GetMessagePos(); CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); m_list.ScreenToClient(&point); LVHITTESTINFO lvinfo; lvinfo.pt = point; lvinfo.flags = LVHT_ABOVE; UINT nFlag; int nItem = m_list.HitTest(point, &nFlag); //判断是否点在checkbox上 if(nFlag == LVHT_ONITEMSTATEICON) { AfxMessageBox(\"点在listctrl的checkbox上\"); } *pResult = 0; } -------------------------------------------------------------------------------- 15. 右键点击listctrl的item弹出菜单 添加listctrl控件的NM_RCLICK消息相应函数 void CTest6Dlg::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. item切换焦点时(包括用键盘和鼠标切换item时),状态的一些变化顺序 添加listctrl控件的LVN_ITEMCHANGED消息相应函数 void pResult) CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here CString sTemp; if((pNMListView->uOldState & LVIS_FOCUSED) == LVIS_FOCUSED && (pNMListView->uNewState & LVIS_FOCUSED) == 0) { sTemp.Format(\"%d losted focus\ } else if((pNMListView->uOldState & LVIS_FOCUSED) == 0 && (pNMListView->uNewState & LVIS_FOCUSED) == LVIS_FOCUSED) { sTemp.Format(\"%d got focus\ } if((pNMListView->uOldState & LVIS_SELECTED) == LVIS_SELECTED && (pNMListView->uNewState & LVIS_SELECTED) == 0) { sTemp.Format(\"%d losted selected\ } else if((pNMListView->uOldState & LVIS_SELECTED) == 0 && (pNMListView->uNewState & LVIS_SELECTED) == LVIS_SELECTED) { sTemp.Format(\"%d got selected\ } *pResult = 0; -------------------------------------------------------------------------------- 17. 得到另一个进程里的listctrl控件的item内容 http://www.codeproject.com/threads/int_memsteal.asp -------------------------------------------------------------------------------- 18. 选中listview中的item Q131284: How To Select a Listview Item Programmatically http://support.microsoft.com/kb/131284/en-us -------------------------------------------------------------------------------- 19. 如何在CListView中使用CListCtrl的派生类 http://www.codeguru.com/cpp/controls/listview/introduction/article.php/c919/ -------------------------------------------------------------------------------- 20. listctrl的subitem添加图标 m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES); m_list.SetItem(..); //具体参数请参考msdn } str.Format(\"你双击了:%d行,%d列\ MessageBox(str); *pResult = 0; } NMHDR结构: 消息通过下面的宏定义之: ON_NOTIFY( wNotifyCode, idControl, memberFxn ) wNotifyCode 通知消息标识符代码,如 TBN_BEGINADJUST。 idControl 发送通知的控件的标识符。 memberFxn 接收到通知时调用的成员函数。 在WM_NOTIFY中,lParam中放的是一个称为NMHDR结构的指针。在wParam中放的则是控件的ID。 NMHDR结构是很值得一提的,该结构包括有关制作该通知的控件的任何内容,而不受空间和类型的,他的来历也是很有意思的。 在最初的windows3.x中,根本就不存在什么WM_NOTIFY,控件通知它们父窗口,如鼠标点击,控件背景绘制事件,通过发送一个消息到父窗口。简单的通知仅发送一个WM_COMMAND消息,包含一个通知码和一个在wParam中的控件ID及一个在lPraram中的控件句柄。这样一来,wParam和lParam就都被填充了,没有额外的空间来传递一些其它的消息,例如鼠标按下的位置和时间。 为了克服这个困难,windows3.x就提出了一个比较低级的解决策略,那就是给一些消息添加一些附加消息,最为明显的就是控件自画用到的DRAWITEMSTRUCT。不知道大家对这个结构熟悉不,不过,如果你是老手,你应该非常清楚这个结构,这个结构包含了9个内容,几乎你需要控制的信息都给你提供了。为什么说它比较低级呢?因为不同的消息附加的内容不同,结果就是一盘散沙,非常混乱。 在win32中,MS又提出了一个更好的解决方案:引进NMHDR结构。这个结构的引进就是消息统一起来,利用它可以传递复杂的信息。这个结构的布局如下: typedef struct tagNMHDR { HWnd hWndFrom;// 相当于原WM_COMMAND传递方式的lParam UINT idFrom; // 相当于原WM_COMMAND传递方式的wParam(low-order) UINT code; // 相当于原WM_COMMAND传递方式的NotifyCode(wParam's high- order) }NMHDR; 对于这个结构的应用于WM_NOTIFY信息结构,结果WM_NOTIFY就变成了: A、无附加信息。结构变得很简单,就是一个NMHDR结构。 B、有附加信息。定义一个大的结构,它的第一个元素就是NMHDR结构,它的后面放置附加信息。 举例://得到选中的列 void CMyView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; //得到选中的列 int nColumn=pNMListView->iSubItem; } 成员函数将用下列原型声明: afx_msg void memberFxn(NMHDR *pNotifyStruct,LRESULT *pResult); 由此知识就可方便解释NM_LISTVIEW与NM_TREEVIEW了, 其实: NM_LISTVIEW 为 #define LPNM_LISTVIEW LPNMLISTVIEW #define NM_LISTVIEW NMLISTVIEW 而NMLISTVIEW结构为: typedef struct tagNMLISTVIEW { NMHDR hdr; int iItem; int iSubItem; UINT uNewState; UINT uOldState; UINT uChanged; POINT ptAction; LPARAM lParam; } NMLISTVIEW, *LPNMLISTVIEW;
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务