MFC 禁止拖动 ListCtrl 表头,获取选中行号

本文介绍了一种在C++ MFC框架下,如何通过重载OnNotify函数来禁止List控件头部的拖动操作,并展示了如何在鼠标点击事件中获取列表视图的选中行和列号。
部署运行你感兴趣的模型镜像

禁止拖动 重载 OnNotify

BOOL CMainDialog::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
	// TODO: 在此添加专用代码和/或调用基类
	//屏蔽两个消息通知码,使得禁止拖动List表头   
	NMHEADER* pNMHeader = (NMHEADER*)lParam;
	if (((pNMHeader->hdr.code == HDN_BEGINTRACKW) |
		(pNMHeader->hdr.code == HDN_DIVIDERDBLCLICKW)))
	{
		*pResult = TRUE;
		return TRUE;
	}
	return CDialogEx::OnNotify(wParam, lParam, pResult);
}

获取选中行

int nIdx = m_list.GetSelectionMark();

获取选中行号,列号, 添加鼠标单击消息

void CMainDialog::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	if (pNMListView->iItem != -1)
	{
		CString strtemp;
		strtemp.Format(_T("单击的是第%d行第%d列"),
			pNMListView->iItem, pNMListView->iSubItem);
		AfxMessageBox(strtemp);
	}
	*pResult = 0;
}

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 获取 MFC ListCtrl 当前选中的行数和列数 在 MFC 中,可以通过 `CListCtrl::SubItemHitTest` 方法获取用户当前点击或选中的单元格信息,从而确定选中行号和列号。该方法返回当前鼠标位置对应的行索引,并通过 `LVHITTESTINFO` 结构获取子项(列)索引。 以下是一个获取当前选中行和列的代码示例: ```cpp void CMyDialog::OnNMDblclkListCtrl(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = (LPNMITEMACTIVATE)pNMHDR; int nItem = pNMItemActivate->iItem; int nSubItem = pNMItemActivate->iSubItem; CString str; str.Format(_T("选中行: %d, 选中列: %d"), nItem, nSubItem); AfxMessageBox(str); *pResult = 0; } ``` 该方法通过 `NMDBLCLK` 消息响应双击事件,也可以使用 `NM_CLICK` 消息响应单击事件。如果需要在任意点击操作中获取行列信息,可以绑定 `NM_CLICK` 消息并使用 `SubItemHitTest` 方法: ```cpp void CMyDialog::OnClickListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { LPNMITEMACTIVATE pNMItemActivate = (LPNMITEMACTIVATE)pNMHDR; int nItem = pNMItemActivate->iItem; int nSubItem = pNMItemActivate->iSubItem; // 输出选中行和列 TRACE("选中行: %d, 选中列: %d\n", nItem, nSubItem); *pResult = 0; } ``` 如果使用 `LVHITTESTINFO` 手动获取信息,可采用如下方式: ```cpp void CMyDialog::GetSelectedItem(CListCtrl& m_ListCtrl) { LVHITTESTINFO lvinfo; int nItem = m_ListCtrl.SubItemHitTest(&lvinfo); if (nItem != -1) { int nRowSelected = lvinfo.iItem; int nColSelected = lvinfo.iSubItem; CString str; str.Format(_T("选中行: %d, 选中列: %d"), nRowSelected, nColSelected); AfxMessageBox(str); } } ``` 该方法通过 `SubItemHitTest` 获取完整的 `LVHITTESTINFO` 结构,其中包含行和列的索引信息,适用于需要精确控制选中状态的场景[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值