大家先看CFileDialog类的构造函数:
CFileDialog::CFileDialog(BOOL bOpenFileDialog,
LPCTSTR lpszDefExt, LPCTSTR lpszFileName, DWORD dwFlags,
LPCTSTR lpszFilter, CWnd* pParentWnd, DWORD dwSize) : CCommonDialog(pParentWnd)
{
// determine size of OPENFILENAME struct if dwSize is zero
if (dwSize == 0)
{
OSVERSIONINFO vi;
ZeroMemory(&vi, sizeof(OSVERSIONINFO));
vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
::GetVersionEx(&vi);
// if running under NT and version is >= 5
if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT && vi.dwMajorVersion >= 5)
dwSize = sizeof(OPENFILENAME);
else
dwSize = OPENFILENAME_SIZE_VERSION_400;
}
……
……
}
我的系统是2000Server SP2.
所以, if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT && vi.dwMajorVersion >= 5)应该为TRUE。
但是:
void CfileDoc::OnFileSave()
{
// TODO: 在此添加命令处理程序代码
OSVERSIONINFO vi;
ZeroMemory(&vi, sizeof(OSVERSIONINFO));
vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
::GetVersionEx(&vi);
//if running under NT and version is >= 5
if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT && vi.dwMajorVersion >= 5)
{ CFileDialog dlgFileA(0,0,0,0,0,0,sizeof(OPENFILENAME));
CFileDialog dlgFileB(0,0,0,0,0,0,0);
INT_PTR nResult = dlgFileA.DoModal();
    nResult = dlgFileB.DoModal();
}
}
两次弹出来的文件另存对话框不是一个样式,dlgFileB才是2000下真正应该显示的。
理论上两次出来的对话框应该是一样的,希望有哪位能讲一下其中的奥秘。

解决方案 »

  1.   

    请看你的函数:
    CFileDialog::CFileDialog(BOOL bOpenFileDialog,
    LPCTSTR lpszDefExt, LPCTSTR lpszFileName, DWORD dwFlags,
    LPCTSTR lpszFilter, CWnd* pParentWnd, DWORD dwSize) : CCommonDialog(pParentWnd)
    {
    // determine size of OPENFILENAME struct if dwSize is zero
    if (dwSize == 0)
    {
    OSVERSIONINFO vi;
    ZeroMemory(&vi, sizeof(OSVERSIONINFO));
    vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    ::GetVersionEx(&vi);
    // if running under NT and version is >= 5
    if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT && vi.dwMajorVersion >= 5)
    dwSize = sizeof(OPENFILENAME);
    else
    dwSize = OPENFILENAME_SIZE_VERSION_400;
    }里面专门处理最后一个参数dwSize 为空和不为空的的情况,再由于:
    CFileDialog dlgFileA(0,0,0,0,0,0,sizeof(OPENFILENAME));
    CFileDialog dlgFileB(0,0,0,0,0,0,0);
    两个对象的最后一个参数不同,
    dlgFileA处理的就是有参数dwSize 的情况,
    你的代码没有贴完全,后面的
    (dwSize != 0)没有,你看看
    这两段有什么不同就知道!
      

  2.   

    Windows文件对话框的两种不同样式,初始化函数分配的内存大小不同,效果不同!
      

  3.   

    其实你不必郁闷使用的是VC.net 吧?在你的程序中使用
    CFileDialog dlgFileA(0,0,0,0,0,0,sizeof(OPENFILENAME));
    CFileDialog dlgFileB(0,0,0,0,0,0,0);就是不同的,WIN2000下你的程序中sizeof(OPENFILENAME)的值是76
    而在CFileDialog的构造函数中sizeof(OPENFILENAME)的值却是88。原来为了版本的兼容,在你的stdafx.h中它将版本定义为WIN98。需要更改为合适的版本。当你将下面的内容注释掉时就OK了。
    #ifndef WINVER // 允许使用 Windows 95 和 Windows NT 4 或更高版本的特定功能。
    #define WINVER 0x0400 //为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
    #endif#ifndef _WIN32_WINNT // 允许使用 Windows NT 4 或更高版本的特定功能。
    #define _WIN32_WINNT 0x0400 //为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
    #endif #ifndef _WIN32_WINDOWS// 允许使用 Windows 98 或更高版本的特定功能。
    #define _WIN32_WINDOWS 0x0410 //为 Windows Me 及更新版本改变为适当的值。
    #endif#ifndef _WIN32_IE // 允许使用 IE 4.0 或更高版本的特定功能。
    #define _WIN32_IE 0x0400 //为 IE 5.0 及更新版本改变为适当的值。
    #endif
    事实上你的函数可以更简洁些,无需判断版本,它默认使用sizeof(OPENFILENAME)作为参数。
    void CfileDoc::OnFileSave()
    {
    CFileDialog dlgFileA(0, 0, 0, 0, 0);
    INT_PTR nResult = dlgFileA.DoModal();
        nResult = dlgFileB.DoModal();
    }
      

  4.   

    如果我使用默认的构造函数,也就是使用sizeof(OPENFILENAME)作为参数,出来的文件对话框不是2000下的那种,而是98下的。而我的系统是2000呀。
      

  5.   

    是啊,但是因为你的stdafx中已经将WINDOWS版本定义为较低版本了,而不是WIN2000。#define _WIN32_WINNT 0x0400//将这里改为0x0501就行了。
      

  6.   

    既然是WIN2000使用0x0500一定没错,试试。