| 再谈 Windows 2000 “打开”文件对话框 编译/zxn 本文代码例子 不久以前,VC知识库曾探讨过如何在MFC应用中打开Windows 2000风格的“文件/打开”对话框(类似Outlook Express左边的Places Bar)。最近又有许多人问及这方面的问题,也许我在那篇文章中讲的不是很清楚,所以这次在本文中重申这个问题。 图一 新的“打开”对话框 当你在Windows 95, Windows 98或Windows NT 4.0运行应用程序的时候,你必须使用旧的结构尺寸。而在Windows 2000中,你既可以使用旧的结构尺寸,也可以使用最新的结构尺寸。如果lStructSize是新的尺寸,Windows 2000打开新风格的对话框。如果lStructSize是旧的尺寸,Windows 2000还检查结构OPENFILENAME中其它的信息:即如果对话框有“钩子”(hook)功能标志(OFN_ENABLEHOOK)或模板标志(OFN_ENABLETEMPLATE),Windows 2000打开旧风格的对话框,否则打开新风格的对话框。这多少使人感觉有些混乱。无论你如何做,MFC42.DLL都被用旧的结构尺寸编译,并且MFC使用一个吊钩过程(OFN_ENABLEHOOK)将对话框连接到你的消息映射......。 // OPENFILENAME 结构的 Windows 2000 版本struct OPENFILENAMEEX : public OPENFILENAME { void * pvReserved; DWORD dwReserved; DWORD FlagsEx;};// CFileDialog 类的 Windows 2000 版本class CFileDialogEx : public CFileDialog {protected: OPENFILENAMEEX m_ofnEx; // 新增成员}; OPENFILENAME 的定义在commdlg.h文件中,而 OPENFILENAMEEX 是模仿 OPENFILENAME 的本地(局部)定义。OPENFILENAMEEX有三个新成员。为了使用这个新结构,CFileDialogEx 重写 DoModal。你必须从CFileDialog 拷贝整个函数到 CFileDialogEx,代码细节如下: 添加 m_ofnEx int CFileDialogEx::DoModal(){...... // 前面是 MFC 代码 // 拷贝 m_ofn ==> m_ofnEx 并设置 memset(&m_ofnEx, 0, sizeof(m_ofnEx)); memcpy(&m_ofnEx, &m_ofn, sizeof(m_ofn)); if (IsWin2000()) m_ofnEx.lStructSize = sizeof(m_ofnEx); // 使用 m_ofnEx 运行 "打开"或"保存"对话框 int nResult; if (m_bOpenFileDialog) nResult = ::GetOpenFileName((OPENFILENAME*)&m_ofnEx); else nResult = ::GetSaveFileName((OPENFILENAME*)&m_ofnEx); // 回拷 m_ofnEx ==> m_ofn memcpy(&m_ofn, &m_ofnEx, sizeof(m_ofn)); m_ofn.lStructSize = sizeof(m_ofn);......} 上述代码的基本思路是在调用 GetOpenFileName 或 GetSaveFileName 之前先将 m_ofn 拷贝到 m_ofnEx,调用完成后再拷回去。其中最重要的是其第一个结构成员----lStructSize 按照实际运行的操作系统版本被初始化。获取操作系统版本参见 IsWin2000 函数: IsWin2000函数实现////////////////////////////////////////////////////////////////// 检测操作系统版本(Windows 2000 或以后)的函数//BOOL IsWin2000 () { OSVERSIONINFOEX osvi; BOOL bOsVersionInfoEx; // 尝试调用 GetVersionE
|
0
顶一下

发表评论
告诉好友