VC控件资料汇总--------列表控件 .

 一、

 

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_LEFTLVCFMT_RIGHTLVCFMT_CENTER

  nWidth 以像素为单位的列宽。缺省值为-1,表示没有设置列宽。

  nSubItem 与列相关联的子项的索引。缺省值为-1,表示没有子项与列相关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值