MFC控件之CListCtrl

1、点击选中某一行事件
CListCtrl:
OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)

使用类向导 添加此消息.
或者 手动绑定:

声明:
afx_msg void OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult);

绑定消息:
在BEGIN...END_MESSAGE_MAP 之间添加
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &你的类名::OnNMDblclkList1)//IDC_LIST1 替换成你的控件ID

实现:
void 你的类名::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
MessageBox("ok");
*pResult = 0;
}

 

2、不能选中一整行
m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);

 ================================================================================

=========================以下是控件用法补充========================================

1.动态生成列表控件。
在资源页面里,点击列表控件,然后在需要放置列表的地方拖拉就可以生成一个列表,查看它的属性->样式,可以设置它的样式,例如图标,小图标,列表,报告,单个选择,自动排列,没有标签换行,编辑标签 等等。
这种方法是静态生成列表控件,程序运行时列表就已经生成了,如果我们需要动态生成列表控件,让列表在我需要他生成的时候才生成,就要用CListCtrl::Create函数。
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
其中参数dwStyle用来确定列表控制的风格;rect用来确定列表控制的大小和位置;pParentWnd用来确定列表控制的父窗口,通常是一个对话框;nID用来确定列表控制的标识。其中列表控制的风格可以是下列值的组合:
 LVS_ALIGNLEFT 用来确定表项的大小图标以左对齐方式显示; 
LVS_ALIGNTOP 用来确定表项的大小图标以顶对齐方式显示; 
LVS_AUTOARRANGE 用来确定表项的大小图标以自动排列方式显示; 
LVS_EDITLABELS 设置表项文本可以编辑,
父窗口必须设有LVN_ENDLABELEDIT风格; 
LVS_ICON 用来确定大图标的显示方式; 
LVS_LIST 用来确定列表方式显示; 
LVS_NOCOLUMNHEADER 用来确定在详细资料方式时不显示列表头; 
LVS_NOLABELWRAP 用来确定以单行方式显示图标的文本项; 
LVS_NOSCROLL 用来屏蔽滚动条; 
LVS_NOSORTHEADER 用来确定列表头不能用作按钮功能; 
LVS_OWNERDRAWFIXED 在详细列表方式时允许自绘窗口; 
LVS_REPORT 用来确定以详细资料即报告方式显示; 
LVS_SHAREIMAGELISTS用来确定共享图像列表方式; 
LVS_SHOWSELALWAYS 用来确定一直显示被选中表项方式; 
LVS_SINGLESEL 用来确定在某一时刻只能有一项被选中; 
LVS_SMALLICON 用来确定小图标显示方式; 
LVS_SORTASCENDING 用来确定表项排序时是基于表项文本的升序方式; 
LVS_SORTDESCENDING 用来确定表项排序时是基于表项文本的降序方式;
以上的风格其实就是静态生成列表控件时 “属性->样式” 标签里的内容。如果列表控件创建完之后我们需要修改他的样式,就可以用GetWindowLong来获取CListCtrl已有的样式,然后用SetWindowLong来修改样式。
2.设置扩展样式。
除了上面的哪些基本样式,CListctrl还有更多的扩展样式,如果我们要添加或删除扩展样式,就不是像基本样式那样用SetWindowLong了,CListctrl提供了一个函数CListCtrl::SetExtendedStyle,这个函数可以添加或删除扩展样式,相应的要获得CListctrl的扩展样式,应该使用CListCtrl::GetExtendedStyle,而不是GetWindowLong。
DWORD SetExtendedStyle( DWORD dwNewStyle );
DWORD dwNewStyle 就是你要设置的样式咯,可以是以下值的组合(抄别人的不知道完不完整):
 CListCtrl控件的扩展样式
