void GetDir(const char *Title, CString &Path)
{
LPMALLOC pIMalloc ;
if (::SHGetMalloc(&pIMalloc))
{
return;
}
char szBuff[MAX_PATH];
lstrcpy(szBuff,Path);
BROWSEINFO bi;
::FillMemory(&bi, sizeof(BROWSEINFO), 0);
bi.hwndOwner = NULL ;// acedGetAcadWinApp() ; // m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = szBuff;
//text to display within the dialog
bi.lpszTitle = Title;
bi.ulFlags = BIF_RETURNONLYFSDIRS;// only want folders
// this is the directory you want to start from
char szPath[MAX_PATH];
lstrcpy(szPath, Path);
bi.lParam = (LPARAM)szPath;
bi.lpfn = NULL; //BrowseCallBack;
//returns NULL if user cancels
ITEMIDLIST *browseList = NULL;
browseList = ::SHBrowseForFolder(&bi);
if (browseList)
{
::SHGetPathFromIDList(browseList, szBuff);
Path = szBuff;
pIMalloc->Free(browseList);
}
pIMalloc->Release() ;
}
{
LPMALLOC pIMalloc ;
if (::SHGetMalloc(&pIMalloc))
{
return;
}
char szBuff[MAX_PATH];
lstrcpy(szBuff,Path);
BROWSEINFO bi;
::FillMemory(&bi, sizeof(BROWSEINFO), 0);
bi.hwndOwner = NULL ;// acedGetAcadWinApp() ; // m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = szBuff;
//text to display within the dialog
bi.lpszTitle = Title;
bi.ulFlags = BIF_RETURNONLYFSDIRS;// only want folders
// this is the directory you want to start from
char szPath[MAX_PATH];
lstrcpy(szPath, Path);
bi.lParam = (LPARAM)szPath;
bi.lpfn = NULL; //BrowseCallBack;
//returns NULL if user cancels
ITEMIDLIST *browseList = NULL;
browseList = ::SHBrowseForFolder(&bi);
if (browseList)
{
::SHGetPathFromIDList(browseList, szBuff);
Path = szBuff;
pIMalloc->Free(browseList);
}
pIMalloc->Release() ;
}
解决方案 »
- 潘爱民的编程水平怎么样?
- 程序内部怎么捕捉 WM_LBUTTONDOWN
- 求助怎么在SDI里建立socket连接?
- 100分求插件实例源码
- 如何让计算机向并口的某一个引脚,发一个脉冲?(在线等)
- 如何使ActiveX控件在设计时固定大小,就象VB中Timer控件一样
- http的头部大小限制
- 请问怎样得到我的执行程序所在的路径?
- MFC 问题
- VFW做的摄像头驱动程序
- 初学者问个简单的问题,如何创建一个右上角有3个按纽(最小化,还原,关闭)的对话框?向导生成的对话框只有关闭一个按钮
- vc7.0中用到<iostream>,但linux环境下没有这个头文件,怎样才能使同一段代码又能在vc7中编译,又能在linux编译?
{
char SelectPath[MAX_PATH],dispname[MAX_PATH];
BROWSEINFO bi;
ITEMIDLIST * pidl;
bi.hwndOwner = m_hWnd;
bi.pidlRoot = 0;
bi.pszDisplayName = dispname;
bi.lpszTitle = TileName;
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpfn = BrowseCallbackProc;
bi.iImage = 0;
if (pidl = SHBrowseForFolder(&bi))
{
SHGetPathFromIDList(pidl, SelectPath);
return SelectPath;
}
}int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
//char *a=(char *)lParam;
switch(uMsg){
case BFFM_INITIALIZED:
::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,LPARAM("C:\\"));
break;
case BFFM_SELCHANGED:
{
char curr[MAX_PATH];
SHGetPathFromIDList((LPCITEMIDLIST)lParam,curr);
if(curr[strlen(curr)-1]==92)
sprintf(curr,"%sSictech",curr);
else
sprintf(curr,"%s\\Sictech",curr);
::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)curr);
}
break;
}
return 0;
}
char *c=OnBtBrows("标题");
{
public:
CDirDlg();
virtual ~CDirDlg();
CString GetDirectory(CWnd *pParent=NULL,LPCSTR lpszRoot="c:\\",LPCSTR lpszTitle="Please Pick a Directory");
static CString m_sRootDir;
};
int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lp, LPARAM pData);
CString CDirDlg::m_sRootDir;
CDirDlg::CDirDlg()
{
}
CDirDlg::~CDirDlg()
{
}
CString CDirDlg::GetDirectory(CWnd *pParent,LPCSTR lpszRoot,LPCSTR lpszTitle)
{
CString str;
BROWSEINFO bi;
bi.hwndOwner=pParent->m_hWnd;
bi.pidlRoot=0;
bi.pszDisplayName=0;
bi.lpszTitle=lpszTitle;
bi.lpfn = BrowseCallbackProc;
bi.lParam=0;
bi.ulFlags=
BIF_RETURNONLYFSDIRS |BIF_STATUSTEXT |0;
m_sRootDir=lpszRoot;
LPITEMIDLIST lpItemId=::SHBrowseForFolder(&bi);
if (lpItemId)
{
LPTSTR szBuf=str.GetBuffer(MAX_PATH);
::SHGetPathFromIDList(lpItemId, szBuf);
::GlobalFree(lpItemId);
str.ReleaseBuffer();
}
return str;
}
int CALLBACK BrowseCallbackProc(HWND hwnd,UINT msg,LPARAM lp, LPARAM pData)
{
TCHAR buf[MAX_PATH];
switch(msg)
{
case BFFM_INITIALIZED:
strcpy(buf,CDirDlg::m_sRootDir);
::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)buf);
break;
case BFFM_SELCHANGED:
if (::SHGetPathFromIDList((LPITEMIDLIST) lp ,buf))
SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)buf);
break;
}
return 0;
}
void CTestopendirctory01Dlg::OnButtonDirectory()
{
// TODO: Add your control notification handler code here
CDirDlg dlg;
CString strVedioPath;
strVedioPath = dlg.GetDirectory(this,m_nFileDirectory);
if (strVedioPath == "")
{
GetDlgItem(IDC_EDIT_FILE_DIRECTORY)->SetWindowText(m_nFileDirectory);
}
else
{
m_nFileDirectory = strVedioPath;
GetDlgItem(IDC_EDIT_FILE_DIRECTORY)->SetWindowText(m_nFileDirectory);
}}
感觉都有点答非所问缺省路径要用BrowseCallbackProc ,又要类变量(等于全局变量)。
难道就不可以做成void GetDir(const char *Title, CString &Path) 这样的函数吗?
//
//从对话框中选择目录
//
static CString GetDir()
{
CString sFolderPath;
char Buffer[MAX_PATH];
int nID = 0 ;
LPITEMIDLIST pIDList = PidlBrowse(NULL,nID,Buffer);//调用显示选择对话框
if(pIDList)
{
//取得文件夹路径到Buffer里
SHGetPathFromIDList(pIDList, Buffer);
//将路径保存在一个CString对象里
sFolderPath = Buffer;
}
LPMALLOC lpMalloc;
if(FAILED(SHGetMalloc(&lpMalloc))) return _T("");
//释放内存
lpMalloc->Free(pIDList);
lpMalloc->Release();
return sFolderPath;
}; //
//从对话框中选择目录调用的方法
//
static LPITEMIDLIST PidlBrowse(HWND hwnd, int nCSIDL, LPSTR pszDisplayName)
{
LPITEMIDLIST pidlRoot = NULL;
LPITEMIDLIST pidlSelected = NULL;
BROWSEINFO bi = {0};
LPMALLOC pMalloc = NULL; SHGetMalloc(&pMalloc); if(nCSIDL)
{
SHGetSpecialFolderLocation(hwnd, nCSIDL, &pidlRoot);
} else
{
pidlRoot = NULL;
} bi.hwndOwner = hwnd;
bi.pidlRoot = pidlRoot;
bi.pszDisplayName = pszDisplayName;
bi.lpszTitle = "Choose the target folder:";
bi.ulFlags = 0;
bi.lpfn = NULL;
bi.lParam = 0; pidlSelected = SHBrowseForFolder(&bi); if(pidlRoot)
{
pMalloc->Free(pidlRoot);
}
pMalloc->Release();
return pidlSelected;
}
关键是回调函数里居然用了类静态变量(其实是全局变量)。
谢谢 chuanke((C ) 2005【空间代数】. All rights reserved .)