Windows2000新型Open对话框的使用

2016-01-29 11:49 17 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

Windows2000新型Open对话框的使用

编译/zxn

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

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

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

图一 新的 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上),然后运行——结果发现我得到的仍是旧风格的对话框。而且,有一个谜团我忘了考虑:如

来源:http://www.tulaoshi.com/n/20160129/1483503.html

延伸阅读
获取静态控件文本的方法:GetDlgItem函数获得对话框中控件的指针,然后调用GetWindowText获得文本。注意:静态控件的属性必须将Notify选为可能。同理:SetWindowText可以指定文本。 获取编辑框内容:GetDlgItem(ID)-GetWindowText(); 字符内容转换为数值:atoi()把字符串转换为数值;同理:数字到字符串itoa(); GetDlgItemText(ID)可以完成...
Windows SDK笔记(四):模式对话框 作者:冯明德 一、概述 对话框是一种特殊的窗口,它依据对话框模板资源而建立。 它与一般的窗口有些不同,很多过程由系统完成了,虽然用户还是要提供一个消息处理函数,但在此消息处理函数中,不需要将不关心的消息交由缺省消息处理函数。 实际...
1、意图 有时候我们希望将非模态窗口显示为模态窗口。比如在IE的“文件”菜单下选择“打印”,弹出的“打印”对话框就是非模态的(也许我们不太清楚Microsoft的设计意图,一般来说这里的“打印”对话框应该是模态的)。这种情况下如何将“打印”对话框显示为模态的呢(这个对话框对我们来说是Black Box)? 2、简单实现 简单...
标签: autocad教程
在执行AutoCAD命令的过程中,用户与AutoCAD之间主要是通过文本窗口和对话框来进行人机交互。 2.3.1使用文本窗口 AutoCAD的文本窗口与AutoCAD窗口相对独立,用户可通过如下方式来显示该窗口: (1)在AutoCAD中按F2键 (2)选择菜单【View(视图)】→【Display(显示)】→【TextWindow(文本窗口)】 (3)在命令行调用“textscr”命令 该窗口...
Director中非常有用的一个Xtra是MUI Dialog Xtra,这是D自代的对话框生成器。在6.0版本中就有这个Xtra了,但是很奇怪大多开发者都只应用了它最基本的特性,如果他们能否充分利用MUI Xtra的话,那么,你就可以自己定义个完全响应的对话框,而不是去用很废内存和磁盘空间的MIAW来实现。你可以去任意定制它,并且你可以完全根据你或者你的客...

经验教程

98

收藏

24
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部