LVS_EX_GRIDLINES //绘制表格线
LVS_EX_SUBITEMIMAGES//子项目图标列表
LVS_EX_CHECKBOXES //带复选框
LVS_EX_TRACKSELECT //自动换行
LVS_EX_HEADERDRAGDROP//报表头可以拖拽
LVS_EX_FULLROWSELECT //选择整行
LVS_EX_ONECLICKACTIVATE//单击激活
LVS_EX_TWOCLICKACTIVATE//双击激活
LVS_EX_FLATSB//扁平滚动条
LVS_EX_REGIONAL
LVS_EX_INFOTIP
LVS_EX_UNDERLINEHOT
LVS_EX_UNDERLINECOLD
LVS_EX_MULTIWORKAREAS//多工作区


3.添加列 与 删除列
列表控件创建好之后,就要为他添加列了,使用CListCtrl::InsertColumn函数为它添加列。要删除一列,使用CListCtrl::DeleteColumn函数。
int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT, int nWidth = -1, intnSubItem = -1 );
iCol:为列的位置,从零开始
lpszColumnHeading:为显示的列名
nFormat:为显示对齐方式
nWidth:为显示宽度
nSubItem:为分配给该列的列索引。这个参数有什么作用至今不懂,希望懂的朋友告诉我。
例如:InsertColumn(3,"所在区域",LVCFMT_LEFT,60);即添加一个名字为“所在区域”的列,名字靠左排列,列的长度为60,这个列是第四列(从0开始算)。
4.添加行 与 删除行。
添加行即是添加记录咯,一行就是一条记录。使用CListCtrl::InsertItem函数来添加行。要删除一行,使用CListCtrl::DeleteItem函数,注意,如果你删除的行不是最后一行,那么删除后下面的行会自动上移填补删除行的空间。要删除全部行,使用CListCtrl::DeleteAllItems。
int InsertItem( int nItem, LPCTSTR lpszItem );
nItem :行的索引,从0开始计算。
lpszItem :行的名称,一般为0或者""(即不需要为行添加名称)。如果为他赋值一个字符串,实际效果是该字符串 会成为该行的第一列的内容。
例如 InsertItem( 5, 0) 即在行索引5的位置添加一行(即是第六行)。
5.设置某行某列的内容 与 获取某行某列的内容。
如果要设置某行某列的内容。使用CListCtrl::SetItemText函数。
BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );
nItem :行的索引,从0开始。
nSubItem :列的索引,从0开始。
lpszText :要填充的内容。
例如 SetItemText(6,3,"hello"); 即设置第7行,第4列的内容为“hello”。
相反地,如果我们要提取某行某列的内容,使用CListCtrl::GetItemText函数。
CString GetItemText( int nItem, int nSubItem ) const;
nItem :行的索引,从0开始。
nSubItem :列的索引,从0开始。
例如 CString text; text=GetItemText(6,3); 提取第7行,第4列的内容并赋给text。
6.获取一列的属性和设置一列的属性。
如果要获取某列的属性,譬如说某列的列名、列的长度。就要用CListCtrl::GetColumn函数。
BOOL GetColumn( int nCol, LVCOLUMN* pColumn ) const;
nCol :列的索引,从0开始。
pColumn :指向LVCOLUMN结构体的指针。该LVCOLUMN结构体就是用来保存得到的列属性信息的。
LVCOLUMN结构体有一个成员变量 mask ,你必须为这个变量赋值,用来指定你要获取什么属性,譬如说你要获取某列的长度,你就必须为mask赋值LVCF_WIDTH,如果你要获取某列的列名,就必须为mask赋值LVCF_TEXT。从MSDN中还有这样的描述:If the mask member specifies the LVCF_TEXT value, the pszText member must contain the address of the buffer that receives the item text and the cchTextMax member must specify the size of the buffer.
意思是说如果你要获取的属性是列名,就必须为LVCOLUMN结构体的pszText变量指定一个buf的地址,这个buf用来接收列名,还要为LVCOLUMN结构体的cchTextMax变量指定这个buf的大小。
下面的例子表示要获取第3列的列名和列长度:
 LVCOLUMN lvc;
  lvc.mask=LVCF_WIDTH | LVCF_TEXT;
  char name[20];
  lvc.pszText=name;
  lvc.cchTextMax=20;
  m_listctrl.GetColumn(2,&lvc);
