?? 1712034301.txt
字號:
化境編程界-
利用MFC的CFileDialog生成Windows2000文件對話框(1)
化境編程界首頁| 化境軟件庫 | 化境教程庫 | 其它資源 | 化境討論區
| 化境留言板
showTop();
歡迎訪問《化境編程界》| * Email:5xsoft@21cn.com | < 留言板
化境編程界 -> 技術文章 -> C/C++/VC
利用MFC的CFileDialog生成Windows2000文件對話框(1)
[ 作者: 周鳴揚
添加時間: 2001-5-17 12:07:39
]
來源:http://www.ccw.com.cn
自Windows2000推出以后,其新的用戶界面使我們有了一次大換口味的機會。比如,其淡入淺出的動畫菜單、透明的窗口,另外一個變化就是其文件對話框外觀的改變,在程序中打開保存文件時出現的對話框就要比原來在Windows98下面的要“親熱”得多:先看看以下兩幅圖片:
圖一
圖二
圖一是我們最常見的文件對話框(本文稱之為老式的文件對話框),圖二是在Windows2000中用得普遍的文件對話框(本文稱之為新式的文件對話框)。同樣都是文件對話框,卻有著不同的界面。在圖二中,我們可以看到在對話框的左邊有一快捷工具欄,它能夠幫助我們在計算機中快速地定位,這在操作上要比圖一所示的對話框要方便得多。奇怪的是,圖二所示的對話框并非是Windows2000的專利,因為我們在Windows98中運行 Office2000時,也能夠見到圖二所示的文件對話框;在Windows2000中,同樣也能夠見到圖一所示的對話框(如VC的使用界面)。而且,更重要的是,我們使用VC的CFileDialog 所生成的文件對話框,并不能夠產生圖二所示的界面,這是怎么回事?還有一點不能讓人理解的是,有些應用程序(如:“記事本”程序)分別在Windows2000和在Windows98下運行時,居然會有不同的文件對話框界面了?這又是怎么回事?帶著這些疑問,我仔細查閱了一下MSDN,對對話框界面有一一點初步的認識。下面將我在編寫文件對話框程序中的一點心得寫出來,與大家共同探討:
文件對話框是一種特定的窗口,對話框運行時對各種消息的響應是通過對話的“鉤子函數”來完成的。對于對話框的外觀,我們可以通過修改“文件對話框模板”來實現;同樣,如果要想文件對話實現其它功能(如帶文件預覽功能的文件對話框),可以通過修改文件對話框的“鉤子函數”來完成。在VC中,系統為我們提供了現成的文件對話框類CFileDialog,利用該類,我們可以很方便地生成的文件對話框。在使用CFileDialog時,其中最重要的工作是對其成員變量m_ofn做初始化工作。
m_ofn實際上是一OPENFILENAME類型的結構(Struct) ,OPENFILENAME的定義如下:
typedef struct tagOFN {
DWORD lStructSize;// OPENFILENAME結構的大小
DWORD Flags;
………………此處略去具體的成員變量…………………….
#if (_WIN32_WINNT >= 0x0500)
void * pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
#endif // (_WIN32_WINNT >= 0x0500)
} OPENFILENAME, *LPOPENFILENAME;
由上可以看出,OPENFILENAME中有一Flags成員變量,它決定了對話框的外觀,它是一組預定義宏的組合。通過它,我們可以定制個性化的文件對話框。比如,在圖一中,“以只讀方式打開”這一選項就是因為在Flags中包括了“OFN_READONLY”。
當我們在使用OPENFILENAME結構時,我們已經習慣了用下面的語句來設定lStructSize:
OPENFILENAME dlgFileOpen;
dlgFileOpen.lStructSize=sizeof(OPENFILENAME);
//注:無論是在Windows98或是Windows2000下運行,lStructSize的值只會是76
實際上,我們如果仔細算一下,76只是#if (_WIN32_WINNT >= 0x0500)前所有成員變量的長度,如果加上#if (_WIN32_WINNT >= 0x0500)以后的三個變量(pvReserved、dwReserved、FlagsEx)的長度, lSstructSize的值應該是76+3*4=88。正是由于這個習慣性的操作,我們才在無意中有意讓Windows2000顯示老式的文件對話框,原因是什么?請繼續往下看:
我們知道,Windows 2000的版本號已經突破了5。如果你使用_WIN32_WINNT = 0x0500進行程序的編譯,#if (_WIN32_WINNT >= 0x0500)后的頭兩個成員參數被當成了保留值,剩下和一個成員參數FlagsEx,就有了一個新的標志值可供選擇:OFN_EX_NOPLACESBAR,正是因為OFN_EX_NOPLACESBAR,你才不能夠在你所編寫的程序中見到快捷工具欄。奇怪的是,和OFN_EX_NOPLACESBAR相比,VC并未提供“OFN_EX_SHOWPLACESBAR”之類的選擇。
之所以對lStructSize的值算來算去,是因為在Windows2000中使用MFC的CFileDialog所生成的對話框時,lStructSize的值直接影響著對文件對話框對快捷工具欄顯示與否。如果OPENFILENAME的大小是76,則文件對話框不顯示快捷工具欄;如果OPENFILENAME的大小是88,文件對話框顯示快捷工具欄。當然,這種說法是有一定前提條件的,在以下的敘述中,你會對此有更深刻的了解。
如果Windows 2000 僅僅通過判別OPENFILENAME 的lStructSize值來確定顯示文件對話框的方式,那么,為什么有些在Windows98 下運行的程序在Windows 2000下依然能夠顯示新型的文件對話框(如Windows98中的“記事本”程序)? 很明顯,Windows98下的lStructSize值一定是76, 所以Windows 2000一定還有另一種方式來決定使用何種形式來顯示文件對話框,是什么呢?
OPENFILENAME結構中有一Flags值,這個值決定著文件對話框的外觀。 Windows 2000就是通過這值來從另一方面來決定使用何種形式來顯示文件對話框(準確地說,如果你使用的是MFC的CFileDialog所生成的對話框)是同時通過Flags和lStructSize來決定使用何種形式來顯示文件對話框。如果Flags值包含了OFN_ENABLEHOOK(啟用鉤子函數),且lStructSize值是88,顯示新的文件對話框;如果Flags不含OFN_ENABLEHOOK(注意:CFileDialog的Flags必須要含OFN_ENABLEHOOK),那么,不管lStructSize的值是多少,顯示新的文件對話框;如果OPENFILENAME使用了對話框鉤子函數,且lStructSize的值是76, Windows 2000 顯示老式的文件對話框;這種顯示機制解釋了利用MFC的CFileDialog的應用程序在Windows 2000 下運行時總是顯示老式的文件對話框。因為, MFC在文件對話框中都使用了對話框鉤子函數,不信,你去看看CFileDialog類的實現源程序Dlgfile.cpp第76行:ASSERT(m_ofn.Flags & OFN_ENABLEHOOK),這從根本上說明,MFC的對話框必須使用鉤子函數!而且,我們所習慣的“dlgFileOpen.lStructSize=sizeof(OPENFILENAME)”這種操作只會強制地要求Windows2000顯示老式的文件對話框。這就注定了使用CFileDialog類的文件對話框在Windows 2000下必定被顯示成老式的文件對話框。
問題很明顯了,歸納一下上面所述內容,我們可以得出以下結論:1、如果是在Windows98下,你用MFC的CFileDialog類生成的對話框是不能實現新式對話框的顯示。也許你會問,Windows98中運行Office2000時,系統照樣能夠顯示新型的文件對話框,筆者在此做猜測,那是因為Office2000的文件對話框根本未使用MFC的對話顯示原理,如果非要在Windows98中顯示新的文件對話框,你得重新定義一個文件對話框類。2、顯然,并不是所有的文件對話框程序都是由MFC的CFileDialog所生成的。如果你不用CFileDialog對話框,你根本不用考慮文件對話框的外觀,新產生的對話框外觀將自動隨操作系統而自動地在新式與老式之間進行轉換。3、在Windows 2000下,使用MFC生成的對話框,如果你能夠確認文件對話框未使用對話框鉤子函數(如GetOpenFileName()函數),那么,你開發的程序一定能夠顯示出新的對話框(而不必在乎OPENFILENAME中lStructSizer的值),而且這種程序在使用時不必在乎運行的操作系統平臺,這也不難理解 “記事本”程序在Windows98和Windows2000下運行時會有不同的文件對話框界面了;如果MFC文件對話框使用鉤子函數,那么,有且僅有的辦法是修改OPENFILENAME的大小,當OPENFILENAME的大小是88時,Window2000顯示新型的文件對話框,否則顯示老式的文件對話框。同時要提到的是:將OPENFILENAME的值強行設為88,這樣的程序在Windows98下面是不能正常運行的(你根本見不到對話框),你得在程序中加入對應用程序的運行平臺的判斷代碼了。
下一頁 8
相關內容:
- 討論: windows程序設計方式爭論
- ATL和MFC來,應該使用哪個?
- 初始化類成員和在你的MFC應用中加入位置欄
- 利用MFC的CFileDialog生成Windows2000文件對話框
- MFC中多線程的應用
showBottom();
申明: 本站
所有內容均是從網上收集,若有侵范你版權的請指出,本站馬上刪除。
© Copyright By 稻香老農 2000.3 - Now | 站務聯系: 5xsoft@21cn.com | OICQ:593737 (只用于站務聯系,不做它用)
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品视频在线观看网站|
日韩电影在线免费观看|
精品国内二区三区|
欧美色成人综合|
色哟哟日韩精品|
91麻豆精品视频|
99精品视频免费在线观看|
国产精品一二三四区|
日韩中文字幕av电影|
久久人人爽人人爽|
欧美一区二区在线播放|
欧美伊人精品成人久久综合97
|
欧美亚洲国产怡红院影院|
国产成人免费视|
狠狠色综合日日|
精品在线亚洲视频|
久久激情五月激情|
麻豆精品在线看|
五月天网站亚洲|
亚洲电影第三页|
日韩精品成人一区二区在线|
亚洲影视资源网|
亚洲一区视频在线观看视频|
玉足女爽爽91|
亚洲成av人片www|
婷婷中文字幕一区三区|
视频一区二区三区在线|
丝袜脚交一区二区|
青青草国产精品97视觉盛宴
|
中文字幕制服丝袜一区二区三区|
国产性色一区二区|
中文文精品字幕一区二区|
国产情人综合久久777777|
欧美日韩在线精品一区二区三区激情|
欧美三级日韩在线|
日韩欧美电影一二三|
国产精品成人一区二区三区夜夜夜|
国产日产欧美一区二区视频|
欧美激情一二三区|
亚洲免费观看在线视频|
天堂久久久久va久久久久|
一区二区三区自拍|
亚洲伦在线观看|
亚洲图片欧美视频|
天堂蜜桃一区二区三区|
久久成人18免费观看|
色综合中文字幕国产
|
精久久久久久久久久久|
91丨九色porny丨蝌蚪|
亚洲精品一区二区三区蜜桃下载|
国产欧美一区二区在线|
经典三级视频一区|
欧美精品一二三区|
色综合久久综合中文综合网|
国产成人免费在线观看不卡|
国产一区二区三区在线观看免费|
日韩激情一区二区|
亚洲免费在线观看|
一区二区三区不卡视频|
亚洲综合在线第一页|
a美女胸又www黄视频久久|
91色综合久久久久婷婷|
国产一区二区调教|
欧美aaaaaa午夜精品|
亚洲国产精品一区二区久久
|
久久久久国产免费免费|
精品va天堂亚洲国产|
久久久久久久综合色一本|
欧美国产日韩a欧美在线观看|
欧美精品一区男女天堂|
精品国产伦理网|
久久精品视频一区二区三区|
欧美国产成人精品|
亚洲激情图片qvod|
日韩精品欧美成人高清一区二区|
婷婷夜色潮精品综合在线|
国产一区二区三区香蕉|
99久久婷婷国产|
日韩美一区二区三区|
亚洲国产精品99久久久久久久久|
国产精品色在线|
亚洲大型综合色站|
蜜桃视频在线观看一区二区|
亚洲午夜视频在线|
国产精品久久久久久久蜜臀|
欧美高清dvd|
国产自产2019最新不卡|
久久老女人爱爱|
亚洲靠逼com|
久久精品免费在线观看|
最新热久久免费视频|
国产美女精品人人做人人爽|
欧美日韩电影一区|
亚洲人成7777|
91麻豆免费视频|
亚洲视频免费在线|
99国产精品国产精品毛片|
国产精品嫩草99a|
成人av网站免费|
国产精品美女久久久久aⅴ国产馆
国产精品美女久久久久av爽李琼
国产精品美女久久久久高潮
|
日韩一区二区三区av|
天堂蜜桃91精品|
欧美浪妇xxxx高跟鞋交|
日韩制服丝袜av|
日韩一二三区视频|
久草在线在线精品观看|
久久综合av免费|
国产aⅴ综合色|
亚洲欧美自拍偷拍|
99久久婷婷国产精品综合|
一区二区三区中文字幕精品精品
|
亚洲视频资源在线|
在线观看成人免费视频|
亚洲成在线观看|
欧美一区二区三区免费视频|
亚洲bdsm女犯bdsm网站|
欧美一级欧美一级在线播放|
亚洲乱码中文字幕综合|
欧美二区在线观看|
黄一区二区三区|
自拍偷拍国产精品|
欧美日韩国产大片|
精品一区二区三区影院在线午夜|
久久久99免费|
91精品1区2区|
麻豆视频一区二区|
国产欧美日韩精品a在线观看|
国产一区二区看久久|
中文字幕一区二区三区在线不卡
|
国产成人精品免费视频网站|
亚洲私人影院在线观看|
欧美一区二区福利在线|
成人久久久精品乱码一区二区三区|
亚洲美女免费在线|
欧美一区二区在线看|
91麻豆蜜桃一区二区三区|
日韩av在线免费观看不卡|
国产精品成人午夜|
日韩一区二区三区视频在线观看|
成人动漫一区二区三区|
秋霞成人午夜伦在线观看|
亚洲欧洲精品天堂一级|
日韩欧美激情一区|
在线观看精品一区|
成人中文字幕在线|
免费在线成人网|
一区二区三区四区乱视频|
久久综合成人精品亚洲另类欧美
|
轻轻草成人在线|
国产精品理伦片|
亚洲国产精品高清|
自拍偷拍欧美精品|
一区二区三区电影在线播|
一区二区三区在线视频免费|
中文字幕亚洲视频|
亚洲伊人伊色伊影伊综合网|
天堂av在线一区|
久久国产剧场电影|
国产成人av福利|
色伊人久久综合中文字幕|
欧美日韩另类国产亚洲欧美一级|
在线电影欧美成精品|
26uuu亚洲综合色|
综合久久久久久|
日韩国产高清在线|
国产激情偷乱视频一区二区三区|
色综合视频在线观看|
国产精品国产三级国产普通话99|
国产精品久久久久久久久搜平片|
日韩黄色小视频|
欧洲精品一区二区三区在线观看|
久久久久久免费毛片精品|
丝袜美腿亚洲色图|
91福利精品第一导航|
国产精品视频一二三区|
九一九一国产精品|
51精品秘密在线观看|
玉米视频成人免费看|
91在线视频免费观看|
久久久99精品久久|
国内精品视频666|
91精品国产黑色紧身裤美女|
亚洲日本一区二区|
不卡的av中国片|
国产精品少妇自拍|
国产二区国产一区在线观看|
精品国产乱码久久久久久夜甘婷婷|
亚洲国产精品综合小说图片区|
91一区二区在线|
中文字幕一区二区三区不卡在线|
韩国三级在线一区|
精品国产精品一区二区夜夜嗨|
日韩二区在线观看|
欧美精选一区二区|
视频在线观看一区二区三区|
欧美亚洲一区二区在线|
亚洲国产欧美日韩另类综合|
91福利视频在线|
亚洲午夜精品网|
欧美日韩aaaaaa|