=============================================================
标题:ListCtrl控件的简单使用
摘要:
备注 Windows CE 5.0
日期:2010.5.1
姓名:朱铭雷
=============================================================
1 头文件中声明一个CImageList对象指针,该对象用来存储ListCtrl控件所要使用的图标。
CImageList * m_pImageList;
2 动态创建一个CImageList对象。此处要注意图标的大小,32*32的图标Report视图将不能够使用。
m_pImageList = new CImageList();
m_pImageList->Create(16,16,TRUE,4,4);
3 为m_pImageList加载图标
CListCtrlNTApp *pApp;
pApp = (CListCtrlNTApp *)AfxGetApp();
m_pImageList->Add(pApp->LoadIconW(IDI_ICON1));
m_pImageList->Add(pApp->LoadIconW(IDI_ICON2));
m_pImageList->Add(pApp->LoadIconW(IDI_ICON3));
m_pImageList->Add(pApp->LoadIconW(IDI_ICON4));
4 在对话框中放置一个ListCtrl控件,并将ID设置为:IDC_LISTCTRL
5 通过代码设置ListCtrl控件新属性,注意只改变自己关心的属性,如下面这种方式:
long lMask = LVS_SINGLESEL | LVS_EDITLABELS | LVS_NOLABELWRAP | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | LVS_ICON | LVS_SMALLICON | LVS_REPORT | LVS_LIST |
LVS_SORTASCENDING | LVS_SORTDESCENDING | LVS_ALIGNLEFT;
lStyle = 0;
lStyle |= LVS_SINGLESEL; //设置单选属性
lStyle |= LVS_EDITLABELS; //可以编辑标签
lStyle |= LVS_REPORT; //设置为报表样式
lStyle |= LVS_SORTASCENDING; //升序排列
lStyle |= LVS_ALIGNLEFT; //左对齐
CListCtrl * pListCtrl = (CListCtrl *)GetDlgItem(IDC_LISTCTRL);
long lNewStyle = GetWindowLong(pListCtrl->m_hWnd,GWL_STYLE);
lNewStyle &= ~lMask;
lNewStyle = lNewStyle | lStyle;
6 以指定样式重新创建ListCtrl控件,并设置该控件的图标列表。
CRect rect;
GetClientRect(&rect);
pListCtrl->DestroyWindow();
pListCtrl->Create(lNewStyle,rect,this,IDC_LISTCTRL); //创建列表视图控件
pListCtrl->SetImageList(m_pImageList,LVSIL_SMALL); //设置列表视图控件的图标列表
7 定义列表视图的列并向列表视图里添加内容
TCHAR rgtsz[2][10];
_tcscpy(rgtsz[0],_T("书名"));
_tcscpy(rgtsz[1],_T("作者"));
TCHAR rgtszIconType[4][12];
_tcscpy(rgtszIconType[0],_T("vc++技术内幕"));
_tcscpy(rgtszIconType[1],_T("windows程序设计"));
_tcscpy(rgtszIconType[2],_T("c++ primer"));
_tcscpy(rgtszIconType[3],_T("深入浅出MFC"));
TCHAR rgtszIconDescrip[4][50];
_tcscpy(rgtszIconDescrip[0],_T("David Kruglinski"));
_tcscpy(rgtszIconDescrip[1],_T("CharlesPetzold"));
_tcscpy(rgtszIconDescrip[2],_T("Lippman"));
_tcscpy(rgtszIconDescrip[3],_T("侯捷"));
//定义列表视图的列
int i;
LV_COLUMN lvcolumn;
for(i=0; i<2; i++)
{
lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
lvcolumn.fmt = LVCFMT_LEFT;
lvcolumn.pszText = rgtsz[i];
lvcolumn.iSubItem = i;
lvcolumn.cx = rect.Width()/2;
pListCtrl->InsertColumn(i,&lvcolumn);
}
//向列表视图里添加内容
int iItem, iSubItem, iActualItem, iIcon;
LV_ITEM lvitem;
for(iItem=0; iItem<4; iItem++)
{
for(iSubItem=0; iSubItem<2; iSubItem++)
{
lvitem.mask = LVIF_TEXT | (iSubItem == 0? LVIF_IMAGE: 0);
lvitem.iItem = (iSubItem == 0)? iItem: iActualItem;
lvitem.iSubItem = iSubItem;
lvitem.pszText = iSubItem == 0? rgtszIconType[iItem]:rgtszIconDescrip[iItem];
lvitem.iImage = iItem;
//判断,如果是添加第列,则应该添加一行,否则只要设置这一行即可
if(0 == iSubItem)
iActualItem = pListCtrl->InsertItem(&lvitem);
else
pListCtrl->SetItem(&lvitem);
}
}
8 设置ListCtrl控件具有CheckBox。
pListCtrl->SetExtendedStyle(LVS_EX_CHECKBOXES);
9 添加对话框WM_DESTROY消息的响应函数,并在其中销毁动态创建的CImageList对象。
delete m_pImageList;
m_pImageList = NULL;
10 添加ListCtrl控件的NM_DBLCLK事件响应函数,在该响应函数中判断当前选中行的索引,并输出到IDE环境。
CListCtrl * pListCtrl = (CListCtrl *)GetDlgItem(IDC_LISTCTRL);
CString str;
for(int i=0; i<pListCtrl->GetItemCount(); i++ )
{
if( pListCtrl->GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || pListCtrl->GetCheck(i))
{
str.Format(_T("第%d行的checkbox为选中状态/n"), i);
TRACE(str);
}
}
11 ListCtrl控件的使用效果如图:
双击“C++ Primer”,IDE输出窗口输出: