CListCtrl 学习笔记(1)---基础篇 背景:CListCtrl 在小型数据库中应用的还是比较多的.因此掌握它是一个很重要的技能.最近在做老师布置的一个项目,用到它,开始的时候不知所措.后来上网找了一些资料,再加上自己的探索,终于对它有一个比较全面的认识.下面我简单讲讲它的一些用法,以此和大家共享一下. 1. 基本风格设置 (1)函数: ModifyStyle( ) (2)重要参数: LVS_ICON // 大图标 LVS_SMALLICON // 小图标 LVS_LIST // 列表 LVS_REPORT // 报表 (3)说明: 用的比较多的是最后的报表视图.因为它可以有多列,正好代表数据库中的多个属性.所以下面的用法都是针对这种风格的.当然这些风格也可以在控件的属性中设置 (4) 注意 我们知道在窗口各种各样的风格之间,有时是可以用” |”,表示属性叠加.如: WS_CHILD | WS_VISIBLE; 但是上面的四种风格是不可能放在一起的.所以不要用到 “ |”操作符. 也正是因此,防止用户出错, 微软干脆把LVS_ICON, LVS_SMALLICON, LVS_LIST, LVS_REPORT这些都不设置成位标志,因此不能叠加.同时还设置了一个多余的掩码: LVS_TYPEMASK.它是用来屏蔽的. (5) 举例: 如果我们要判断一个CListCtrl的风格: DWORD dwStyle = m_listctrl.GetStyle( ); // 判断是否大图标样式 If ( dwStyle & LVS_ICON ) ……. 这种写法是错误的.正确的写法涉及到掩码: DWORD dwStyle = m_listctrl.GetStyle( ) & LVS_TYPEMASK; If ( dwStyle = = LVS_ICON) ……. 同理,我们在改变风格时,应该这样写: ModifyStyle( LVS_TYPEMASK, LVS_ICON); 2. 扩展风格设置 (1) 函数 : SetExtendedStyle( ) GetExtendedStyle ( ) (2) 重要参数: LVS_EX_FULLROWSELECT //选中某行使整行高亮(只适用与报表风格) LVS_EX_GRIDLINES //网格线(只适用与报表风格) LVS_EX_CHECKBOXES //设置checkbox状态 (3)举例 DWORD dwStyle = GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT; dwStyle |= LVS_EX_GRIDLINES; SetExtendedStyle(dwStyle); 3.其他风格设置: 函数: SetTextColor ( ) // 设置文字颜色 SetBkColor ( ) // 设置边框颜色 SetTextBkColor ( ) // 设置文字背景颜色 //下面直接举例说明 4.图标设置 可以给大图标风格和小图标风格设置图标: HICON icon=AfxGetApp()->LoadIcon(IDI_ICON1); m_icon.Add(icon); m_listctrl.SetImageList(&m_icon,LVSIL_SMALL);//小图标 m_listctrl.SetImageList(&m_icon,LVSIL_NORMAL)// 大图标 5插入一列 m_listctrl.InsertColumn(0,”哈哈”,LVCFMT_LEFT,80); 其中: 0是索引项,”哈哈”是列标题,LVCFMT_LEFT是显示方式(靠左),80表示列的宽 6插入一行 m_listctrl.InsertItem(0, “123”,0);// 插入为第一行第一列的内容,最后一个0是图标的索引 m_listctrl.SetItemText( 0,1, “123”) ; // 设置第一行第2列的内容 m_ listctrl.SetItemText(0,2, “123”) ; // 设置第一行第3列的内容 7得到所有的行数 m_listctrl.GetItemCount( ) ; 8.得到所有的列数 m_listctrl.GetHeaderCtrl().GetItemCount( ) ; 9.得到被单击的项的行列号 void Cmylist::OnClick(NMHDR* pNMHDR, LRESULT* pResult) //单击消息 { NM_LISTVIEW *info=(NM_LISTVIEW*)pNMHDR; selectedIndex=info->iItem; // 行号 selectedsub=info->iSubItem; // 列号 } (Cmylist为CListCtrl的派生类,以selectedIndex和selectedsub为接口,方便使用) 10.得到被单击的列头索引号 void Cmylist::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; selectedField=pNMListView->iSubItem;//列头号 } 同上,也是以selectedField为接口,方便用户调用 11.选中或者取消一行 plistctrl->SetItemState(index,LVIS_SELECTED,LVIS_SELECTED);//选中一行 plistctrl->SetItemState(index,0,LVIS_SELECTED);//取消一行 DWORD style=plistctrl->GetItemState(index,LVIS_SELECTED);//获得选中信息 12.获得被选中的多行 POSITION p=m_listctrl.GetFirstSelectedItemPosition();// 得到第一次选中的位置 while(p) { int index=m_listctrl.GetNextSelectedItem(p); … } 13.删除一行或者一列 m_listctrl.DeleteItem( index ); m_listctrl.DeleteColumn(index); 14.删除多行或者多列 注意要从后面开始删起,比如,如果我想删除第一行和第二行,应该: m_listctrl.DeleteItem(1); m_listctrl.DeleteItem(0); 而不能: m_listctrl.DeleteItem(0); m_listctrl.DeleteItem(1); 因为每次删除一行或者一列,后面的索引号都要变化,所以从后面开始删除就没关系. 如果用for循环,应该递减: For(int k=m_listctrl.GetItemCount( );k>=-1;k++) m_listctrl.DeleteItem(k); 这就是删除所有行,当然也可以用CListCtrl::DeleteAllItems 15 根据索引号得到某一列的信息 HDITEM hdi; TCHAR lpBuffer[256]; hdi.mask = HDI_TEXT; hdi.pszText = lpBuffer; hdi.cchTextMax = 256; plistctrl->GetHeaderCtrl()->GetItem(index, &hdi); CString str=hdi.pszText;

评论