成功获取属性信息的话长度就保存在LVCOLUMN lvc的cx变量里,列名就保存在char name[20]里,当然你也可以从LVCOLUMN lvc的pszText变量里得到列名,因为pszText变量保存了char name[20]的首地址。
如果要设置某列的属性,就要用CListCtrl::SetColumn函数。
BOOL SetColumn( int nCol, const LVCOLUMN* pColumn );参数意思和GetColumn一样,而SetColumn里的pColumn 参数保存了你将要设置的属性。下面的例子表示把第四列的列长度设置为50,列名设置为“销量”:
 LVCOLUMN lvc;
lvc.mask=LVCF_WIDTH | LVCF_TEXT;   
//同样的,你要设置什么属性,
就要先给mask变量赋值响应的标志。
lvc.pszText="销量";
lvc.cx=50;
m_listctrl.SetColumn(3,&lvc);


=========================================================================================

          CListCtrl控件

常用操作:
1、添加列标题头:InsertColumn
2、获取与设置列宽:GetColumnWidth、SetColumnWidth
3、添加一行:InsertItem、SetItemText
4、获取与设置单元文本:GetItemText、SetItemText
5、允许多行选中时,获取选中的行数:GetSelectedCount
6、单行选中时,获取选中的行:GetSelectionMark
7、选中某行:SetItemState(n, LVIS_SELECTED, LVIS_SELECTED);取消选中的行SetItemState(n,0,-1);使用此函数前需要先调用SetFocus();
8、获取某行的状态是否为选中:GetItemState(n, LVIS_SELECTED) == LVIS_SELECTED
9、删除所有行:DeleteAllItems
10、删除指定列:DeleteColumn
11、删除指定行:DeleteItem
12、获取与设置列表控件的背景色:GetBkColor、SetBkColor
13、获取与设置文字背景色:GetTextBkColor、SetTextBkColor
14、获取与设置文字前景色:GetTextColor、SetTextColor
15、获取与设置Check:GetCheck、SetCheck,使用前需要设置控件属性SetExtendedStyle(LVS_EX_CHECKBOXES);使控件有勾选功能
16、获取与设置图标列表:GetImageList、SetImageList
17、获取与设置行附加数据:GetItemData、SetItemData
18、获取与设置扩展风格样式:GetExtendedStyle、SetExtendedStyle
19、设置正行选中与网格线:SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
20、让ListCtrl支持编辑的功能:
①、将属性中的 Edit Labels 设置为 True;
②、响应控件的 LVN_EDNLABELEDIT 消息,添加如下代码:
CString strText;
m_ListCtrl.GetEditControl()->GetWindowText(strText);
m_ListCtrl.SetItemText(pDispInfo->item.iItem, pDispInfo->item.iSubItem, strText);

21、多行可选时,跳到第一个被选中的行,即使第一个被选中的行可视。

  POSITION pos = pView->GetListCtrl().GetFirstSelectedItemPosition();
  int nFirstSel = pView->GetListCtrl().GetNextSelectedItem(pos);
  if (nFirstSel != -1)
  {
   pView->GetListCtrl().EnsureVisible(nFirstSel,FALSE);
  } 

 

