首页 利用MFC的CFileDialog生成Windows2000文件对话框

利用MFC的CFileDialog生成Windows2000文件对话框

举报
开通vip

利用MFC的CFileDialog生成Windows2000文件对话框利用MFC的CFileDialog生成Windows2000文件对话框 利用MFC的CFileDialog生成 Windows2000文件对话框 实用第一智慧密集 利用MFC的CFileDialog生成 Windows2000文件对话框 自Windows2000推出以后,其新的用户界面使我们有了 一 次大换口味的机会.比如,其泼入浅出的动画菜单,透明 的窗口,另外一个变化就是其文件对话框外观的改变,在程 序中打开保存文件时出现的对话框就要比原来在Windows98 下面的要"亲热"得多:先看看以下两幅图片...

利用MFC的CFileDialog生成Windows2000文件对话框
利用MFC的CFileDialog生成Windows2000文件对话框 利用MFC的CFileDialog生成 Windows2000文件对话框 实用第一智慧密集 利用MFC的CFileDialog生成 Windows2000文件对话框 自Windows2000推出以后,其新的用户界面使我们有了 一 次大换口味的机会.比如,其泼入浅出的动画菜单,透明 的窗口,另外一个变化就是其文件对话框外观的改变,在程 序中打开保存文件时出现的对话框就要比原来在Windows98 下面的要"亲热"得多:先看看以下两幅图片: 图1 周鸣扬 我们在Windows98中运行Office2000时,也能够见到图2所示 的文件对话框;在Windows2000中,同样也能够见到图l所示 的对话框(如VC的使用界面).而且.更重要的是,我们使 用VC的CFileDialog所生成的文件对话框.并不能够产生图2 所示的界面,这是怎么回事?还有一点不能让人理解的是, 有些应用程序(如:记事本程序)分别在Windows2000和 在Windows98下运行时,居然会有不同的文件对话框界面了? 这又是怎么回事?带着这些疑问,我仔细查阅了一下MSDN, 对对话框界面有一点初步的认识.下面将我在编写文件对话 框程序中的一点 心得 信息技术培训心得 下载关于七一讲话心得体会关于国企改革心得体会关于使用希沃白板的心得体会国培计划培训心得体会 写出来.与大家共同探讨: 文件对话框是一种特定的窗[f,对话框运行时对各种消 息的响应是通过对话的"钩子函数来完成的,对于对话框 的外观,我们可以通过修改文件对话框模板"来实现;同 样,如果要想文件对话实现其它功能(如带文件预览功能的 文件对话框),可以通过修改文件对话框的"钩子函数来 完成.在VC中,系统为我们提供了现成的文件对话框类 CFileDialog,利用该类,我们可以很方便地生成文件对话框: 在使用CFileDialog时.其中最重要的工作是对其成员变量 morn做初始化工作 ml实际上是一OPENFILENAME类型的结构(Street), OPENFILENAME的定义如下: typedefstructtagOFN( DWORDIStructSize;/0PENFlLENAME结小 DWORDFlags; 此处略去具体的成员要量 #if(_WIN32WINNT>=0x0500) voidpvReserved: DW0RDdwReserveo. DWORDFlagsEx; #endif//{IN32lNNT>=Ox0500I }0PENlLENAE}LPOPENFILENAME; 由上可鼬看出,0PENnl点NAME中有一,ns成员变量, 它决定了对话框的外观,它是一组预定义宏的组合通过 它,我们可定制十性化的文件对话框比如.在图1中, 只读方式打开"这一选项就是因为在nags中包括了 "0FNEADONLY". 当我们在使用OPENFILENAME结构时,我们已经习惯了 用下面的语句来设定lStructSize: 面mi?gsl【啦睁面;峨31 实用第一智慧密集 OPEN:ILENAMEdigFileOpen: digFileC,pe1IStructSze=sizeof10PENFILENAMEJ: 注:讫是在Windows98是Windows2000.运i iSt'uc:Sze的值只会是76 实际上.我们如果仔细算一下,76只是#if (IN32WINNT>=Ox0500)前所有成员变量的长度,如果加 上#if(1N32INNT>=0x0500)后的三个变量 (pvResen,ed,dwReserved,FlagsEx)的长度,ISstmctSize的值应 该是76十34=88:正是由于这个习惯性的操作,我们才在 无意中有意让Windows2000显示老式的文件对话框,原因是什 么?请继续往下看: 我们知道,Windows2000的版本号已经突破了5:如果你 使用—IN32_WINNT=0x0500进行程序的编译.#if (_~qN32_WINNT>=0xn500)后的头两个成员参数被当成了保 留值,剩下的一个成员参数FlagsEx.就有了一个新的标志值 可供选择:OF.Ex3'1OPLACESBAR,正是因为OFN-EX_NOP— LACESBAR,你才不能够在你所编写的程序中见到快捷工具 和OFNX_NOPLACESBAR相比,VC并未提 栏.奇怪的是, 供"OFN_EXSHOWPLACESBAR"之类的选择 之所对IStruetSize的值算来算去,是因为在Win— dows2000中使用MFC的CFileDialog所生成的对话框时, IStruetSize的值直接影响着对文件对话框对快捷工具栏显示与 否.如果OPENFILENAME的大小是76,则文件对话框不显示 快捷工具栏;如果OPENFILENAME的大小是88,文件对话框 显示快捷工具栏.当然,这种说法是有一定前提条件的,在 下的叙述中,你会对此有更深刻的了解 如果Windows2000仅仅通过判别OPENFILENAME的 1StruetSize值来确定显示文件对话框的方式,那么,为什么有 些在Windows98下运行的程序在Windows2000下依然能够显 示新型的文件对话框(如Windoa's98中的"记事本程序)' 很明显,Windows98下的IStruclSJ~e值一定是76,所以Win— dows2000一定还有另一种方式来决定使用何种形式来显示文 件对话框,是什幺呢? 0PENFIIJFN^ME结构中有一Flags值,这个值决定着文件 对话框的外观.Windows2000就是通过这值来从另一方面米 决定使用何种形式来显示文件对话框(准确地说,如果你使用 的是MFC的CFileDialag所生成的对话框)是同时通过FXags 和]StructSize笨决定使用何种形式来显示文件对话框如果 Flags值包含了OFN_ENABLEHOOK(启用钩子函数J.且 lStmctSize值是88,显示新的文件对话框;如果Flags不含 OFNENABLEHOOK(注意:CFileDialag的Flags必须要古 OFNNABLEHOOK),那么.不管1StructSize的值是多少,显 示新的文件对话框;如果OPENFILENAME使用了对话框钩子 函数且1StrucLSize的值是76,Windows2000显示老式的文件 对话框;这种显示机制解释了利用MFC的CFileDiaiog的应用 程序在Windows2000下运行时是显示老式的文件对话框 固为.MFC在文件对话框中都使用了对话框钩子函数,不 ;2电艟蝙程技药与维护2oo2.{ 信.你去看看CFileDialog类的实现源程序眦le.cpp第76 行:ASSERT(m~fnFla~s&OFN-ENABLEHOOK),这从根本 上说明,MFC的对话框必须使用钩子函数!而且,我们所习 惯的dlgFileOpen.IStruetSize=sizeof(OPENFILENAME)"这种 操作只会强制地要求Windows2000显示老式的文件对话框这 就注定了使用CFfleDialog类的文件对话框在Windows2000下 必定被显示成老式的文件对话框. 问题很明显了,归纳一下上面所述内容,我们可得出以 下结论: 1如果是在Windows98下,你用MFC的CFileDialag类生 成的对话框是不能实现新式对话框的显示.也许你会问, Windows98中运行Office2000时,系统照样能够显示新型的文 件对话框,笔者在此做猜测,那是因为Office2000的文件对话 框根本未使用MFC的对话显示原理,如果非要在Windows98 中显示新的文件对话框,你得重新定义一个文件对话框类. 2显然,并不是所有的文件对话框程序都是由MFC的 CFileDialog所生成的.如果你不用CF~IeDLalcJg对话框,你根本 不用考虑文件对话框的外观,新产生的对话框外观将自动随操 作系统而自动地在新式与老式之间进行转换. 3在Windows2000下使用MFC生成的对话框,如果你 能够确认文件对话框未使用对话框钩子函数(如GetOpenFile. Name()函数),那么,你开发的程序一定能够显示出新的 对话框(而不必在乎OPENFILENAME中1StructSizer的值), 而且这种程序在使用时不必在乎运行的操作系统平台,这也不 难理解"记事本"程序在Windows98和Wittdows2000下运行 时会有不同的文件对话框界面了;如果MFC文件对话框使用 钩子函数,那么,有且仅有的 办法 鲁班奖评选办法下载鲁班奖评选办法下载鲁班奖评选办法下载企业年金办法下载企业年金办法下载 是修改OPENFILENAblE的 大小,当OPENFILENAME的大小是88时,Windows2000显示 新型的文件对话框,否则显示老式的文件对话框同时要提到 的是:将OPENFILENAME的值强行设为88,这样的程序在 Windows98下面是不能正常运行的(你根本见不到对话框), 你得在程序中加入对应用程序的运行平台的判断代码了. 有了上述的认识.我们也可以利用MFC做出适应系统平 台的文件肘话框了.正如"写字板"那样:在Windows98下面 显示老式的文件对话框,而在Windows2000中,则显示新型的 文件对话框.试试下面的程序: 在VC中新建一单文档(SD1j项目,在资源编辑器中分 别加入两项菜单项:"用CFileDialog产生对话框和"用 GetOpenFileName产生对话框".同时加^对该两项菜单COM— MAND事件的响应函数,如下: voidCManFrame:OnCfiledialogcJ 【 CileDalogdlgFileOper,(TRDE). intslructsze=0 D坩CaDdwVersiondw'v'vi.dowsiV1alor'v'ersiondwWndovvs. i]0Ve,son /检捌j前的操作系筑Get\/ersion兵体月浩详见blSDN , -实用第一智慧密集 dwv'ersIon=GetVersion dwWndov,.,'sMaiorVeraion cdw'verSlot1))J. dwWnOov,,sIMinorVeraion fdwVesonI】]: DW0RD)ILOBYTE{LOW0RD = cDW0RD)(HIBYTE(L0W0RD . 托旱运F扞1七系统是WindowsNT,.'2000 fIdw'verson(0x80OO000OI strdctsize=88;/显示新的件对话框 e{Se . 运的操作系统Windows95/88 structsize:76;//显示老又件对话框 dlgFileOpenmgfn1StructSize=structsize; TCHARlpstrF;lename【MAXPATH】=... dlgFileOpenmfnIpstrFile=IpstrFilename; ifIdig:IeOpenDoModal{l==ID0Kl MessageBo~{俘所打开的又件是+(CStr,ngJdl gFdeOpenm?umIpstrFile): eIse MessageBoxf打开文件出错IJ. voidCMainErame.:OnGetopenfLlename ( 0PENFILENAMEofn /设声俘的名球储存空问 TCHAR~pstrFilenameIMAXATH】= . 浩空0PENFILENAME ZeroMemoryI&ofn,sizeoffofn)I. ofn{StruczSize=sizeof{0PEN}LENAMEI://{Str,ctSze的 返回值是是76 设定父窗口 0fhwndOwner=tnis~-r-!'Wnd. 设定打开又豹娄型 // ofnIpstrFilter=衙有?件,0,O了本_『I牛,0TXT, 0. ofnnMaxFile=MA×一 PATH OfnIpstrF.{e={pat,Filename: iffGetOpenFilenameI&ofn}) MessageBoxI你所fi的了是+fCStrng} ofnIpstrFileJ. else MessageBoxI}?开又件出错0) 上述程序在我的网页"国税之家"(htlp://naLionaJt~x homechinaren.corn)中的"个人世界"里可以下载到如果 修改MFC文件对话框并且让菜单中的"打开,保存"也能够用 上新的文件对话框,可以去重定义CfileDialog类,具体方{击本 文不做详细说明,也可以在上面我提到的网站上去下载. 应该说MFC在处理文件对话上面做得不是很好,查阅 MSDN,体是查不到本文所述内容的十本来耀简单的问 题,却做了这幺多工作,这也算得上MF?的"特色吧! (收稿日期:2002年1月14日) c0?Pa|-舢.533
本文档为【利用MFC的CFileDialog生成Windows2000文件对话框】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_477730
暂无简介~
格式:doc
大小:23KB
软件:Word
页数:8
分类:生活休闲
上传时间:2017-12-05
浏览量:31