初始目录在CFileDialog中无法工作

7

我正在使用CFileDialog,我已经像下面这样设置了初始路径,在代码中显示。但它没起作用。如果我犯了错,请纠正我。

   CFileDialog* filedlg = new CFileDialog(TRUE,(LPCTSTR)NULL ,  (LPCTSTR)NULL , OFN_HIDEREADONLY| OFN_ENABLESIZING , (LPCTSTR)NULL , FromHandle (hImgDlg) ,0 , FALSE  );

   filedlg ->m_ofn.lpstrInitialDir = "C:\\" ;

   if ( filedlg ->DoModal() == IDOK )
   {
       /***  do somthing here *****/
   }

“不工作”是什么意思?你是否遇到编译器错误?运行时错误或崩溃?初始目录不是你期望的吗? - Some programmer dude
不显示所提到的初始路径,而是自动采用上次选择的路径。 - jack
你使用的是Windows 7(或更高版本),还是早期版本的Windows? - Some programmer dude
另一个需要考虑的情况是当lpstrInitialDir设置为不存在的文件夹时。在这种情况下,Windows7会默认选择最近使用的文件夹。 - Radim Cernej
3个回答

6
如果您查看OPENFILENAME结构的参考文献,您将看到对于lpstrInitialDir字段它声明如下:

如果lpstrInitialDir的值与应用程序第一次使用“打开”或“另存为”对话框时传递的值相同,则使用用户最近选择的路径作为初始目录。

这意味着lpstrInitialDir字段实际上只能在程序中首次使用对话框时使用。其余时间它将使用用户上次选择的目录。

有其他可选的 API 吗? - jack
我不知道。 - Some programmer dude
谢谢你,@joachim pileborg。 - jack
5
我刚遇到了同样的问题。我真的很想知道那个导致这种奇怪行为的人吸了什么样的物质。 - Jabberwocky
1
刚刚收到一个缺陷请求,要求我修复程序中的某种行为,但是我不知道该怎么做。 - blackbada_cpp
除了创建一个虚拟的CFileDialog并获取其初始目录外,还有没有其他方法可以获取用户使用的上述最后一个目录? - Bondolin

6
两种选择: 1. 传统的对话框风格,指定 OFN::lpstrInitialDir。
CFileLatinDialog dlg (TRUE, "", "" /*lpszFileName */,
   OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,
   "All Files(*.*)|*.*||", this, 0,
   FALSE /*bVistaStyle*/);
dlg.m_ofn.lpstrInitialDir = "C:\\Models\\";
  • 指定lpszFileName参数的Vista风格对话框
  • CFileLatinDialog dlg (TRUE, "", "C:\\Models\\" /*lpszFileName */,
       OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,
       "所有文件(*.*)|*.*||", this);
    

    5
    如果您设置了文件路径,则可以使对话框在特定位置打开。如果您确实需要打开文件夹位置或者有一个默认文件名,那么才建议使用此功能。请注意,不要删除原有的HTML标签。
    CFileDialog* filedlg = new CFileDialog(TRUE, (LPCTSTR)NULL,  (LPCTSTR)_T("C:\\MyFolder\\DefaultFileName.ext"), OFN_HIDEREADONLY | OFN_ENABLESIZING, (LPCTSTR)NULL, FromHandle (hImgDlg), 0, FALSE);
    

    或者您可以使用Windows函数GetModuleFileName

    CString csAppFolder;
    TCHAR szPath[MAX_PATH]; 
    
    // form the path to where we want to store the file
    if (GetModuleFileName(NULL, szPath, MAX_PATH))
    {
        PathRemoveFileSpec(szPath);
        csAppFolder = szPath;
    }
    
    CFileDialog* filedlg = new CFileDialog(TRUE, (LPCTSTR)NULL, (LPCTSTR)(csAppFolder + _T("\\DefaultFileName.ext")), OFN_HIDEREADONLY | OFN_ENABLESIZING, (LPCTSTR)NULL, FromHandle (hImgDlg), 0, FALSE);
    

    你所建议的正是在Windows 7上无法按预期工作的事情。 - Jabberwocky
    那么我必须要做一些其他操作,才能每次打开时都获取到目录。我不知道那是什么。但在实例化时指定实际文件名可以起作用。它已经在生产环境中了,我只在Win 7上进行开发。我想知道为什么它能正常工作。 - CaptainBli
    1
    为什么要指定bVistaStyle = FALSE?在使用Vista风格对话框时,指定lpstrInitialDir可以帮助。 - blackbada_cpp
    我得试一试,看看那对我的应用有什么影响。谢谢。 - CaptainBli

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接