CListCtrl 部分用法

来源:互联网 发布:卡巴斯基mac版激活码 编辑:程序博客网 时间:2024/05/22 08:11
列表控件 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

0 0