您的位置:首页 > 其它

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

2018-03-15 15:55 1006 查看
继续做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);
}
}这个问题研究了挺长时间,因为我想着可以把两个事件绑定,使其响应同一函数,但参数不同。最后被大神点醒,改变获取方式即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc 文件管理
相关文章推荐