公共對(duì)話框——OPENFILENAME結(jié)構(gòu)
來(lái)源:http://bupt.org/blog/blog.php?do-showone-tid-178.html今天在網(wǎng)上搜這個(gè)的時(shí)候, 看到有人遇到某錯(cuò)誤問(wèn)了半天也沒(méi)人理. 其實(shí)memset初始化一下就可以了.
--------相關(guān)資料--------------------
OPENFILENAME
OPENFILENAME結(jié)構(gòu)包含了GetOpenFileName和GetSaveFileName函數(shù)用來(lái)初始化打開(kāi)或另存為對(duì)話框的信息。在用戶(hù)關(guān)閉對(duì)話框后,系統(tǒng)返回關(guān)于用戶(hù)的選擇信息到這個(gè)結(jié)構(gòu)中。
typedef struct tagOFN {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPCTSTR lpstrFilter;
LPTSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPTSTR lpstrFile;
DWORD nMaxFile;
LPTSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPCTSTR lpstrInitialDir;
LPCTSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPCTSTR lpstrDefExt;
LPARAM lCustData;
LPOFNHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
#if (_WIN32_WINNT >= 0x0500)
void * pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
#endif // (_WIN32_WINNT >= 0x0500)
} OPENFILENAME, *LPOPENFILENAME;
成員
- lStructSize
- 指定這個(gè)結(jié)構(gòu)的大小,以字節(jié)為單位。
Windows 95/98和Windows NT 4.0:特意為Windows 95/98或Windows NT 4.0,及帶有WINVER和_WIN32_WINNT >= 0x0500編譯時(shí),為這個(gè)成員使用OPENFILENAME_SIZE_VERSION_400。
Windows 2000及更高版本:這個(gè)參數(shù)使用sizeof (OPENFILENAME) 。
- hwndOwner
- 指向所有者對(duì)話框窗口的句柄。這個(gè)成員可以是任意有效窗口句柄,或如果對(duì)話框沒(méi)有所有者它可以為NULL。
- hInstance
- 如果在Flags成員中設(shè)置了OFN_ENABLETEMPLATEHANDLE標(biāo)記,hInstance成員指向包含一個(gè)對(duì)話框模板的內(nèi)存對(duì)象。如果OFN_ENABLETEMPLATE標(biāo)記被設(shè)置,hInstance是一個(gè)指向通過(guò)lpTemplateName成員命名的對(duì)話框模板的模塊。如果兩者都沒(méi)有被設(shè)置,這個(gè)成員被忽略。
如果OFN_EXPLORER標(biāo)記被設(shè)置,系統(tǒng)使用Explorer風(fēng)格的默認(rèn)對(duì)話框的子窗口作為指定模板來(lái)建立一個(gè)對(duì)話框。如果OFN_EXPLORER標(biāo)記沒(méi)有被設(shè)置,系統(tǒng)使用模板建立一個(gè)舊風(fēng)格的對(duì)話框。
- lpstrFilter
- 指向一對(duì)以空字符結(jié)束的過(guò)濾字符串的一個(gè)緩沖。緩沖中的最后一個(gè)字符串必須以?xún)蓚€(gè)NULL字符結(jié)束。
第 一個(gè)字符串是過(guò)濾器描述的顯示字符串(例如,“文本文件”),第二個(gè)字符指定過(guò)濾樣式(例如,“*.TXT”)。要為一個(gè)顯示字符串指定多個(gè)過(guò)濾樣式,使 用分號(hào)(“;”)分隔樣式(例如,“*.TXT;*.DOC;*.BAK”)。一個(gè)樣式字符串中可以包含有效的文件名字字符及星號(hào)(*)通配符。不能在樣 式字符串中包含空格。
系統(tǒng)不能改變過(guò)濾器的次序。它按lpstrFilter指定的次序顯示在文件類(lèi)型組合框中。
如果lpstrFilter是NULL,對(duì)話框不能顯示任何過(guò)濾器。
- lpstrCustomFilter
- 指
向一個(gè)靜態(tài)緩沖,它包含了一對(duì)以空字符結(jié)束的過(guò)濾器字符串,這個(gè)字符串是為了保留用戶(hù)選擇的過(guò)濾樣式。第一個(gè)字符串是描述定制過(guò)濾器的顯示字符串,第二個(gè)
字符串是被用戶(hù)選擇的過(guò)濾器樣式。第一次你的應(yīng)用程序建立對(duì)話框,你指定的第一個(gè)字符串可以是任何非空的字符串。當(dāng)用戶(hù)選擇了一個(gè)文件時(shí),對(duì)話框復(fù)制當(dāng)前
過(guò)濾樣式到第二個(gè)字符串。保留過(guò)濾樣式可以是在lpstrFilter緩沖中指定的樣式之一,或是用戶(hù)輸入的過(guò)濾器樣式。在下一次對(duì)話框被建立時(shí)系統(tǒng)使用這個(gè)字符串去初始化用戶(hù)自定義的文件過(guò)濾器。如果nFilterIndex成員是0,對(duì)話框使用定制過(guò)濾器。
如果這個(gè)成員是NULL,對(duì)話框不能保留用戶(hù)自定義過(guò)濾器樣式。
如果這個(gè)成員不是NULL,nMaxCustFilter成員的值必須指定以TCHARs為單位的lpstrCustomFilter緩沖的大小。對(duì)于ANSI版本,是字節(jié)的個(gè)數(shù);對(duì)于Unicode版本,是字符的個(gè)數(shù)。
- nMaxCustFilter
- 指定特意為lpstrCustomFilter準(zhǔn)備的以TCHARs為單位的緩沖大小。對(duì)于ANSI版本,是字節(jié)的個(gè)數(shù);對(duì)于Unicode版本,是字符的個(gè)數(shù)。這緩沖應(yīng)該最小在40個(gè)字符長(zhǎng)。如果lpstrCustomFilter成員是NULL或是指向NULL的字符串,這個(gè)成員被忽略。
- nFilterIndex
- 指定在文件類(lèi)型控件中當(dāng)前選擇的過(guò)濾器的索引。緩沖指向被lpstrFilter包含的一對(duì)定義了的過(guò)濾器的字符串。過(guò)濾器的第一對(duì)字符串的索引值為1,第二對(duì)為2,等等。0索引指出是通過(guò)lpstrCustomFilter指定的定制過(guò)濾器。你可以為對(duì)話框指定一個(gè)索引作為最初的過(guò)濾器描述及過(guò)濾器樣式。當(dāng)用戶(hù)選擇了一個(gè)文件時(shí),nFilterIndex返回當(dāng)前顯示的過(guò)濾器的索引。
如果nFilterIndex是0及lpstrCustomFilter是NULL,系統(tǒng)使用在lpstrFilter緩沖中的第一個(gè)過(guò)濾器。如果所有的三個(gè)成員都是0或NULL,系統(tǒng)不使用任何過(guò)濾器,在對(duì)話框的列表文件中不顯示任何文件。
- lpstrFile
- 指向包含初始化文件名編輯控件使用的文件名的緩沖。如果不需要初始值,這個(gè)緩沖的第一個(gè)字符必須是NULL。當(dāng)GetOpenFileName或GetSaveFileName函數(shù)返回成功時(shí),這個(gè)緩沖包含驅(qū)動(dòng)器,路徑,文件名,及所選擇的文件的擴(kuò)展名。
如 果OFN_ALLOWMULTISELECT標(biāo)記被設(shè)置并且用戶(hù)選擇了多個(gè)文件,緩沖包含了當(dāng)前目錄下被選擇文件的文件名。對(duì)于Explorer風(fēng)格對(duì)話 框,目錄和文件名字符串是被NULL分開(kāi)的,在文件名之后有一個(gè)額外的NULL。對(duì)于舊風(fēng)格對(duì)話框,字符串是被空格分開(kāi)的并且函數(shù)為帶有空格的文件名使用 短文件名。你可以使用FindFirstFile函數(shù)在長(zhǎng)短文件名之間轉(zhuǎn)換。如果用戶(hù)只選擇了一個(gè)文件,lpstrFile字符串在路徑和文件名之間沒(méi)有分隔。
如果緩沖太小,函數(shù)返回FALSE并且CommDlgExtendedError函數(shù)返回FNERR_BUFFERTOOSMALL.。既然這樣,lpstrFile緩沖的首先兩個(gè)字節(jié)包含必需的大?。ㄗ止?jié)或字符)。
- nMaxFile
- 指定lpstrFile緩沖的大小,以TCHARs為單位。對(duì)于ANSI版本,是字節(jié)的個(gè)數(shù);對(duì)于Unicode版本,是字符的個(gè)數(shù)。這個(gè)緩沖必須足夠存儲(chǔ)路徑和文件名字符串,包含結(jié)尾的null字符。如果緩沖太小,GetOpenFileName和GetSaveFileName函數(shù)返回假(FALSE)緩沖最小應(yīng)該在256個(gè)字符長(zhǎng)。
- lpstrFileTitle
- 指向接收選擇的文件的文件名和擴(kuò)展名的緩沖(不帶路徑信息)。這個(gè)成員可以是NULL。
- nMaxFileTitle
- 指定lpstrFileTitle緩沖的大小,以TCHARs為單位。對(duì)于ANSI版本,是字節(jié)的個(gè)數(shù);對(duì)于Unicode版本,是字節(jié)的個(gè)數(shù)。如果lpstrFileTitle是NULL,這個(gè)成員被忽略。
- lpstrInitialDir
- 指
向以空字符結(jié)束的字符串,可以在這個(gè)字符串中指定初始目錄。Pointer to a null terminated string that
can specify the initial directory. 在不同的平臺(tái)上,為選擇初始目錄有不同的運(yùn)算法則。
Windows 2000:
- 如果lpstrFile包含了一個(gè)路徑,這個(gè)路徑就是初始目錄。
- 否則,lpstrInitialDir指定的為初始目錄。
- 如果lpstrInitialDir為NULL,并且當(dāng)前目錄下包含有一些指定過(guò)濾器類(lèi)型的文件,初始目錄就是當(dāng)前目錄。
- 否則,如果應(yīng)用程序在過(guò)去使用過(guò)打開(kāi)哐另存為對(duì)話框,使用最近選擇的路徑作為初始目錄。然而,如果一個(gè)應(yīng)用程序長(zhǎng)時(shí)間沒(méi)有運(yùn)行過(guò),它保存的選擇的路徑將被丟棄。
- 否則,初始目錄是當(dāng)前用戶(hù)的私人文件目錄(即我的文檔)。
- 否則,初始目錄是桌面文件夾。
Windows 98:
- lpstrInitialDir指定初始目錄。
- 如果lpstrInitialDir是NULL并且lpstrFile包含了一個(gè)路徑,那么這個(gè)路徑就是初始目錄。
- 否則,如果當(dāng)前目錄包含了一些指定的過(guò)濾類(lèi)型的文件,那么初始化目錄是當(dāng)前目錄。
- 否則,初始目錄是當(dāng)前用戶(hù)的私人文件目錄(即我的文檔)。
Windows和Windows NT/ 2000的早期版本:
- lpstrInitialDir指定初始目錄。
- 如果lpstrInitialDir是NULL并且lpstrFile包含了一個(gè)路徑,那么這個(gè)路徑就是初始目錄。
- 否則,初始目錄是當(dāng)前目錄。
- lpstrTitle
- 指向在對(duì)話框的標(biāo)題欄中放置的字符串。如果這個(gè)成員是NULL,系統(tǒng)使用默認(rèn)標(biāo)題(另存為或打開(kāi))
- Flags
- 位標(biāo)記的設(shè)置,你可以使用來(lái)初始化對(duì)話框。當(dāng)對(duì)話框返回時(shí),它設(shè)置的這些標(biāo)記指出用戶(hù)的輸入。這個(gè)成員可以是下列標(biāo)記的組合。
標(biāo)記 含意 OFN_ALLOWMULTISELECT 指定文件名列表框允許多選。如果同時(shí)你設(shè)置了OFN_EXPLORER標(biāo)記,對(duì)話框使用Explorer風(fēng)格用戶(hù)界面;否則它使用舊風(fēng)格用戶(hù)界面。 如果用戶(hù)選擇了一個(gè)以上的文件,lpstrFile緩沖返回當(dāng)前目錄下所有被選擇的文件的文件名。nFileOffset成員是到第一個(gè)文件名的偏移量(字節(jié)或字符),并且nFileExtension成 員不被使用。對(duì)于Explorer風(fēng)格對(duì)話框,目錄和文件名是被NULL分隔的,在最后的文件名后帶有額外的NULL。這個(gè)格式使Explorer風(fēng)格的 對(duì)話框能返回包含空格的長(zhǎng)文件名。對(duì)于舊風(fēng)格對(duì)話框,目錄和文件字符串是被空格分隔的,函數(shù)為帶有空格的文件名使用短文件名。你可以使用FindFirstFile函數(shù)在短文件名和長(zhǎng)文件名之間轉(zhuǎn)換。
如果你為一個(gè)舊風(fēng)格對(duì)話框指定了一個(gè)定制的模板,文件名列表框的定義必須包含LBS_EXTENDEDSEL值。
OFN_CREATEPROMPT 如 果用戶(hù)指定了一個(gè)不存在的文件,這個(gè)標(biāo)記使用對(duì)話框能提示用戶(hù)是否新建這個(gè)文件。如果用戶(hù)選擇了新建這個(gè)文件,對(duì)話框關(guān)閉并且函數(shù)返回指定的名字;否則, 對(duì)話框繼續(xù)停留。如果你使用帶有OFN_ALLOWMULTISELECT標(biāo)記的這個(gè)標(biāo)記,對(duì)話框允許用戶(hù)去指定一個(gè)不存在的文件。 OFN_DONTADDTORECENT Windows 2000:防止系統(tǒng)為選擇的文件增加快捷鏈接到最近使用文檔中。要找回目錄的位置,調(diào)用還有CSIDL_RECENT標(biāo)記的SHGetSpecialFolderLocation函數(shù)。 OFN_ENABLEHOOK 激活在lpfnHook成員中指定的鉤子函數(shù)。 OFN_ENABLEINCLUDENOTIFY Windows 2000:當(dāng)用戶(hù)打開(kāi)一個(gè)文件夾時(shí),引起對(duì)話框發(fā)送CDN_INCLUDEITEM通知消息到你的OFNHookProc程序。對(duì)話框?yàn)樵谧罱蜷_(kāi)的文件夾中的每一個(gè)項(xiàng)目發(fā)送一個(gè)通知。這些消息使你能夠控制那些在對(duì)話框中顯示的文件夾項(xiàng)目的列表。 OFN_ENABLESIZING Windows 2000,Windows 98:使Explorer風(fēng)格的對(duì)話框可以使用鼠標(biāo)或鍵盤(pán)調(diào)整大小。缺省時(shí),Explorer風(fēng)格的打開(kāi)和另存為對(duì)話框允許被調(diào)整大小,不顧這個(gè)標(biāo)記是否被設(shè)置。這標(biāo)記僅在你提供了一個(gè)鉤子程序或定制模板時(shí)是必需的。舊風(fēng)格的對(duì)話框不允許調(diào)整大小。 OFN_ENABLETEMPLATE 指出lpTemplateName成員是指向?qū)υ捒蚰0遒Y源的名字,這個(gè)模板資源在能被hInstance成員識(shí)別的模塊中。 如果OFN_EXPLORER標(biāo)記被設(shè)置,系統(tǒng)使用指定的模板去建立一個(gè)對(duì)話框,是默認(rèn)Explorer風(fēng)格對(duì)話框的子窗口。如果OFN_EXPLORER標(biāo)記沒(méi)有被設(shè)置,系統(tǒng)使用舊風(fēng)格的對(duì)話框替代默認(rèn)的對(duì)話框。
OFN_ENABLETEMPLATEHANDLE 指出hInstance成員能識(shí)別的包含預(yù)載對(duì)話框模板的數(shù)據(jù)塊。如果這個(gè)標(biāo)記被指定的,系統(tǒng)忽略lpTemplateName。 如果OFN_EXPLORER標(biāo)記被設(shè)置,系統(tǒng)使用指定的模板去建立一個(gè)對(duì)話框,是默認(rèn)Explorer風(fēng)格對(duì)話框的子窗口。如果OFN_EXPLORER標(biāo)記沒(méi)有被設(shè)置,系統(tǒng)使用模板去建立一個(gè)舊風(fēng)格對(duì)話框替代默認(rèn)對(duì)話框。
OFN_EXPLORER 指出任何打開(kāi)或另存為對(duì)話框使用新的Explorer風(fēng)格的用戶(hù)化模塊。關(guān)于更多的信息,參見(jiàn)Explorer-Style Hook Procedures和Explorer-Style Custom Templates。 缺省下,打開(kāi)和另存為對(duì)話框使用Explorer風(fēng)格用戶(hù)界面,不顧這個(gè)標(biāo)記是否設(shè)置。這個(gè)標(biāo)記僅在你提供了一個(gè)鉤子程序或定制模板或設(shè)置了OFN_ALLOWMULTISELECT標(biāo)記時(shí)是必需的。
如果你想使用舊風(fēng)格的界面,省略O(shè)FN_EXPLORER 標(biāo)記,并且提供一個(gè)代替的舊風(fēng)格模板或鉤子程序。如果你想用舊風(fēng)格但不需要一個(gè)定制模板或鉤子程序,簡(jiǎn)單的提供一個(gè)鉤子程序,讓它返回FALSE。
OFN_EXTENSIONDIFFERENT 指定用戶(hù)輸入的一個(gè)文件的擴(kuò)展名與lpstrDefExt指定的擴(kuò)展名不同。如果lpstrDefExt是NULL,函數(shù)不使用這個(gè)標(biāo)記。 OFN_FILEMUSTEXIST 指定用戶(hù)僅可以在文件名登錄字段中輸入已存在的文件的名字。如果這個(gè)標(biāo)記被指定的并且用戶(hù)輸入了一個(gè)無(wú)效的名字,對(duì)話框程序顯示一個(gè)等待消息框。如果這個(gè)標(biāo)記被指定,OFN_PATHMUSTEXIST標(biāo)記也被使用。 OFN_FORCESHOWHIDDEN Windows 2000:強(qiáng)制顯示系統(tǒng)和隱藏屬性的文件,從而壓倒用戶(hù)設(shè)置的顯示或不顯示隱藏文件。否則,帶有系統(tǒng)和隱藏標(biāo)記的文件不被顯示。 OFN_HIDEREADONLY 隱藏只讀復(fù)選框。 OFN_LONGNAMES 對(duì)于舊風(fēng)格對(duì)話框,這個(gè)標(biāo)記引起對(duì)話框使用長(zhǎng)文件名。如果這個(gè)標(biāo)記沒(méi)有被指定,或如果OFN_ALLOWMULTISELECT標(biāo)記也被設(shè)置,舊風(fēng)格對(duì)話框?yàn)閹в锌崭竦奈募褂枚涛募?.3格式)。 Explorer風(fēng)格對(duì)話框忽略這個(gè)標(biāo)記,通常顯示長(zhǎng)文件名。
OFN_NOCHANGEDIR 如果當(dāng)搜索文件時(shí)用戶(hù)改變了目錄的時(shí)候,恢復(fù)當(dāng)前目錄到它的初始值。 OFN_NODEREFERENCELINKS 引導(dǎo)對(duì)話框?yàn)檫x擇的快捷方式(.LNK)文件返回路徑和文件名。如果這個(gè)值沒(méi)有被指定,對(duì)話框返回這個(gè)快捷方式所引用文件的路徑和文件名。 OFN_NOLONGNAMES 對(duì)于舊風(fēng)格對(duì)話框,這個(gè)標(biāo)識(shí)引起對(duì)話框去使用短文件名(8.3格式)。 Explorer風(fēng)格對(duì)話框忽略這個(gè)標(biāo)記,通常顯示長(zhǎng)文件名。
OFN_NONETWORKBUTTON 隱藏和顯示風(fēng)格按鈕。 OFN_NOREADONLYRETURN 指定返回的文件不帶有只讀復(fù)選框,不是在寫(xiě)保護(hù)的目錄中。 OFN_NOTESTFILECREATE 指 定文件不是在對(duì)話框關(guān)閉前建立的。如果應(yīng)用程序保存文件到一個(gè)建立的非映象風(fēng)格共享上,這個(gè)標(biāo)記應(yīng)該被指定的。當(dāng)一個(gè)應(yīng)用程序指定了這標(biāo)記,庫(kù)不能檢查寫(xiě) 保護(hù),磁盤(pán)滿(mǎn),打開(kāi)驅(qū)動(dòng)器門(mén)或網(wǎng)絡(luò)保護(hù)。應(yīng)用程序使用這個(gè)標(biāo)記必須小心執(zhí)行文件操作,因?yàn)橐坏┪募魂P(guān)閉,它不能重新打開(kāi)。 OFN_NOVALIDATE 指定公共對(duì)話框允許在返回的文件名中有無(wú)效的字符。典型的,正在調(diào)用的程序使用一個(gè)鉤子程序通過(guò)FILEOKSTRING消息檢查文件名。如果在編輯控件中的文本框是空的或只包含了空格,那么文件和目錄列表框是被更新的。如果編輯控件中的文本框包含了別的東西,那么nFileOffset和nFileExtension的設(shè)置值是通過(guò)分析文本產(chǎn)生的。沒(méi)有默認(rèn)的擴(kuò)展名被添加到文本,也沒(méi)有文本被復(fù)制到lpstrFileTitle指定的緩沖。 如果通過(guò)nFileOffset指定的值比0小,文件是無(wú)效的。否則,文件名是有效的。如果OFN_NOVALIDATE沒(méi)有被指定,nFileExtension和nFileOffset可以被使用。
OFN_OVERWRITEPROMPT 如果選擇的文件已經(jīng)存在,使用另存為對(duì)話框產(chǎn)生一個(gè)消息框。用戶(hù)必須確認(rèn)是否復(fù)蓋這個(gè)文件。 OFN_PATHMUSTEXIST< />
posted on 2007-07-29 17:06 楊粼波 閱讀(834) 評(píng)論(0) 編輯 收藏 引用