继续做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);
}
}
这个问题研究了挺长时间,因为我想着可以把两个事件绑定,使其响应同一函数,但参数不同。最后被
大神点醒,改变获取方式即可。