一、风格
CListCtrl有四种风格:
LVS_ICON //大图标
LVS_SMALLICON //小图标
LVS_LIST //列表
LVS_REPORT //详细资料,最常用的就是这种风格了
风格设置在属性页可以直接设置,也可以用函数SetView来设置。
二、设置扩展风格
常见的扩展风格有:
LVS_EX_FULLROWSELECT:选中某项时,使该项所在的整行都高亮显示(只适用于LVS_REPORT风格)
LVS_EX_GRIDLINES:显示网格线(只适用于LVS_REPORT风格)
LVS_EX_CHECKBOXES:item前生成checkbox控件
LVS_EX_TRACKSELECT:当设置这种风格的时候,用户可以隔项选取
LVS_SINGLESEL:禁止用户一次选择多项
LVS_SHOWSELALWAYS:ListCtrl在失去焦点时,已选择的项仍处于高亮状态
示例代码如下:
DWORD dwStyle = m_list.GetExtendedStyle();//获得当前扩展风格
dwStyle |= LVS_EX_FULLROWSELECT;
dwStyle |= LVS_EX_GRIDLINES;
m_list.SetExtendedStyle(dwStyle); //设置扩展风格
1)插入列标题:InsertColumn
int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1 );
nCol:插入列的索引(index),从0开始。
lpszColumnHeading:插入列的标题。
nFormat:标志出该列的对齐方式。LVCFMT_LEFT(左对齐), LVCFMT_RIGHT(右对齐), LVCFMT_CENTER(居中)
nWidth:宽度,以像素为单位。默认值-1表示不设置宽度。
nSubItem:与列相关联的子项的索引。不知道这个参数有什么用,反正一般不设。
返回值:操作成功返回插入列的索引,否则返回-1.
m_list.InsertColumn(0,TEXT("姓名"));
m_list.InsertColumn(1,TEXT("学号"),LVCFMT_RIGHT,200);
m_list.InsertColumn(2,TEXT("成绩"),LVCFMT_CENTER);
2)插入行
2.1
int InsertItem( const LVITEM* pItem );
int InsertItem( int nItem, LPCTSTR lpszItem );
int InsertItem( int nItem, LPCTSTR lpszItem, int nImage );
int InsertItem( UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState, UINT nStateMask, intnImage, LPARAM lParam );
以上函数用于插入一个新的行,并且设置这个行的第一个字段(列)。常用的是第二和第三个。
nItem:标志出要插入行的索引。
lpszItem:该行第一个字段的标题。
nImage:表示该行的图标的索引。
返回值:操作成功返回插入行的索引,失败返回-1.
例:
m_list.InsertItem(0,TEXT("第一行"));
m_list.InsertItem(1,TEXT("第二行"));
若要设置行图标,首先需要一个CImageList对象。
CImageList m_ImageList;
m_ImageList.Create(16,16,0,2,2);//五个参数分别表示宽、高、图像的类型、图像列表初始可容纳图像的个数、当初始可容纳个数不够时,每次增加的个数
m_ImageList.Add(theApp.LoadIcon(IDI_ICON1));
m_ImageList.Add(theApp.LoadIcon(IDI_ICON2));
然后我们把CImageList和CListCtrl关联起来:
m_list.SetImageList(&m_ImageList,LVSIL_SMALL);
这样,当我们插入行的时候,会自动为该行用图像列表的第一个图标作为图标。
当然我们插入行的时候,也可以指定用第几个图标作为图标:
m_list.InsertItem(1,TEXT("第二行"),2);
2.2
BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );
该函数用来设置某一行的所有字段(列)。
nItem:要设置的行的索引。
nSubItem:要设置的字段(列)的索引。
lpszText:该字段的标题。
返回值:成功返回非0值,失败返回0。
例:
m_list.SetItemText(0,1,TEXT("第一行第二列"));
m_list.SetItemText(1,2,TEXT("第二行第三列"));
四、获取总列数。
int nColumn = m_list.GetHeaderCtrl()->GetItemCount();
五、获取总行数。
int nCount =m_list.GetItemCount();
六、获取当前选中行的索引。
int GetSelectionMark( );
返回当前选中行的索引,没有任何行选中返回-1.单行选择的时候,用这个函数很方便。
当列表是多行选择的时候:
POSITION pos = m_list.GetFirstSelectedItemPosition();
if (pos == NULL)
{
//没有选中任何行
}
else
{
while (pos)
{
int nItem = m_list.GetNextSelectedItem(pos);
//nItem就是选中的行了。
}
}
七、获取某行某列的内容
int GetItemText( int nItem, int nSubItem, LPTSTR lpszText, int nLen ) const;
CString GetItemText( int nItem, int nSubItem ) const;
nItem:行数
nSubItem:列数
lpszText:获取该行该列的内容的缓冲区。
nLen:上述缓冲去的大小。以字符数为单位。
第一个函数返回获取内容的大小(字符数),第二个函数返回获取的内容。
八、为某行绑定一个数据
BOOL SetItemData( int nItem, DWORD dwData );
nItem:行数。
dwData:一个32为的数值。该数值的含义任意,自己定义,也只有自己知道。
然后我们可以通过函数
DWORD GetItemData( int nItem ) const;
来获得这个值。根据这个值以及我们自己定义的含义,我们可以快速地知道该行的某些信息。
九、删除所有行和列。
m_list.DeleteAllItems();//删除所有行
while(m_list.DeleteColumn (0));//删除所有列。因为删除第”0“列后,后面的一列就自动变成了新的第”0“列,所以一个空循环即可解决。
十、为CListCtrl添加右键菜单。
右键该CListCtrl控件,在其控件事件列中找到NM_RCLICK,添加该事件。
void CXXXDlg::OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
if(pNMItemActivate->iItem != -1)
{
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu *pMenu=menu.GetSubMenu(0);
CPoint pos;
GetCursorPos(&pos);
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,this);
}
*pResult = 0;
}