今天我们来实现在树型控件中双击打开文件的操作,注意这里只是打开文件,并没有打开文件夹(不过你想打开也非常简单)。
1、判断鼠标点击了树的哪个节点;
2、根据点击的节点找到对应的文件;
3、将找到的文件打开。
下面我们一个个来。
1、判断鼠标点击了哪个节点
这步几行代码就可以搞定了,如下:在MyTreeDlg.cpp中添加的函数定义,函数声明请自己添加,就在CMyTreeDlg类中;
这里用到了HitTest方法,简单说就是通过鼠标坐标判断点击了哪个树节点,具体的细节可以网上搜索,这里就不详细叙述了。
HTREEITEM CMyTreeDlg::GetSelectTree()
{
}
2、根据点击的节点找到对应的文件
实际这个和第一回里介绍的遍历文件方法差不多,只不过这次,我们是从树中计算出文件的路径,然后拿着这个路径去找文件,而先前的遍历是先搜索文件,再显示成树节点,两者正好是反的操作。这里采用的获取文件路径的方法,是通过树一层层往上找的,然后再连接起来,如果有更好的方法,希望告知,非常感谢!
直接上代码:
const DWORD Error_FileOrFolderNotFound = -1;//自定义返回码,表示未找到
const DWORD Return_IsFolder = 1;//自定义返回码,表示树节点对应为文件夹
const DWORD Return_IsFile = 0;//自定义返回码,表示树节点对应为文件
DWORD CMyTreeDlg::GetFilePathByTreeItem()
{
}
其中显示未声明的变量,请在CMyTreeDlg类中自行声明,如下:
HTREEITEM m_CurTree;//用以记录当前的节点
HTREEITEM m_CurTreeParent;//用以当前节点的父节点
CString m_CurTreeDir;//用以记录当前节点的路径
3、将找到的文件打开
有了上面两步的准备,我们通过双击打开文件的只得就很简单明了了,我们有对话框上点击树型控件,然后添加双击的事件响应函数,如图2-1
图2-1 为树型控件添加事件响应函数
然后在其中添加如下加粗代码:其中ShellExecute就是执行外部程序的一个函数。
void CMyTreeDlg::OnNMDblclkMytree(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO:
在此添加控件通知处理程序代码
DWORD res = GetFilePathByTreeItem();
//如果当前选择节点为文件,则将其打开
if (res == Return_IsFile)
{
ShellExecute(NULL, NULL, m_CurTreeDir, NULL, NULL, SW_SHOWNORMAL);
}
*pResult = 0;