列表中添加图标代码:

 UINT nIconID[] = {IDI_ICON1,IDI_ICON2,IDI_ICON3,IDI_ICON4,IDI_ICON5};//图标ID
 m_ImageList.Create(16,16,ILC_COLOR24,sizeof(nIconID)/sizeof(UINT),0);//初始化CImageList类,sizeof(nIconID)/sizeof(UINT)为图标个数,后面的0表示CImageList在sizeof(nIconID)/sizeof(UINT)个图标个数的基础上可再添加多少个图标。
 m_ImageList.SetBkColor(RGB(255,255,255));//设置背景色为白色
 for(int i = 0; i < sizeof(nIconID)/sizeof(UINT); i++)
 {
  m_ImageList.Add(AfxGetApp()->LoadIcon(nIconID[i]));//将图标添加到CImageList
 }
 m_ListCtrl.SetImageList(&m_ImageList,LVSIL_SMALL);//设置列表控件显示图标

 m_ListCtrl.InsertColumn(0,_T("第1列"),0,100);
 m_ListCtrl.InsertColumn(1,_T("第2列"),0,100);
 m_ListCtrl.InsertColumn(2,_T("第3列"),0,100);
 m_ListCtrl.InsertItem(0,_T("数据1"),0);//后面的0表示添加CImageList中的第0个图标
 m_ListCtrl.InsertItem(1,_T("数据2"),1);//后面的1表示添加CImageList中的第1个图标
 m_ListCtrl.InsertItem(2,_T("数据3"),2);
 m_ListCtrl.SetItemText(0,1,_T("01"));
 m_ListCtrl.SetExtendedStyle(LVS_EX_CHECKBOXES);//设置控件有勾选功能
 DWORD dwStyle = m_ListCtrl.GetExtendedStyle();
 m_ListCtrl.SetExtendedStyle(dwStyle|LVS_EX_FULLROWSELECT);设置控件选中行的功能

MFC控件之CListCtrl_第1张图片

 

遍历文件夹并显示文件名与图标:

 CFileFind fileFind;
 CString szDir("D:\\Tools");
 BOOL bRet = fileFind.FindFile(szDir+"\\*.*");
 while(bRet)
 {
  bRet = fileFind.FindNextFile();
  if(fileFind.IsDots())
   continue;
  if(!fileFind.IsDirectory())
  {
   SHFILEINFO shfi;
   SHGetFileInfo(fileFind.GetFilePath(),FILE_ATTRIBUTE_NORMAL,&shfi,sizeof(shfi),SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME);
   int nImageID = m_ImageList.Add(shfi.hIcon);
   m_ListCtrl.InsertItem(m_ListCtrl.GetItemCount(),fileFind.GetFileName(),nImageID);
  }
 }

MFC控件之CListCtrl_第2张图片

 

复制列表内容

void CXXXView::OnCopydataToClipboard() 
{
 int nSelectCount = GetListCtrl().GetSelectedCount();
 int nSelect = -1;
 CString strData = _T("");
 for (int i = 0; i < nSelectCount; i++)
 {
  //找到选择的行号
  nSelect = GetListCtrl().GetNextItem(nSelect,LVNI_ALL | LVNI_SELECTED);
  //列数
  int nColumnCount = GetListCtrl().GetHeaderCtrl()->GetItemCount();
  for (int j = 0; j < nColumnCount; j++)
  {
   CString text;
   text = GetListCtrl().GetItemText(nSelect,j);
   if (j != 0)
    strData += "\t";
   strData += text;
  }
  //用\r\n来控制回车和换行
  if (i != nSelectCount - 1)
   strData += "\r\n";
 }
 
 //复制到剪贴板
 HGLOBAL clipbordBuf = GlobalAlloc(GMEM_DDESHARE,2*(strData.GetLength() + 1));
 TCHAR *pBuf = (TCHAR*)GlobalLock(clipbordBuf);
 lstrcpy((LPTSTR)pBuf,(LPCTSTR)strData);
 GlobalUnlock(clipbordBuf);

 OpenClipboard();
 EmptyClipboard();
 SetClipboardData(CF_TEXT,pBuf);
 CloseClipboard();
}

 

 

在非第一列中添加图标

m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_SUBITEMIMAGES);

 

m_List.SetItem(0,1,LVIF_TEXT|LVIF_IMAGE,“aaa”,0,0,0,0);//在第一行第二列加入第1个图标

m_List.SetItem(i,1,LVIF_TEXT|LVIF_IMAGE,szBuffer,i,0,0,0);

MFC控件之CListCtrl_第3张图片


你可能感兴趣的:(MFC控件之CListCtrl)