CListCtrl控件详解(二)

8、得到选中的所有行
//方法一:
CString str;
for(int i=0;i < m_ListCtrl.GetItemCount(); i++)
{
if(m_ListCtrl.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
{
str.Format(_T(“选中了第%d行”), i);
AfxMessageBox(str);
}
}
//方法二:
POSITION pos=m_ListCtrl.GetFirstSelectedItemPosition();
if(pos==NULL)
TRACE0(“No items were selected!\n”);
else
{
while(pos)
{
int nItem=m_ListCtrl.GetNextSelectedItem(pos);
TRACE1(“Item %d was selected!\n”, nItem);
//添加其他操作
}
}
9、得到所有行的checkbox的状态
获取与设置Check:GetCheck、SetCheck。使用前需要设置控件属性SetExtendedStyle(LVS_EX_CHECKBOXES);使控件有勾选功能
CString str;
for(int i=0; i< m_ListCtrl.GetItemCount(); i++)
{
if(m_ListCtrl.GetCheck(i))
{
str.Format(_T(“第%d行的checkbox为选中状态”), i);
AfxMessageBox(str);
}
}
10、获得item的信息
获得第一行第一列上的数据:CString str = m_ListCtrl.GetItemText(0, 0);
获得item的更多信息: TCHAR szBuf[1024];
LVITEM lvi;
lvi.iItem = 0;
lvi.iSubItem = 1;
lvi.mask = LVIF_TEXT;
lvi.pszText = szBuf;
lvi.cchTextMax = 1024;
m_ListCtrl.GetItem(&lvi);
11、获得所有列的header字符串内容即标题
LVCOLUMN lvcol;
TCHAR str[256];
int nColNum;
CString strColumnName[3];//假如有3列
nColNum = 0;
lvcol.mask = LVCF_TEXT;
lvcol.pszText = str;
lvcol.cchTextMax = 256;
while(m_ListCtrl.GetColumn(nColNum, &lvcol))
{
strColumnName[nColNum] = lvcol.pszText;
nColNum++;
}
12、使一项可见,即滚动滚动条
m_ListCtrl.EnsureVisible(i, FALSE);
13、获得所有行数、列数
获得所有行数:m_listctrl.GetItemCount( );
获得所有列数:int nHeadNum=m_ListCtrl.GetHeaderCtrl()->GetItemCount();
14.删除操作
删除指定列:DeleteColumn
删除指定行:DeleteItem
删除所有行:DeleteAllItems
删除所有列:
方法一:
while(m_ListCtrl.DeleteColumn(0));
//因为你删除了第一列后,后面的列会依次向上移动。
方法二:
int nColumns = 3; //列数
for(int i=nColumns-1; i>=0; i–)
m_ListCtrl.DeleteColumn(i);
删除多行或者多列:
注意要从后面开始删起,比如,如果我想删除第一行和第二行,应该:
m_listctrl.DeleteItem(1);
m_listctrl.DeleteItem(0);
而不能:
m_listctrl.DeleteItem(0);
m_listctrl.DeleteItem(1);
因为每次删除一行或者一列,后面的索引号都要变化,所以从后面开始删除就没关系.
如果用for循环,应该递减:
For(int k=m_listctrl.GetItemCount( );k>=-1;k++)
m_listctrl.DeleteItem(k);
上面是删除所有行,当然也可以用CListCtrl::DeleteAllItems
15、得到单击选中的行列号
例1:
添加listctrl控件的NM_CLICK消息相应函数
void CMyList::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码:
NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem!=-1)
{
CString strtemp;
strtemp.Format(L”单击的是第%d行第%d列”,pNMListView->iItem, pNMListView->iSubItem);
AfxMessageBox(strtemp);
}
*pResult = 0;
}
例2:
int CurrentRow;
CurrentRow = m_ListCtrl.GetSelectionMark();
if(!(m_ListCtrl.GetItemState(CurrentRow,LVIS_SELECTED) == LVIS_SELECTED))
{
MessageBox(“没有选中行.”,”提示”,64);
}
16、得到checkbox选中的行号
有时需要在item前面添加一个CheckBox,供用户选择,然后对所有选中项进行处理。 这里涉及到两个问题:第一个,如何添加CheckBox风格;第二个,如何判断某一行的CheckBox状态是否发生改变。对于第一个问题,在基本操作里已经有所阐述了,即通过SetExtendedStyle函数添加LVS_EX_CHECKBOXES扩展风格。
这里重点探讨第二个问题,首先,操作复选框状态的有两个函数:
BOOL GetCheck(int nItem)——-获取复选框状态
BOOL SetCheck( int nItem, BOOL fCheck = TRUE )——-设置复选框状态
其次,我们要搞清楚以下四点:
① 当列表的项item改变时,控件会向父窗口发送LVN_ITEMCHANGED消息,因此可以在LVN_ITEMCHANGED消息的响应函数中对复选框的状态进行处理(查询或设置)。
② 鼠标点击CheckBox时,消息的顺序是 NM_CLICK —> LVN_ITEMCHANGED,即CheckBox的状态是在 NM_CLICK消息函数结束后才会发生变化,在NM_CLICK中使用GetCheck无效。
③ 鼠标点击Item(非CheckBox区域)时,消息的顺序是 LVN_ITEMCHANGED —> NM_CLICK。
④ 调用InsertItem 函数时,也会产生LVN_ITEMCHANGED消息。鉴于此,通常会自定义一个BOOL型变量m_bHit 来判断是点击操作还是插入操作,该变量初始赋FALSE,当有鼠标点击item时赋TRUE, 检测完是否有CheckBox被点击后重新复位为FALSE。
void CMyList::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem!=-1)
g_iItemIndex = pNMListView->iItem;
*pResult = 0;
}
void CMyList::OnLvnItemchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
if(GetCheck(g_iItemIndex))
{
CString str;
str.Format(L”第%d个checkox被选择”, g_iItemIndex);
MessageBox(str);
}

*pResult = 0;

}

转载改编自:http://www.xuebuyuan.com/2122805.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值