int CMyDlg::GetFolder(CString &theFolder)
{
BROWSEINFO bi; //文件夹浏览结构
char dispname[MAX_PATH],path[MAX_PATH];
ITEMIDLIST *pidl;
int retCode = 0;
//初始化bi
bi.hwndOwner=0;
bi.pidlRoot=0;
bi.pszDisplayName=dispname;
bi.lpszTitle="请选择一个文件夹";
bi.ulFlags=BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE;
bi.lpfn=0;
bi.lParam=0;
bi.iImage=0; //弹出文件夹窗口,并选取目录
if (pidl=SHBrowseForFolder(&bi))
{
SHGetPathFromIDList(pidl,path); //取得目录信息
theSelectedFolder = path;
retCode = 1;
} return retCode;
}// 调用方法:
CString folder;
if (GetFolder(folder))
{
...;
}如果在调用之前用过MessageBox()函数,那么,弹出来的文件选择对话框会隐在主调窗口的后面。这是为什么呢?如果把 bi.ulFlags=BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE;
改成 bi.ulFlags=BIF_RETURNONLYFSDIRS;则弹出来的文件选择对话框总是在最前面了。这又是为什么?我怎么能够在不改变bi.ulFlags的情况下让弹出来的文件选择对话框总是位于主调窗口的前面?
{
BROWSEINFO bi; //文件夹浏览结构
char dispname[MAX_PATH],path[MAX_PATH];
ITEMIDLIST *pidl;
int retCode = 0;
//初始化bi
bi.hwndOwner=0;
bi.pidlRoot=0;
bi.pszDisplayName=dispname;
bi.lpszTitle="请选择一个文件夹";
bi.ulFlags=BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE;
bi.lpfn=0;
bi.lParam=0;
bi.iImage=0; //弹出文件夹窗口,并选取目录
if (pidl=SHBrowseForFolder(&bi))
{
SHGetPathFromIDList(pidl,path); //取得目录信息
theSelectedFolder = path;
retCode = 1;
} return retCode;
}// 调用方法:
CString folder;
if (GetFolder(folder))
{
...;
}如果在调用之前用过MessageBox()函数,那么,弹出来的文件选择对话框会隐在主调窗口的后面。这是为什么呢?如果把 bi.ulFlags=BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE;
改成 bi.ulFlags=BIF_RETURNONLYFSDIRS;则弹出来的文件选择对话框总是在最前面了。这又是为什么?我怎么能够在不改变bi.ulFlags的情况下让弹出来的文件选择对话框总是位于主调窗口的前面?
好好努力!
我把bi.hwndOwner=0;
改成
bi.hwndOwner=m_hWnd;
之后,出了两个编译错误:
error C2065: 'm_hWnd' : undeclared identifier
error C2440: '=' : cannot convert from 'int' to 'struct HWND__ *'
你可以给CMyDlg::GetFolder添加一个参数,传递调用窗口的句柄作为参数。
由于你给出的信息太少,无法给出传递调用窗口的句柄的方法。
我就在这个响应函数中调用文件夹选择对话框:
void CMyDlg::OnOK()
{
MessageBox("Hello!");
CString theFolder;
if(GetFolder(theFolder))
{
CString strMsg=_T("选择的路径为:\n")+theFolder;
MessageBox(strMsg);
}
}