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的情况下让弹出来的文件选择对话框总是位于主调窗口的前面?

解决方案 »

  1.   

    把bi.hwndOwner设置成调用窗口的句柄
      

  2.   

    bi.hwndOwner=m_hWnd;
    好好努力!
      

  3.   

    m_hWnd怎么得到的?是不是需要在别处赋值?
    我把bi.hwndOwner=0;
    改成
    bi.hwndOwner=m_hWnd;
    之后,出了两个编译错误:
     error C2065: 'm_hWnd' : undeclared identifier
     error C2440: '=' : cannot convert from 'int' to 'struct HWND__ *'
      

  4.   

    看起你的CMyDlg不是一个CDialog派生类
    你可以给CMyDlg::GetFolder添加一个参数,传递调用窗口的句柄作为参数。
    由于你给出的信息太少,无法给出传递调用窗口的句柄的方法。
      

  5.   

    我用VC生成一个简单的基于对话框的应用程序,点击“确定按钮”,得到一个响应函数CMyDlg::OnOK
    我就在这个响应函数中调用文件夹选择对话框:
    void CMyDlg::OnOK() 
    {
      MessageBox("Hello!");
      CString theFolder;
      if(GetFolder(theFolder))
    {
    CString strMsg=_T("选择的路径为:\n")+theFolder;
    MessageBox(strMsg);
    }
    }