您的位置:首页 > 其它

CListCtrl 部分用法

2014-05-07 10:56 162 查看
列表控件 CListCtrl

#include <afxcmn.h>

CListCtrl m_List;

1.关联对象与控件ID

用SubclassDlgItem关联,第一个参数是要关联控件的ID,第二个是指向父窗口的指针

例:

m_List.SubclassDlgItem(IDC_EDIT1,this);

2.设置列表第一项为含有复选框的列

SetExtendedStyle用来设置列表的风格,要达到含有复选框的效果,采用LVS_EX_CHECKBOXES风格就可以了

例:

m_List.SetExtendedStyle(LVS_EX_CHECKBOXES);

例:

m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT);

下面还有一些别的风格

LVS_EX_HEADERDRAGDROP 允许拖放的列表视图控件中的列重新排序

LVS_EX_FULLROWSELECT 选中某行整行高亮

LVS_EX_TRACKSELECT 鼠标经过时自动选择该项

LVS_EX_GRIDLINES 显示网格

3.添加列

int InsertColumn(int nCol, LPCTSTR lpszColumnHeading,int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1);

第一个参数是标记添加的是第几列

第二个参数是该列显示的字符串

第三个参数是字符串的风格

第四个参数是该列的长度(就是这一列由多宽)

例:

m_List.InsertColumn(0,"第一列",LVCFMT_LEFT,50);

m_List.InsertColumn(1,"第二列",LVCFMT_LEFT,30);

4.添加行

int InsertItem(int nItem, LPCTSTR lpszItem);

第一个参数是要添加在第几行

第二个参数是该行第'0'列要显示的字符串

BOOL SetItemText(int nItem, int nSubItem, LPCTSTR lpszText);//设置某行某列显示的字符串

第一个参数是第几行

第二个参数是第几列(从0开始数)

第三个参数是要显示的字符串

例:

m_List.InsertItem(0,"第0行第0列");

m_List.SetItemText(0,1,"第0行第1列");

5.得到某行某列数据

int GetItemText(int nItem, int nSubItem, LPTSTR lpszText, int nLen);//得到某行某列的字符串

第一个参数是第几行

第二个参数是第几列

第三个参数是字符串保存在哪里

第四个参数是保存位置的大少

例:

char buff[32];

m_List.GetItemText(2,3,buff,sizeof(buff));//获得第三行第四列的信息,保存到buff中

5.遍历复选框被选中的行

int GetItemCount();//得到一共有多少行

BOOL GetCheck(int nItem);//得到某行的复选框是否被选中,选中返回1,否则返回0

例:

int i;

for(i=0;i<m_List.GetItemCount();i++)

{

if(m_List.GetCheck(i))

{

//要做的处理

}

}

6.响应单击(双击)列表中某列

要先在消息映射表中添加

ON_NOTIFY(NM_CLICK,IDC_LIST,OnLclickList)

第一个是窗口收到的消息(单击收到的信息为NM_CLICK,左键双击收到的信息时NM_DBLCLK)

第二个是被单击的控件ID

第三个是响应这单击该控件的函数

OnLclickList是自定义函数

BOOL OnLclickList(NMHDR* pNMHDR, LRESULT* pResult)

{

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

int nItem = pNMListView->iItem;//得到鼠标单击在哪一行

if(nItem<0)

return 0;

//处理单击事件的代码

}

7.设置选中列表中某行

BOOL SetItemState(int nItem, UINT nState, UINT nMask);

第一个参数是第几行

第二个参数表示要设置的新状态,如果传入0值,表示去除当前被设置的,第三个参数所标明的那几种状态,

如果传入的与第三个参数的值相同,则表示要设置在第三个参数处所标明的那几种状态

第三个参数指明了要设置或去除哪几种状态(由第二个参数的值决定)

//设置第二行被选中

ctlList.SetItemState(1,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);

//把第二行被选中这个状态去掉(相当于第二行不被选中)

ctlList.SetItemState(1,0,LVIS_SELECTED|LVIS_FOCUSED);

8.在列表中插入编辑框(本质是用一个编辑框覆盖双击的某项)

要加的成员:

int m_Row; //记录点击的是第几行

int m_Col; //记录点击的是第几列

CEdit m_Edit;

要重载的函数:

afx_msg BOOL LButtonDblClk(NMHDR* pNMHDR,LRESULT* pResult);
//响应双击

要在消息映射表中添加:

ON_NOTIFY(NM_DBLCLK,IDC_LIST1,LButtonDblClk)
//双击

窗口初始化时先创建一个编辑框,并隐藏它

RECT rect;

rect.bottom = rect.left = rect.right = rect.top = 0;

m_Edit.Create(ES_LEFT|ES_AUTOHSCROLL|WS_BORDER|WS_VISIBLE|WS_CHILD|WS_TABSTOP,rect,&m_List,IDC_MYEDIT);

m_Edit.ShowWindow(0);

注意这里把列表控件作为编辑框的父窗口,下面代码中会有解释。

下面是响应双击事件的函数

BOOL CMainDialog::LButtonDblClk(NMHDR* pNMHDR,LRESULT* pResult)

{

//获取双击的位置

DWORD dwPos = GetMessagePos();

CPoint point(LOWORD(dwPos),HIWORD(dwPos));

//把point转换为相对于列表控件的数据

m_List.ScreenToClient(&point);

LVHITTESTINFO hi;

hi.pt = point;

hi.flags = LVHT_ABOVE;

//SubItemHitTest可以根据LVHITTESTINFO中的pt成员得到坐标指向第几行第几列

if(m_List.SubItemHitTest(&hi) != -1)

{

m_Row = hi.iItem;

m_Col = hi.iSubItem;

CRect rect;

m_List.GetSubItemRect(hi.iItem,hi.iSubItem,LVIR_BOUNDS,rect);

//因为当双击的是第0列时,GetSubItemRect会以为要得到整行得矩形大小,而不是第0列矩形的大小

//所以要手动改一下数据

if(m_Col == 0)

{

int width = m_List.GetColumnWidth(0);

rect.right = rect.left+width;

}

m_Edit.SetWindowText(m_List.GetItemText(hi.iItem,hi.iSubItem));

//在这里解释一下为什么要把列表控件设为编辑框的父窗口

//因为上面GetSubItemRect得到的矩形位置是相对于列表控件的

//如果编辑框的父窗口不是列表控件,那么下面的MoveWindow会把编辑框移动到相对于主窗口的rect的位置

//而不是你想要放到的位置

m_Edit.MoveWindow(&rect);

m_Edit.SetFocus();

m_Edit.ShowWindow(1);

}

return 0;

}

这个函数只负责出现编辑框,还要写一个保存编辑框上内容到列表对应项的函数,这里就不写出来了

以上内容部分参考 http://blog.csdn.net/artechtor/article/details/2508070
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: