zoukankan      html  css  js  c++  java
  • MFC_CFileDialog_选择文件夹

    场景

    在MFC中有时候只需要选择一个文件夹而不需要选择文件,这时候可以通过下列方式来进行选择

    技术点

    • BROWSEINFO
    typedef struct_browseinfo
    {
        HWND hwndOwner;
        LPCITEMIDLIST pidlRoot;
        LPSTR pszDisplayName;
        LPCSTR lpszTitle;
        UINT ulFlags;
        BFFCALLBACK lpfn;
        LPARAM lParam;
        int iImage;
    }BROWSEINFO,*PBROWSEINFO,*LPBROWSEINFO;
    
    hwndOwner: 浏览文件夹对话框的父窗体句柄
    
    pidlRoot:ITEMIDLIST结构的地址,包含浏览时的初始根目录,而且只有被指定的目录和其子目录才显示在浏览文件夹对话框中。该成员变量可以是NULL,在此时桌面目录将被使用。
    
    pszDisplayName:用来保存用户选中的目录字符串的内存地址。该缓冲区的大小缺省是定义的MAX_PATH(260)常量宏。
    
    lpszTitle:该浏览文件夹对话框的显示文本,用来提示该浏览文件夹对话框的功能、作用和目的。
    
    ulFlags:该标志位描述了对话框的选项。它可以为0,也可以是以下常量的任意组合。
    
    lpfn:应用程序定义的浏览对话框回调函数的地址。当对话框中的事件发生时,该对话框将调用回调函数。该参数可用为NULL。
    
    lParam:对话框传递给回调函数的一个参数指针。
    
    iImage:与选中目录相关的图像。该图像将被指定为系统图像列表中的索引值。
    
    ulFlags使用说明:
    
    BIF_BROWSEFORCOMPUTER:返回计算机名。除非用户选中浏览器中的一个计算机名,否则该对话框中的“OK”按钮为灰色。
    
    BIF_BROWSEFORPRINTER:返回打印机名。除非选中一个打印机名,否则“OK”按钮为灰色。
    
    BIF_BROWSEINCLUDEFILES:浏览器将显示目录,同时也显示文件。
    
    BIF_DONTGOBELOWDOMAIN:在树形视窗中,不包含域名底下的网络目录结构。
    
    BIF_EDITBOX:浏览对话框中包含一个编辑框,在该编辑框中用户可以输入选中项的名字。
    
    BIF_RETURNFSANCESTORS:返回文件系统的一个节点。仅仅当选中的是有意义的节点时,“OK”按钮才可以使用。
    
    BIF_RETURNONLYFSDIRS:仅返回文件系统的目录。例如:在浏览文件夹对话框中,当选中任意一个目录时,该“OK”按钮可用,而当选中“我的电脑”或“网上邻居”等非有意义的节点时,“OK”按钮为灰色。
    
    BIF_STATUSTEXT:在对话框中包含一个状态区域。通过给对话框发送消息使回调函数设置状态文本。
    
    BIF_VALIDATE:当没有BIF_EDITBOX标志位时,该标志位被忽略。如果用户在编辑框中输入的名字非法,浏览对话框将发送BFFM_VALIDATEFAILED消息给回调函数。
    
    注意:所有标志可以配合使用例如: 
    BIF_EDITBOX|BIF_RETURNFSANCESTORS
    
    
    
    • CoTaskMemFree是一种函数,此函数用于释放被分配的内存块。
    • TRACE 宏有点象我们以前在C语言中用的Printf函数,使程序在运行过程中输出一些调试信息,使我们能了解程序的一些状态。在Output中可以查看到结果。

    代码

    void CMFCClistDlg::GUI_Add_Check_Dir()
    {
    	// TODO: 在此添加命令处理程序代码
    	BROWSEINFO bi;
    	wchar_t Buffer[MAX_PATH];
    
    	//初始化入口参数 bi
    	bi.hwndOwner = NULL;
    	bi.pidlRoot = NULL;
    	bi.pszDisplayName = Buffer;
    	bi.lpszTitle = L"文件夹路径选择";
    	bi.ulFlags = BIF_EDITBOX;
    	bi.lpfn = NULL;
    	bi.iImage = IDR_MAINFRAME;
    
    	LPITEMIDLIST pIDList = SHBrowseForFolder(&bi); //调用显示选择对话框 
    						   //注意下 这个函数会分配内存 但不会释放 需要手动释放
    
    
    	if (pIDList)
    	{
    		SHGetPathFromIDList(pIDList, Buffer);
    		//CString GamePath;
    		//GamePath = Buffer; //将文件夹路径保存在CString 对象里面
    		//取得文件夹路径放置Buffer空间
    		//GUI_ShowMessage(true, Buffer);
    		
    	}
    
    	CoTaskMemFree(pIDList); //释放pIDList所指向内存空间;
    	TRACE("%d", pIDList);
    
    	// 把变量内容更新到对话框
    	UpdateData(FALSE);
    }
    
    

    参考

    【MFC】BROWSEINFO结构设置文件夹文件路径 方法学习与分享!

    https://blog.csdn.net/z724133545/article/details/45771707

  • 相关阅读:
    BZOJ 2212/BZOJ 3702
    BZOJ 4761 Cow Navigation
    BZOJ 3209 花神的数论题
    BZOJ 4760 Hoof, Paper, Scissors
    BZOJ 3620 似乎在梦中见过的样子
    BZOJ 3940 Censoring
    BZOJ 3942 Censoring
    BZOJ 3571 画框
    BZOJ 1937 最小生成树
    BZOJ 1058 报表统计
  • 原文地址:https://www.cnblogs.com/17bdw/p/10276444.html
Copyright © 2011-2022 走看看