大家先看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下真正应该显示的。
理论上两次出来的对话框应该是一样的,希望有哪位能讲一下其中的奥秘。
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下真正应该显示的。
理论上两次出来的对话框应该是一样的,希望有哪位能讲一下其中的奥秘。
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)没有,你看看
这两段有什么不同就知道!
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();
}