一、
1、编辑对话框
2、编辑位图
三、添加变量
四、添加代码(红色部分)
BOOL CCListCtrlDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
//创建列表视图窗口
m_imagelist.Create(24,24,ILC_COLOR24|ILC_MASK,1,0);
//向图像列表中添加图标
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON3));
//将图像列表关联到列表视图控件中
m_list.SetImageList(&m_imagelist,LVSIL_NORMAL );
//向列表视图中添加数据
m_list.InsertItem(0,"长江",0);
m_list.InsertItem(1,"黄河",1);
m_list.InsertItem(2,"泰山",2);
return TRUE; // return TRUE unless you set the focus to a control
}
五、编译
六、运行
七、函数说明
1、CListCtrl::SetImageList函数说明
CImageList* SetImageList(CImageList*pImageList,int nImageListType)
pImageList:图像列表指针
nImageListType:标识图像列表类型
功能:关联图像列表控件和列表视图。返回值指向上一个图像列表指针。
图像列表类型 说明
LVSIL_NORMAL 大图标图像列表
LVSIL_SMALL 小图标图像列表
LVSIL_STATE 状态图标图像列表
2、CListCtrl::InsertItem函数声明
int InsertItem(const LVITEM*pItem)
int InsertItem(int nItem,LPCTSTR lpszItem)
int InsertItem(int nItem,LPCTSTR lpszItem,int nImage)
pItem:一个LVITEM*结构指针
nItem:
lpszItem:
nImage:
功能:向列表视图控件中插入视图项。创建成功个则返回新添加项的索引;否则返回“-1”
二、
三、添加变量
四、添加代码(红色部分)
BOOL CCListCtrlDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE);
m_list.InsertColumn(0,"姓名",LVCFMT_LEFT,40);
m_list.InsertColumn(1,"性别",LVCFMT_LEFT,40);
m_list.InsertColumn(2,"年龄",LVCFMT_LEFT,40);
m_list.InsertColumn(3,"部门",LVCFMT_LEFT,40);
m_list.InsertItem(0,"长江");
m_list.InsertItem(1,"黄河");
m_list.InsertItem(2,"泰山");
CString str1,str2,str3;
str1="男";
str2="25";
str3="人事";
m_list.SetItemText(0,1,str1);
m_list.SetItemText(0,2,str2);
m_list.SetItemText(0,3,str3);
return TRUE; // return TRUE unless you set the focus to a control
}
五、编译
六、运行
在MFC的对话框模式下使用CListCtrl控件,其实不管在SDK或文档/视图模式下,VC控件的使用都差不多,下面来好好的写写CListCtrl控件的使用笔记。
一、CListCtrl控件的创建
由于我是在MFC的对话框模式下使用CListCtrl控件的,所以只需要在控件栏上选择CListCtrl的图形按钮,接着添加到对话框中就行了。
二、CListCtrl控件样式的设置
第一步:在使用CListCtrl控件之前,首先需要为该控件关联一个变量(只针对于对话框模式):
CListCtrl m_BlogAccountList;
第二步:由于CListCtrl控件要做一些初始化操作,比如设置控件样式,设置控件的行列并填入一些数据。初始化操作的代码是在对话框的OnInitDialog事件中写入的。
默认情况下,CListCtrl控件的样式是非常简陋的,大多情况下我们都需要对CListCtrl控件的样式进行修改,比如设置为报表样式,可以进行整行选择等,如有需要还有调整CListCtrl控件的行高。诸如这些设置都需要用到CListCtrl控件的扩展样式,所以首先得了解这些扩展样式。
我在MSDN中没有找到CListCtrl控件的扩展样式资料,只好上百度百科找了找。
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//多工作区
对话框模式下创建的CListCtrl控件样式只有一个,就是WS_BORDER,而我需要为CListCtrl设置为报表样式,并能选择整行,下面就可以开始写代码了:
//通过GetWindowLong来获取CListCtrl已有的样式
DWORD dwStyle = GetWindowLong(m_BlogAccountList.m_hWnd, GWL_STYLE);
//在原有样式的基本上,添加LVS_REPORT扩展样式
SetWindowLong(m_BlogAccountList.m_hWnd, GWL_STYLE, dwStyle|LVS_REPORT);
//获取已有的扩展样式
DWORD dwStyles = m_BlogAccountList.GetExStyle();
//取消复选框样式
dwStyles &= ~LVS_EX_CHECKBOXES;
//添加整行选择和表格线扩展样式
m_BlogAccountList.SetExtendedStyle(dwStyles|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
通过以上四句代码,就已经能满足我的需求了。
三、为CListCtrl控件添加列
列的添加只需要用到LVCOLUMN结构体,所以需要先行了解了解。在MSDN中查到的LVCOLUMN结构体的定义如下:
typedef struct _LVCOLUMN {
UINT mask;
int fmt;
int cx;
LPTSTR pszText;
int cchTextMax;
int iSubItem;
#if (_WIN32_IE >= 0x0300)
int iImage;
int iOrder;
#endif
} LVCOLUMN, FAR *LPLVCOLUMN;
该结构体共有8个成员。
mask是用来设置LVCOLUMN结构体中哪些成员有效,其值可以为0。mask可设置的值如下:
LVCF_FMT fmt成员有效
LVCF_IMAGE iImage成员有效
LVCF_ORDER //以下略
LVCF_SUBITEM
LVCF_TEXT
LVCF_WIDTH
fmt成员是对CListCtrl控件列标题进行设置,比如列标题中文字的对齐方式,是否在列标题中显示图标等。
cx成员是设置列宽。
pszText成员是设置列标题文字
cchTextMax成员是设置标题文字的缓冲区大小
iSubItem成员是设置列索引
iImage成员是设置ImageList中的图像索引。
iOrder成员的作用未知。
下面进行添加列操作:
char *szColUmn[] = {"帐号", "密码"};
int nColWidth[] = {100, 100};
LVCOLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_ORDER;
lvc.fmt = LVCFMT_LEFT; //左对齐
for (int i = 0; i < 2; i++)
{
lvc.pszText = szColUmn[i];
lvc.iSubItem = i;
lvc.iOrder = i;
lvc.cx = nColWidth[i];
m_BlogAccountList.InsertColumn(i, &lvc);
}
四、为CListCtrl控件添加行
添加行的操作需要用到InsertItem和SetItemText属性,这个简单,就不详述了,看代码:
m_BlogAccountList.InsertItem(0, "abc");
m_BlogAccountList.SetItemText(0, 1, "abc");
m_BlogAccountList.SetItemText(1, 1, "123");
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tg2003/archive/2009/04/09/4060322.aspx
CListCtrl是列表控件类,列表控件的每一行叫做一个item,每一列叫做一个subitem。每一行和每一列都有个ID号,可以确定唯一的单元格。
最近使用了这个控件,有心得总结如下:
(Dialog模式)
1. 创建列表控件.
定义一个成员变量:CListCtrl *m_pListCtrl;
在初始化对话框的时候创建列表,也就是在OnInitDialog()中创建(在哪里创建没有规定,只要符合对象和资源创建的规则即可。)
m_pListCtrl=new CListCtrl();
m_pListCtrl->Create();
m_pListCtrl->SetExtendedStyle();
Create函数有四个参数,DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID 。第一个参数可以是一些值的组合,用来定义列表的样式,这些值MSDN有详细说明,我只举一个简单的例子,更多的查看MSDN。例如第一个参数使用LVS_REPORT,则表示列表有标题,或者说有列头,很多其他的样式必须是和这个样式搭配使用才有效。第二个参数是列表的坐标和大小,这个矩形框就表示列表的矩形框。第三个参数表示这个列表的父类,如果列表在对话框上或者是在试图上,这个参数可以是this。第四个参数是列表的资源号。
SetExtendedStyle函数只有一个参数,是一些值的组合,用来设置列表的扩展样式,这些值MSDN有详细的说明,我只介绍两个比较常用的。 LVS_EX_GRIDLINES :列表显示网格,只适用于LVS_REPORT 风格。LVS_EX_FULLROWSELECT:当一个item被选中时,它的所有subitems也处于被选中状态,点击任意一个subitem,则可同时选中整个行. 只适用于LVS_REPORT 风格。
2.构建列表
构建列表也就是两个操作,插入列和插入行,前面说过,一个列就是一个subitem,一行就是一个item。
m_pListCtrl->InsertColumn(0,"第一列");
列索引从0开始,InsertColumn函数将在列表中建立一个列,如果数据有三列,就调用三次此函数,索引分别是0,1,2。
m_pListCtrl->InsertItem(0,"第一行");
行索引也从0开始,InsertItem函数在列表中建立一行,且“第一行”的字样显示在的一列中,其他各列为空,如果要在除第一列以外的列中插入数据,调用SetItemText()函数,这个函数有三个参数,第一个参数表示要在第几行插入,第二个参数表示要在第几列插入,第三个参数表示要插入的内容。
可以设定列宽:
LVCOLUMN lvcolumn;
m_pListCtrl->GetColumn(0,&lvcolumn);
lvcolumn.mask=LVCF_WIDTH;
lvcolumn.cx=335;
m_pListCtrl->SetColumn(0,&lvcolumn);
表示将列宽设定为335像素。
3.操作列表
这里主要介绍一个比较有用的函数SubItemHitTest()
当鼠标停留在列表框上时,此函数会返回鼠标所在的行号,和鼠标所在的列号。
LVHITTESTINFO linfo;
DWORD dwPos = GetMessagePos();
CPoint point(LOWORD(dwPos),HIWORD(dwPos));
m_pListCtrl->ScreenToClient(&point);
linfo.pt=point;
linfo.flags=LVHT_ABOVE;
int iItem=m_pListCtrl->SubItemHitTest(&linfo);
行号保存在linfo.iItem中,列号保存在linfo.iSubItem中,此时可以调用GetItemText()函数获得这个单元格的内容了。
这个方法常用在列表的NM_CLICK和NM_DBLCLK事件中。
此类消息为:
ON_NOTIFY(NM_CLICK, IDC, OnFun)
函数原型:
void OnFun(NMHDR *pNMHDR, LRESULT *pResult)
{
*pResult = 0;
}
4.列表中的CheckBox
列表有多中风格,带CheckBox是其中常见的一种,设置这种风格的列表只需要在调用SetExtendedStyle函数的时候设置LVS_EX_CHECKBOXES。对CheckBox最常见的操作就是选中和取消,可能是我的知识贫乏,到目前,我还没有找到专门的消息处理这两个操作。要处理这样的操作,我使用下面的方法。
响应列表的NM_CLICK消息,在这个消息处理函数中,判断鼠标点击的位置是文本还是CheckBox,代码如下:
UINT nFlag;
DWORD dwPos = GetMessagePos();
CPoint point(LOWORD(dwPos),HIWORD(dwPos));
m_pList1->ScreenToClient(&point);
m_pList1->HitTest ( point , &nFlag ) ;
如果nFlag==LVHT_ONITEMSTATEICON ,说明鼠标点中了CheckBox。本可以调用GetCheck函数来获得CheckBox的状态,但是很可惜,CheckBox的状态似乎是在NM_CLICK消息函数结束以后才会改变。所以,在NM_CLICK的消息处理函数中获得CheckBox的状态是没有改变之前的。
还有一点需要注意,假设现在目前CheckBox的状态是选中,那么,当你点击两下鼠标的时候,CheckBox还是选中状态,而且NM_CLICK消息处理函数被执行了两次,所以,结果是正确的。但是当你点击两下鼠标时速度比较快,那么系统会把两次单击鼠标看作一次双击,这样,NM_CLICK的消息处理函数只会执行一次,但是,注意但是,CheckBox的状态却改变了两次。因此,这个时候你看到的CheckBox的状态和程序的结果就相反了。要解决这个问题,就需要在NM_DBLCLK的消息函数中做相应的工作。
以上若有不足之处,希望各位高手指正。
2009/04/01补充:
禁止列表头调整大小,需要派生一个CListCtrl类,重载一下函数为:
BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
HD_NOTIFY *pHDN = (HD_NOTIFY*)lParam;
switch (((NMHDR*)lParam)->code)
{
case HDN_BEGINTRACKW:
case HDN_BEGINTRACKA:
case HDN_DIVIDERDBLCLICKA:
case HDN_DIVIDERDBLCLICKW:
*pResult = TRUE; // disable tracking
return TRUE;
}
return CListCtrl::OnNotify(wParam, lParam, pResult);
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bwmwm/archive/2007/08/22/1754270.aspx
1。先来介绍REPORT类型的CListCtrl:
首先使用下面的语句设置CListCtrl的style:
DWORD SetExtendedStyle( DWORD dwNewStyle );
其中
LVS_EX_CHECKBOXES 表示添加CheckBox
LVS_EX_FULLROWSELECT 表示选择整行
LVS_EX_GRIDLINES 表示添加表格线
如果设置了LVS_EX_CHECKBOXES属性,则可以用
BOOL GetCheck( int nItem ) const;
来得到某一行是否Checked。
可以先用下面的语句来删除以前的东西:
for(int k=2;k>=0;k--) //注意要从后往前删,否则出错
m_ListCtrl.DeleteColumn(k);
m_ListCtrl.DeleteAllItems();
用下面的语句新建列:
m_ListCtrl.InsertColumn(0,_T("文件名"),LVCFMT_IMAGE|LVCFMT_LEFT);
m_ListCtrl.InsertColumn(1,_T("仪器类别"));
m_ListCtrl.InsertColumn(2,_T("项目类别"));
其中LVCFMT_IMAGE表示可以在第一列加入图标。如果不要图标可以删去。
然后设置列宽:
for(j=0;j<3;j++)
m_ListCtrl.SetColumnWidth(j ,100);
以下为列表加入图标,如果不需要图标,可以跳过这一步。注意只在第一次加入,如果多次加入会出错!
先在头文件中加入声明:
CImageList m_ImageList;
这是必要的,如果在cpp的某个函数中加入由于生命期结束,CImageList自动释放,则效果是列表中看不到图标,只看到一个白方块。
下面生成CImageList,并将其绑定到CListCtrl中,这是CImageList中还没有图标,只是一个容器:
static int flag=2;
if(flag==2){//只调用一次SetImageList,否则出错
m_ImageList.Create(128, 128, ILC_COLORDDB|ILC_MASK, 20, 1);
m_ListCtrl.SetImageList(&m_ImageList,LVSIL_SMALL);
}
flag=(flag+1)%2;
如果CListCtrl已经用过,曾经加过图标进去,这时就要删除上次放进m_ImageList中的Image
for(int kk=0;kk<m_ImageList.GetImageCount();kk++)
m_ImageList.Remove(k);
下面介绍如何向CListCtrl里面加入行,并同时为每一行动态加入图标:
假设m_listRowCount为要加入的行数。
CBitmap* bitmap;
bitmap=new CBitmap[m_list1rowCount];
HBITMAP hbitmap;
for(int i = 0; i < m_listRowCount; i++)
{
//为每一行插入相应的缩略图
CFile f;
CFileException e;
if( !f.Open(m_FileName, CFile::modeRead, &e )){ //m_FileName为bmp文件名,由你来定
hbitmap = (HBITMAP)LoadImage(NULL,path+"blank.bmp",IMAGE_BITMAP,0,0,
LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
}else{
f.Close();
hbitmap = (HBITMAP)LoadImage(NULL,bmpFile,IMAGE_BITMAP,0,0,
LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
}
bitmap[i].Attach(hbitmap);
m_ImageList.Add(&bitmap[i], RGB(0, 128, 128));
//插入行
m_ListCtrl.InsertItem(i,m_FileName,i);
m_ListCtrl.SetItemText(i,1,type);
m_ListCtrl.SetItemText(i,2,m_Path);
}
//记得删除已经没用的临时文件
if(m_list1rowCount!=0)
delete[] bitmap;
2。如果是ICON类型的CListCtrl,则要做一点点改动:
把绑定图标集的代码由
SetImageList(&m_ImageList,LVSIL_SMALL);
改为
SetImageList(&m_ImageList,LVSIL_NORMAL);
插入行时只用
InsertItem(i,mainSet.m_FileName,i);
不用
SetItemText(i,1,type);
之类的代码。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fairness/archive/2005/03/07/314051.aspx
InsertColumn
函数属于CListCrl类中的。
位于vc安装目录的vc/atlmfc/include路径下。
函数功能:在报告模式下插入一列
函数原型:int InsertColumn(int nCol, const LVCOLUMN* pColumn);
int InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1);
参数: nCol表示要插入列的列号。
pColumn 为新建列属性的LVCOLUMN结构的地址。
对于第二种函数重载,参数lpszcolumnHeading 为列标题的字符串的地址,所以可以使用一个字符串,比如 "姓名"。
nFormat 指定列对齐方式的整数,缺省值是左对齐。它可以为下列值之一:LVCFMT_LEFT,LVCFMT_RIGHT或LVCFMT_CENTER。
nWidth 以像素为单位的列宽。缺省值为-1,表示没有设置列宽。
nSubItem 与列相关联的子项的索引。缺省值为-1,表示没有子项与列相关。