在VC6中实现OFN_EXPLORER风格的文件对话框
2009-02-27 20:03:07 来源:WEB开发网可以看出,在Windows 2000以上操作系统中编译(查阅MSDN可知0x0500对应2000系统),就会多出3个变量,lStructSize这个值也就不同了。
操作系统根据这些识别OPENFILENAME版本,从而打开不同的文件对话框。
其实,这就是VC所带的SDK头文件的区别。Windows2000以上操作系统的SDK是支持这个属性的。VC6发行较早,头文件应该还是Windows NT的。
(2)对比CFileDialog::CFileDialog函数
在VC6的该函数处理中,直接指定了OPENFILENAME结构的长度:
memset(&m_ofn, 0, sizeof(m_ofn)); // initialize structure to 0/NULL
……
m_ofn.lStructSize = sizeof(m_ofn);
……
而在VC2005中,检测了操作系统的版本,然后设置不同长度:
// 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;
}
// size of OPENFILENAME must be at least version 4
ASSERT(dwSize >= OPENFILENAME_SIZE_VERSION_400);
// allocate memory for OPENFILENAME struct based on size passed in
m_pOFN = static_cast<LPOPENFILENAME>(malloc(dwSize));
ASSERT(m_pOFN != NULL);
if (m_pOFN == NULL)
AfxThrowMemoryException();
memset(&m_ofn, 0, dwSize); // initialize structure to 0/NULL
……
m_ofn.lStructSize = dwSize;
……
更多精彩
赞助商链接