MFC List Control整行选中及其他相关技巧

在mfc使用List Control控件的大部分时间需要有整行选中的功能,这个时候可以通过设置其风格来实现。代码如下:

mydetector.SetExtendedStyle( LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES );//mydetector为List Control控件所绑定的变量对象,在设置风格之前,记得将控件的属性选择为report


可由下面代码添加列标及插入一行数据

mylocationlist.InsertColumn( 0, L"巡航路线", LVCFMT_LEFT,65 );// 插入第一列列标签65为标签宽度,LVCFMT_LEFT为对齐方式
mylocationlist.InsertColumn( 1, L"名称", LVCFMT_LEFT,65 );// 插入第二列列标签
int nRow = mylocationlist.InsertItem(1,L"HAH");// 插入行第一列数据
mylocationlist.SetItemText(nRow, 1, L"HAH");// 插入第二列数据

在列表框控件的NM_CLICK消息响应函数中添加以下代码,可得到单击选中列表项的值

LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
POSITION ps;
int nIndex;
ps=mylocationlist.GetFirstSelectedItemPosition();
nIndex=mylocationlist.GetNextSelectedItem(ps);//nIndex为选中的列表项Item值
*pResult = 0;


可通过下面代码删除指定项,结合上面代码可删除鼠标单击选定项

mylocationlist.DeleteItem(nIndex);


结合上面代码,可写出对列表框项进行上移下移的操作

CString myway=mylocationlist.GetItemText(mylistchoise,0);//<span style="font-family: Arial, Helvetica, sans-serif;">mylistchoise为选中的要上移的项的Item</span>
CString myname=mylocationlist.GetItemText(mylistchoise,1);
mylocationlist.DeleteItem(mylistchoise);//删除选中行
int nRow = mylocationlist.InsertItem(++mylistchoise,myway);//把列插入到选择项的上面一项,看起来就像是上移了一项
mylocationlist.SetItemText(nRow,1,myname);
下移同理

如果需要添加每一行的复选框,可以在初始化代码中设置控件的风格

DWORD dwStyle = mydriverspacelist.GetExtendedStyle(); 
dwStyle |= LVS_EX_CHECKBOXES; 

如果需要知道选中的复选框的状态,可以在 List Control 控件的LVN_ITEMCHANGED消息添加响应函数(双击该控件亦可自动添加)

void SavelocationDlg::OnLvnItemchangedListMydriverlist(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
	CString mychoiseitem;
	if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(1)) /* old state : unchecked */ 
	  && (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(2)) /* new state : checked */ 
	  ) 
	{ 
		mychoiseitem.Format(L"选中ITEM%d", pNMLV->iItem);
		MessageBox(mychoiseitem);
	} 
	else if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(2)) /* old state : checked */ 
	  && (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(1)) /* new state : unchecked */ 
	  ) 
	{ 
		mychoiseitem.Format(L"取消ITEM%d", pNMLV->iItem);
		MessageBox(mychoiseitem);
	} 
	*pResult = 0;
}

点击复选框

mydriverspacelist.SetCheck(0, 1);//设置第一行选中,如果第二个参数为0则为取消
获得复选框选择情况

mydriverspacelist.GetCheck(i);//获得第i行选择情况

获得指定行指定列的内容

CString s=m_list.GetItemText(i,j);i是行,j是列。m_list是个list control 对象







  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以使用以下代码来获取MFC ListControl选中的行: 1. 首先,获取ListControl控件的指针: CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_CONTROL); 2. 然后,使用以下代码来获取选中的行: POSITION pos = pListCtrl->GetFirstSelectedItemPosition(); if (pos != NULL) { int nItem = pListCtrl->GetNextSelectedItem(pos); // nItem就是选中的行号 } 注意:如果ListControl控件是多选的,那么可以使用GetNextSelectedItem()函数来获取下一个选中的行。 ### 回答2: MFC ListControlMFC 中比较常用的一个控件,通常用于显示表格形式的数据。而在 ListControl 中获取选中行是一个常见的操作,可以通过以下步骤实现: 1. 在资源编辑器中添加 ListControl 控件,并设置好其属性,例如设置为 Report 样式。 2. 在代码中定义 ListControl 对象,并在 OnInitDialog 函数中获取 ListControl 控件 ID 并与 ListControl 对象绑定。 3. 通过 ListControl 对象提供的 GetNextItem 函数循环获取 ListControl选中的行,直到返回 -1 为止,即可获取到所有选中的行。 具体代码实现如下: ``` // 定义 ListControl 对象 CListCtrl m_ListControl; // 在 OnInitDialog 函数中获取 ListControl 控件 ID 并与 ListControl 对象绑定 BOOL CMyDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // 获取 ListControl 控件 ID m_ListControl.Attach(GetDlgItem(IDC_LIST_CONTROL)->GetSafeHwnd()); // 设置 ListControl 列表头 m_ListControl.InsertColumn(0, _T("ColumnName1"), LVCFMT_LEFT, 100); m_ListControl.InsertColumn(1, _T("ColumnName2"), LVCFMT_LEFT, 100); // 在 ListControl 中添加数据 m_ListControl.InsertItem(0, _T("Row1-Column1")); m_ListControl.SetItemText(0, 1, _T("Row1-Column2")); m_ListControl.InsertItem(1, _T("Row2-Column1")); m_ListControl.SetItemText(1, 1, _T("Row2-Column2")); return TRUE; } // 获取 ListControl选中的行 void CMyDialog::OnButtonGetSelected() { int nIndex = -1; CString strSelected; while ((nIndex = m_ListControl.GetNextItem(nIndex, LVNI_SELECTED)) != -1) { strSelected = m_ListControl.GetItemText(nIndex, 0); // 处理选中的行数据 // ... } } ``` 在上述代码中,我们通过 GetDlgItem 函数获取到 ListControl 控件的 HWND,再通过 Attach 函数将其绑定到 ListControl 对象上。循环调用 GetNextItem 函数即可获取到选中的行,通过 GetItemText 函数可以获取到行中指定列的数据。最后可以在处理选中的行数据的地方进行相应的逻辑处理。 ### 回答3: MFC中的List Control 控件是非常常用的一种控件,主要用于展示一些表格数据,比如文件列表等。而在操作这些表格数据时,常常需要获取用户所选中的行,然后执行相应的操作,下面介绍一种获取选中行的方法。 首先判断是否有选中行,需要使用List Control的GetSelectedCount()函数,该函数可以获取当前选中的行数,如果返回值为0,表示没有选中任何行,我们可以在这里防止程序出错,然后再获取选中的行。 接下来就需要使用List Control的GetNextItem()函数来获取选中行的索引,该函数需要传入两个参数,即当前项的索引和一个获取的方式,这里我们使用 LVNI_SELECTED 模式,即可以获取到选中的项的索引。 最后利用选中项的索引就可以获取到所有选中的项的数据,这里的数据一般是按列存储的,需要使用 List Control 的GetItemText() 函数来逐列获取每个项的数据。这个函数需要传入两个参数,即需要获取的项的索引和列的索引,返回该项和列的文本数据。 综上,获取List Control选中行的步骤如下: 1. 判断是否有选中行:GetSelectedCount()函数返回值为0则没有选中行。 2. 获取选中行的索引:GetNextItem()函数传入 LVNI_SELECTED 模式可以获取到选中的项的索引。 3. 获取选中行的数据:通过GetItemText()函数逐列获取选中行的数据。 需要注意的是,由于List Control是按列存储的,所以在获取数据时,需要按照列的顺序来获取数据,即先获取第一列的数据,再获取第二列的数据,以此类推。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值