Windows2000新型Open对话框的使用

勤奋的好的11

勤奋的好的11

2016-01-29 11:49

Windows2000新型Open对话框的使用,Windows2000新型Open对话框的使用

Windows2000新型Open对话框的使用

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)

编译/zxn

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/) 问题的提出:

    我刚刚在几台机器上安装了Windows® 2000,不知道如何在MFC应用中打开具有新的Outlook风格栏目的Open对话框(见图一)。

图一 新的 Open 对话框


    我能否只设置一个标志,或者我是否需要一个新的头文件和一个新的公共对话框的DLL?我注意到一些旧的应用程序如Notepad好像可以打开新的Open对话框而无须重新编译,但它们不是MFC应用。理想情况,我希望在Windows 9x 和Windows NT®下得到一个使用旧对话框的应用,而在Windows 2000下使用新的对话框。
    这个问题恐怕没有令你高兴的答复。Windows 2000新的“打开”对话框是用一个新版本的commdlg.dll实现的,其中包含一个叫做“Places Bar”的东东。显示它的函数是GetOpenFileName,这个函数与在Windows 9x 和Windows NT®下使用的相同。然而,GetOpenFileName现在使用一个新版本的OPENFILENAME结构,这是一个在你的应用和对话框之间传递信息的结构。新的结构有一些额外的成员:
typedef struct tagOFN {    DWORD lStructSize; // 很重要!•••// as you''ve always known and loved it#if (_WIN32_WINNT = 0x0500)   void* pvReserved;   DWORD dwReserved;   DWORD FlagsEx;#endif // (_WIN32_WINNT = 0x0500)} OPENFILENAME, *LPOPENFILENAME;
    Windows 2000是Windows的第5个版本,用16进制表示是0x500。如果你用_WIN32_WINNT = 0x0500编译程序,OPENFILENAME就会得到3个新成员。前两个是保留的,第三个标志域 是 FlagsEx,有一个新的OFN_EX_NOPLACESBAR标志,它屏蔽了Places栏目。Windows——或者更准确的说,commdlg.dll——使用OPENFILENAME第一个成员lStructSize来决定显示那个对话框,根据微软的说法:如果lStructSize是76(旧的大小),Windows就运行旧的对话框。如果是76+3x4=88(新的大小),它就运行新的对话框。但在实际的研究中,会发现不完全是这么回事。
    但是在我详细说明之前,先让我们走马观花地看一下MFC。讨论另外一个问题。在MFC应用中,通常并不直接调用GetOpenFileName,而是使用CFileDialog——或者框架使用CFileDialog。当用户调用File | Open,控制稀里哗啦的一路经过CWinApp::OnFileOpen和几个其它的函数,最终到达CDocManager::DoPromptFileName,这个函数创建一个CFileDialog。CFileDialog具有一个OPENFILENAME结构的数据成员:
class CFileDialog : public CCommonDialog {   OPENFILENAME m_ofn;•••};
    这个结构的大小是当编译MFC42.DLL时OPENFILENAME的大小;换句话说,旧的大小。而且,如果你正在进行一个静态连接,MFC代码在MFC42.DLL或NAFXCW.LIB里是被冻结的,你不能仅仅设置m_ofn.lStructSize为新的大小,因为CFileDialog除m_ofn外还有其它数据成员,它们将被新的OPENFILENAME的成员覆盖。
    不再耽搁了,我开始使用极端的方法避开这个问题。我考虑可以做些什么,类似于MFC中使用CPropertyPage那样。PROPSHEETPAGE和PROPSHEETHEADER的大小在从Windows 95到Windows 98的过程中的某处增加了,这是为了支持wizard风格的页面。为了支持新膨胀的结构,MFC提供了CPropertyPageEx和CPropertySheetEx。最初的类(不带Ex的)仍然使用旧的结构;而新的类使用新的结构。这是一种杂凑,尤其是因为afxdlgs.h具有自己的旧的结构的定义(AFX_ OLDPROPSHEETPAGE和AFX_OLDPROPSHEETHEADER),但是这样却行得通。
    我对CFileDialog做了同样的事情。首先我派生一个新的CFileDialogEx类,它带有一个新的m_ofn,包含着新的OPENFILENAMEEX结构,我模仿0x500版本加以定义。我加入这3个新的成员并且使用m_ofn.重写了CFileDialog函数。不幸的是,因为大多数的MFC代码是固定的,没有任何虚拟功能,这就意味着复制原来的整个类。但是我已经下了决心。
    在我认为已经找到了m_ofn出现的所有地方以后,我重写了它,高高兴兴的编译了我的代码(在Windows 98上),然后运行——结果发现我得到的仍是旧风格的对话框。而且,有一个谜团我忘了考虑:如
展开更多 50%)
分享

猜你喜欢

Windows2000新型Open对话框的使用

C语言教程 C语言函数
Windows2000新型Open对话框的使用

再谈 Windows 2000 “打开”文件对话框

C语言教程 C语言函数
再谈 Windows 2000 “打开”文件对话框

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Windows 文件对话框使用技巧集锦

windows 操作系统
Windows 文件对话框使用技巧集锦

打开windows运行对话框的js

Web开发
打开windows运行对话框的js

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

使用Windows API函数显示打开文件对话框

电脑网络
使用Windows API函数显示打开文件对话框

关于对话框

编程语言 网络编程
关于对话框

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

视图的缩放的完整论述

视图的缩放的完整论述

什么是多线程和多进程--基本概念

什么是多线程和多进程--基本概念
下拉加载更多内容 ↓