MFC制作本地文件系统(二)

前序

该章是在上一章的基础上继续完善代码,先来看看我们上一章做到哪了
这里写图片描述

那么我们接下来要先给控件加上图标(不然太丑了),然后先实现双击进入目录(为了做到简单些,我这里的不会去做位图按钮来实现返回功能,而是直接在工具箱中添加一个按钮来响应返回上级目录的功能),不会做位图按钮的请查阅我之前的博客。

实现

1、因为我们要给控件中添加磁盘跟文件的图标,那么我们的图标哪里来呢?当然是从我们的系统中获取的了,因而我们需要在头文件中添加CImageList类型指针来存储这些图标。而我们将获取图标的代码写到构造函数里或初始化函数里(OnInitDialog()),代码实现如下(这里我们在OnInitDialog函数里面添加):

BOOL CLocalFileSysDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);         // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO: 在此添加额外的初始化代码

    // 获取文件图标
    SHFILEINFO sfi;
    // 卷图标
    HIMAGELIST hImageList;
    // 加载系统图标列表
    hImageList = (HIMAGELIST)SHGetFileInfo(
        NULL, 
        0, 
        &sfi,
        sizeof(SHFILEINFO),
        SHGFI_LARGEICON | SHGFI_SYSICONINDEX
        );
    m_ImageList_Large = CImageList::FromHandle(hImageList);

    // 加载系统小图标列表
    hImageList = (HIMAGELIST)SHGetFileInfo(
        NULL, 
        0, 
        &sfi,
        sizeof(SHFILEINFO),
        SHGFI_SMALLICON | SHGFI_SYSICONINDEX
        );
    m_ImageList_Small = CImageList::FromHandle(hImageList);

    InitLocalDiskDriverList();

    m_local_list.SetImageList(m_ImageList_Large, LVSIL_NORMAL);
    m_local_list.SetImageList(m_ImageList_Small, LVSIL_SMALL);


    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

而上面的m_local_list.SetImageList则是在我们的控件中使用图标。这里代码添加完了,我们再来运行下我们的项目,是不是发现我们的磁盘前面已经有图标了,效果如下:
这里写图片描述

2、接着我们来实现双击鼠标左键进入磁盘/文件目录的函数。我在这里都是直接手动添加这些消息处理函数,如果你觉得麻烦你也可以在对话框中右键添加消息响应函数,这种方式MFC会自动帮你在对应的地方加上代码,不过我不大喜欢。
我们来到头文件LocalFileSysDlg.h下在类中添加双击左键的函数

afx_msg VOID OnNMDblclkListLocal(NMHDR *pNMHDR, LRESULT *pResult);      // 响应鼠标双击事件函数

然后在LocalFileSysDlg.cpp中找到 BEGIN_MESSAGE_MAP,如下:

BEGIN_MESSAGE_MAP(CLocalFileSysDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()

    ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CLocalFileSysDlg::OnNMDblclkListLocal)
END_MESSAGE_MAP()

其中ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CLocalFileSysDlg::OnNMDblclkListLocal)是我刚添加到这里的,让函数跟控件绑定起来。
最后我们来实现这个函数体:

VOID CLocalFileSysDlg::OnNMDblclkListLocal(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码

    if (m_local_list.GetSelectedCount() == 0 || 
        m_local_list.GetItemData(m_local_list.GetSelectionMark()) != 1)
        return;

    MessageBox("双击了");

    *pResult = 0;
}

函数体里面我做了个判断,就是只能在双击控件中的某一行才能往下执行,如果是双击空白处则是不执行的。可以看看效果如何。
效果图:
这里写图片描述
为了不让一节的内容太长,剩下的内容我在下节继续讲解,主要是双击进目录,然后添加个按钮返回上一级。

猜你喜欢

转载自blog.csdn.net/qq_34199383/article/details/81546218