使用BROWSEINFO 设置浏览文件夹的属性

要实现点击按钮弹出浏览文件夹对话框,可以使用BROWSEINFO结构体和SHBrowseForFolder()方法 通过BROWSEINFO来设置浏览文件夹的属性。下面我就来简单谈一些我在调用的时候遇到的问题和使用的方法。

效果图如下:

使用BROWSEINFO 设置浏览文件夹的属性_第1张图片

首先是BROWSEINFO 参数的含义:

typedef struct _browseinfo { 
HWND hwndOwner; // 父窗口句柄 
LPCITEMIDLIST pidlRoot; // 要显示的文件夾的根(Root) 
LPTSTR pszDisplayName; // 保存被选取的文件夾路径的缓冲区
LPCTSTR lpszTitle; // 显示位于对话框左上部的标题 
UINT ulFlags; // 指定对话框的外观和功能的標志
BFFCALLBACK lpfn; // 处理事件的回调函数 
LPARAM lParam; // 应用程序传给回调函数的参数 
int iImage;// 保存被选取的文件夾的图片索引
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO




一.实现功能

1.BROWSEINFO 结构体参数赋值

  BROWSEINFO bi;

  这里讲下常用的几个参数的设置:
  1).修改打开时的根目录,用到参数2

    //此处CSIDL_DRIVES为获取的是我的电脑的ID,用这个参数设置根目录就是我的电脑,参考MSDN,有很多参数
    SHGetSpecialFolderLocation(m_hWnd, CSIDL_DRIVES ,&ppidl);
    //常用有CSIDL_DESKTOP(桌面)CSIDL_PROGRAMS(开始菜单)CSIDL_MYMUSIC(我的音乐) 
    然后把ppidl设置到第二个参数,就可以了。
 

  2).修改对话框属性,用到参数5

     //MSDN中给出了几个参数使用过程中互斥的情况

     ulFlags的值常用可以是 BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE ;

  3).设置默认选择目录 需要用到两个参数。参数6,和7。一个是回调函数,一个是LPARAM(回调参数)。
      回调函数如下: 

static int CALLBACK _SHBrowseForFolderCallbackProc( HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData )
{
	switch(uMsg)
	{
	case BFFM_INITIALIZED:    
		::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,lpData);   //传递默认打开路径 break;
	case BFFM_SELCHANGED:    //选择路径变化,BFFM_SELCHANGED
		{
			char curr[MAX_PATH];   
			SHGetPathFromIDList((LPCITEMIDLIST)lParam,(LPWSTR)(LPCTSTR)curr);   
			::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)&curr[0]);  
		}
		break;
	default:
		break;
	} 
	return 0;
}


LPARAM参数如下:

TCHAR szPath[MAX_PATH] ;//初始化时浏览文件夹的路径
_tcscpy_s(szPath,strCurrentPath);//自己设置的文件夹路径

bi.lParam =LPARAM(szPath);    //设置默认路径

二.注意:
设置根目录的时候,当 ulFlags的属性为BIF_NEWDIALOGSTYLE新建文件夹的样式的时候这个属性会收到影响,会出现设置无效的现象。注意取舍。 

三.实现源代码如下:

BROWSEINFO bi;
	wchar_t Buffer[MAX_PATH];
	wchar_t szResult[MAX_PATH];
	ITEMIDLIST *ppidl;
	wchar_t strCurrentPath[MAX_PATH]= L"C:\\";

	SHGetSpecialFolderLocation(m_hWnd, CSIDL_DRIVES ,&ppidl);
	if ( ppidl == NULL)
	AfxMessageBox(_T("启动路径浏览失败") ) ; 

	TCHAR szPath[MAX_PATH] ;//初始化时浏览文件夹的路径
	_tcscpy_s(szPath,strCurrentPath);//自己设置的文件夹路径
	//初始化入口参数bi开始
	bi.hwndOwner = this->GetSafeHwnd();
	bi.pidlRoot =ppidl;//根目录
	bi.pszDisplayName = Buffer;//此参数如为NULL则不能显示对话框
	bi.lpszTitle = L"Custom Title";//下标题
	bi.ulFlags   = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE ;
	bi.lpfn  = _SHBrowseForFolderCallbackProc;       
	//bi.iImage=IDR_MAINFRAME;
	bi.lParam =LPARAM(szPath);    //设置默认路径

	//初始化入口参数bi结束
	LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框
	if(pIDList)
	{
		//取得文件夹路径到Buffer里
		SHGetPathFromIDList(pIDList,szResult);
		//sFolderPath就是我们选择的路径
	}

	LPMALLOC lpMalloc;
	if(FAILED(SHGetMalloc(&lpMalloc)))
		return;
	lpMalloc->Free(pIDList);
	lpMalloc->Release();


 
  




你可能感兴趣的:(MFC,C++)