SHBrowseForFolder打开默认目录Demo

作者: admin 分类: C++ 发布时间: 2020-12-17 11:41

C++ 选择文件夹以及选择文件代码

feng_blog6688 2018-10-26 16:19:13  4035  收藏 1

分类专栏: C++ 文章标签: 选择文件

    TCHAR szBuffer[MAX_PATH] = {0}; 

    BROWSEINFO bi; 

    ZeroMemory(&bi,sizeof(BROWSEINFO)); 

    bi.hwndOwner = NULL; 

    bi.pszDisplayName = szBuffer; 

    bi.lpszTitle = _T("从下面选文件夹目录:"); 

    bi.ulFlags = BIF_RETURNFSANCESTORS; 

    LPITEMIDLIST idl = SHBrowseForFolder(&bi); 

    if (NULL == idl) 

    { 

        return; 

    } 

    SHGetPathFromIDList(idl,szBuffer);

    AfxMessageBox(szBuffer);

打开文件

TCHAR szBuffer[MAX_PATH] = {0}; 

OPENFILENAME ofn= {0}; 

ofn.lStructSize = sizeof(ofn); 

ofn.hwndOwner = m_hWnd; 

ofn.lpstrFilter = _T(Exe文件(*.exe)*.exe所有文件(*.*)*.*);//要选择的文件后缀 

ofn.lpstrInitialDir = _T(D:\Program Files);//默认的文件路径 

ofn.lpstrFile = szBuffer;//存放文件的缓冲区 

ofn.nMaxFile = sizeof(szBuffer)/sizeof(*szBuffer); 

ofn.nFilterIndex = 0; 

ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER ;//标志如果是多选要加上OFN_ALLOWMULTISELECT

BOOL bSel = GetOpenFileName(&ofn);

为SHBrowseForFolder 设置默认的文件夹

hailongchang 2006-12-12 11:01:00  6194  收藏 1

文章标签: winapi callback vc++ struct bi windows

版权

   SHBrowseForFolder是一个windows shell函数,可以以目录为单位进行浏览,其函数原型为:

               LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFOlpbi);  

参数lpbi是一个指向结构BROWSEINFO的指针,该结构的定义如下: 

typedef struct _browseinfo {

    HWND hwndOwner;

    LPCITEMIDLIST pidlRoot;   //指向一个item identifier list指针,设置开始浏览的默认目录

    LPTSTR pszDisplayName;

    LPCTSTR lpszTitle;          //设置浏览对话框的标题,可以用这个变量对用户进行提示

    UINT ulFlags;

    BFFCALLBACK lpfn;         //回调函数的地址,即基于该浏览对话框的窗口过程

    LPARAM lParam;

    int iImage;

} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;

     由BROSEINFO的原型可以看出,很难设置一个默认的目录。可以在ulFlags中设置BIF_VALIDATE并设置一个回调函数来处理BFFM_INITIALIZED消息(该消息表示对话框已经为调用作好准备),在处理该消息时再SendMessage一个BFFM_SETSELECTION消息给窗口过程,并把初始目录的字符串作为LPARAM参数传递.下面的代码把初试目录设置为了"C:/Program Filese"

……

    if(uMsg == BFFM_INITIALIZED)

    {

        SendMessage(hwnd, BFFM_SETSELECTION,TRUE,(LPARAM)_T("C://Program Files"));

    }

……

     以下是在vc++.net 2003中的一个例子。

#include<shlobj.h>                                        //SHBrowseForFolder在shlobj.h中定义

#include<TCHAR.h>

#include<windows.h>

int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)

{

    if(uMsg == BFFM_INITIALIZED)

    {

        SendMessage(hwnd, BFFM_SETSELECTION,

            TRUE,(LPARAM)_T("C://Program Files"));

    }

    return 0;

}

void ShowSHBrowseForFolderDemoDlg()

{

   TCHAR m_dir[500];

   BROWSEINFO bi = {0};

   bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS|BIF_VALIDATE;

   bi.lpszTitle = _T("请选择保存计算结果文件的位置");

   bi.lpfn = BrowseCallbackProc;                           //指定回调函数地址

   ITEMIDLIST *pIDL = SHBrowseForFolder(&bi);

   if(SHGetPathFromIDList(pIDL,m_dir) == TRUE)     //变量m_dir中存储了经过用户选择后的目录的完整路径.

   {

        MessageBox(NULL,m_dir,"sample",0);

   }

}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)

{

     ShowSHBrowseForFolderDemoDlg();

     return 0;

}

SHBrowseForFolder打开默认目录Demo

    所需积分/C币:49 2013-03-06 11:04:00 65KB ZIP 收藏 收藏 举报

C++ 用SHBrowseForFolder 选择目录时,定位到默认的目录,DEMO源代码

Demo.zip

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

标签云