mfc使用CListCtrl添加右键菜单及双击(以默认方式)打开文件。

继续做c++文件管理的项目,总结一下。 仅做笔记,如有侵权联系删除。
1.CListCtrl添加响应函数很简单。在属性中选择控件事件-NM_DBLCLICK即可。
    如何简单的以默认方式打开文件呢?这里用到了一个ShellExecute函数,他的功能是运行一个外部程序。
函数原型及参数含义如下
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;
    第三个参数及要打开的内容,也可直接打开网址,邮箱等。
void CDocumentManagementDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMLISTVIEW pNMLV = reinterpret_cast <LPNMLISTVIEW>(pNMHDR);
	int nItem=pNMLV->iItem;//行号 
	//pNMLV->iSubItem;//列号 
	if (nItem >= 0 && nItem<m_list.GetItemCount())//判断双击内容是否存在
	{
		CString OpenFile = strFolderPath+info[nItem].szDisplayName;
		if (PathFileExists(OpenFile))
			ShellExecute(NULL, TEXT("OPEN"), OpenFile, NULL, NULL, SW_SHOWNORMAL);
		//第三个参数为需要打开文件的路径及文件名
	}
	*pResult = 0;
}
2.右键菜单同样是选择控件事件-NM_RCLICK。
    新建资源中添加一个MENU,编辑一下显示内容,选择添加事件处理可添加点击事件。

void CDocumentManagementDlg::OnNMRClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	int nItem = pNMItemActivate->iItem;
	if (m_list.GetSelectedCount() <= 0)
		return;//判断右键是否有内容
	fileinformation.Init(info[nItem].szDisplayName, strFolderPath, info[nItem].hIcon);
	//传值,定义了一个FileInformatica类,用于储存被右击信息
	CMenu menu;
	POINT pt = { 0 };
	GetCursorPos(&pt);//得到鼠标点击位置 
	menu.LoadMenu(IDR_MENU1);//加载菜单资源ID 
	menu.GetSubMenu(0)->TrackPopupMenu(0, pt.x, pt.y, this); //最后一个参数为this才可以响应点击事件 
	*pResult = 0;
}

3.如何在菜单中响应问题1.中打开文件函数呢。将获取点击位置的函数替换为m_list.GetSelectionMark()即可。

void CDocumentManagementDlg::On32771()
{
	int nItem = m_list.GetSelectionMark();
	if (nItem >= 0 && nItem<m_list.GetItemCount())//判断双击内容是否存在
	{
		CString OpenFile = strFolderPath + info[nItem].szDisplayName;
		if (PathFileExists(OpenFile))
			ShellExecute(NULL, TEXT("OPEN"), OpenFile, NULL, NULL, SW_SHOWNORMAL);
	}
}
这个问题研究了挺长时间,因为我想着可以把两个事件绑定,使其响应同一函数,但参数不同。最后被 大神点醒,改变获取方式即可。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值