【问题标题】:GetOpenFileName() does not refresh when changing filter更改过滤器时 GetOpenFileName() 不刷新
【发布时间】:2009-05-28 17:35:36
【问题描述】:

我使用GetOpenFilename() 让用户选择一个文件。代码如下:

  wchar_t buffer[MAX_PATH] = { 0 };

  OPENFILENAMEW open_filename = { sizeof (OPENFILENAMEW) };

  open_filename.hwndOwner   = handle_;
  open_filename.lpstrFilter = L"Video Files\0*.avi;*.mpg;*.wmv;*.asf\0"
                              L"All Files\0*.*\0";
  open_filename.lpstrFile   = buffer;
  open_filename.nMaxFile    = MAX_PATH; 
  open_filename.lpstrTitle  = L"Open media file...";
  open_filename.Flags       = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;

  ::GetOpenFileNameW(&open_filename);

文件对话框出现了,但是当我

  • 更换过滤器或
  • 点击“我的电脑

文件列表变为空。按[F5] 没有帮助,但如果我切换到父文件夹并返回到原始文件夹(在过滤器更改的情况下)过滤工作正常并且文件显示在列表中。

编辑:我的系统是 Windows XP (SP3) 32 位 - 没什么特别的。它也发生在具有相同配置的其他机器上。

【问题讨论】:

  • 您的代码看起来不错,并且对话框在 XP 上运行正常(使用 _WIN32_WINNT 0x0501 编译)。你的案件的具体情况是什么?是 Vista 吗?

标签: c++ c winapi dialog


【解决方案1】:

您尚未完成但可能导致问题的一件事是完全初始化 OPENFILENAMEW 结构,尤其是 lStructSize 元素。我以前见过这会引起奇怪的影响。我建议有类似的东西

  OPENFILENAMEW open_filename = { sizeof (OPENFILENAMEW) };
  ZeroMemory(&open_filename, sizeof (OPENFILENAMEW));
  open_filename.lStructSize = sizeof (OPENFILENAMEW);

【讨论】:

  • OPENFILENAMEW open_filename = { sizeof (OPENFILENAMEW) };完全按照您的建议进行。
【解决方案2】:

好的,我已经解决了问题,或者至少,我有一个适合我的解决方案。

在代码的前面,我有以下调用来初始化 COM...

::CoInitializeEx(NULL, COINIT_MULTITHREADED);

嗯,把它改成……

::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

...为我解决了问题!现在文件对话框再次过滤。

我在网上搜索了这个,似乎很少有人面临同样的问题,但没有人发布上述解决方案。谁能验证我的发现?

【讨论】:

    【解决方案3】:

    谢谢你,beef2k。有用。 但我的问题有一点不同。 在我添加 SHBrowseForFolder 调用之前,一切正常。从那一刻起,我得到了同样的效果。但是添加 CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);解决了问题。

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多