OPENFILENAME

OPENFILENAME

OPENFILENAME結構包含了GetOpenFileNameGetSaveFileName函式用來初始化打開或另外儲存為對話框的信息。在用戶關閉對話框後,系統返回關於用戶的選擇信息到這個結構中。

基本介紹

程式,結構體原型,成員,

程式

/*by:格子*/
/*打開檔案對話框代碼*/
#include <stdio.h>
#include <gtk/gtk.h>
#include <Windows.h>
int on_open_file(GtkWidget *
Widget,int data);
int main(int argc, char *argv[])
{
gtk_init(NULL,NULL);
GtkWindow* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(window,"destroy",gtk_main_quit,NULL);
gtk_widget_show(window);
GtkButton *button = gtk_button_new_with_label("打開對話框");
g_signal_connect(button,"clicked",on_open_file,NULL);
gtk_widget_show(button);
gtk_container_add(window,button);
gtk_main();
return 0;
}
int on_open_file(GtkWidget *
Widget,int data)
{
/*執行打開對話框選擇檔案主要代碼*/
char szBuffer[1024] = { 0 };
OPENFILENAME ofn = { 0 };
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFilter = "*.*\0*.*\0\0";//要選擇的檔案後綴
ofn.lpstrInitialDir = "D:\\";//默認的檔案路徑
ofn.lpstrFile = szBuffer;//存放檔案的緩衝區
ofn.nMaxFile = sizeof(szBuffer) / sizeof(*szBuffer);
ofn.nFilterIndex = 0;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER;//標誌如果是多選要加上OFN_ALLOWMULTISELECT
BOOL bSel =
GetOpenFileName(&ofn);
MessageBoxA(NULL,szBuffer,"!",MB_OK);//在
訊息框顯示所選檔案路徑
}

結構體原型

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
指定這個結構的大小,以位元組為單位。
Windows 95/98和Windows NT 4.0:特意為Windows 95/98或Windows NT 4.0,及帶有WINVER和_WIN32_WINNT >= 0x0500編譯時,為這個成員使用OPENFILENAME_SIZE_VERSION_400。
Windows 2000及更高版本:這個參數使用sizeof (OPENFILENAME) 。
hwndOwner
指向所有者對話框視窗的句柄。這個成員可以是任意有效視窗句柄,或如果對話框沒有所有者它可以為NULL。
hInstance
如果在Flags成員中設定了OFN_ENABLETEMPLATEHANDLE標記,hInstance成員指向包含一個對話框模板的記憶體對象。如果OFN_ENABLETEMPLATE標記被設定,hInstance是一個指向通過lpTemplateName成員命名的對話框模板的模組。如果兩者都沒有被設定,這個成員被忽略。
如果OFN_EXPLORER標記被設定,系統使用Explorer風格的默認對話框的子視窗作為指定模板來建立一個對話框。如果OFN_EXPLORER標記沒有被設定,系統使用模板建立一個舊風格的對話框。
lpstrFilter
指向一對以空字元結束的過濾字元串的一個緩衝。緩衝中的最後一個字元串必須以兩個NULL字元結束。
第一個字元串是過濾器描述的顯示字元串(例如,“文本檔案”),第二個字元指定過濾樣式(例如,“*.TXT”)。要為一個顯示字元串指定多個過濾樣式,使用分號(“;”)分隔樣式(例如,“*.TXT;*.DOC;*.BAK”)。一個樣式字元串中可以包含有效的檔案名稱字字元及星號(*)通配符。不能在樣式字元串中包含空格。
系統不能改變過濾器的次序。它按lpstrFilter指定的次序顯示在檔案類型組合框中。
如果lpstrFilter是NULL,對話框不能顯示任何過濾器。
lpstrCustomFilter
指向一個靜態緩衝,它包含了一對以空字元結束的過濾器字元串,這個字元串是為了保留用戶選擇的過濾樣式。第一個字元串是描述定製過濾器的顯示字元串,第二個字元串是被用戶選擇的過濾器樣式。第一次你的應用程式建立對話框,你指定的第一個字元串可以是任何非空的字元串。當用戶選擇了一個檔案時,對話框複製當前過濾樣式到第二個字元串。保留過濾樣式可以是在lpstrFilter緩衝中指定的樣式之一,或是用戶輸入的過濾器樣式。在下一次對話框被建立時系統使用這個字元串去初始化用戶自定義的檔案過濾器。如果nFilterIndex成員是0,對話框使用定製過濾器。
如果這個成員是NULL,對話框不能保留用戶自定義過濾器樣式。
如果這個成員不是NULL,nMaxCustFilter成員的值必須指定以TCHARs為單位的lpstrCustomFilter緩衝的大小。對於ANSI版本,是位元組的個數;對於Unicode版本,是字元的個數。
nMaxCustFilter
指定特意為lpstrCustomFilter準備的以TCHARs為單位的緩衝大小。對於ANSI版本,是位元組的個數;對於Unicode版本,是字元的個數。這緩衝應該最小在40個字元長。如果lpstrCustomFilter成員是NULL或是指向NULL的字元串,這個成員被忽略。
nFilterIndex
指定在檔案類型控制項中當前選擇的過濾器的索引。緩衝指向被lpstrFilter包含的一對定義了的過濾器的字元串。過濾器的第一對字元串的索引值為1,第二對為2,等等。0索引指出是通過lpstrCustomFilter指定的定製過濾器。你可以為對話框指定一個索引作為最初的過濾器描述及過濾器樣式。當用戶選擇了一個檔案時,nFilterIndex返回當前顯示的過濾器的索引。
如果nFilterIndex是0及lpstrCustomFilter是NULL,系統使用在lpstrFilter緩衝中的第一個過濾器。如果所有的三個成員都是0或NULL,系統不使用任何過濾器,在對話框的列表檔案中不顯示任何檔案。
lpstrFile
指向包含初始化檔案名稱編輯控制項使用的檔案名稱的緩衝。如果不需要初始值,這個緩衝的第一個字元必須是NULL。當GetOpenFileNameGetSaveFileName函式返回成功時,這個緩衝包含驅動器,路徑,檔案名稱,及所選擇的檔案的擴展名。
如果OFN_ALLOWMULTISELECT標記被設定並且用戶選擇了多個檔案,緩衝包含了當前目錄下被選擇檔案的檔案名稱。對於Explorer風格對話框,目錄和檔案名稱字元串是被NULL分開的,在檔案名稱之後有一個額外的NULL。對於舊風格對話框,字元串是被空格分開的並且函式為帶有空格的檔案名稱使用短檔案名稱。你可以使用FindFirstFile函式在長短檔案名稱之間轉換。如果用戶只選擇了一個檔案,lpstrFile字元串在路徑和檔案名稱之間沒有分隔。
如果緩衝太小,函式返回FALSE並且CommDlgExtendedError函式返回FNERR_BUFFERTOOSMALL.。既然這樣,lpstrFile緩衝的首先兩個位元組包含必需的大小(位元組或字元)。
nMaxFile
指定lpstrFile緩衝的大小,以TCHARs為單位。對於ANSI版本,是位元組的個數;對於Unicode版本,是字元的個數。這個緩衝必須足夠存儲路徑和檔案名稱字元串,包含結尾的null字元。如果緩衝太小,GetOpenFileNameGetSaveFileName函式返回假(FALSE)緩衝最小應該在256個字元長。
lpstrFileTitle
指向接收選擇的檔案的檔案名稱和擴展名的緩衝(不帶路徑信息)。這個成員可以是NULL。
nMaxFileTitle
指定lpstrFileTitle緩衝的大小,以TCHARs為單位。對於ANSI版本,是位元組的個數;對於Unicode版本,是字元的個數。如果lpstrFileTitle是NULL,這個成員被忽略。
lpstrInitialDir
指向以空字元結束的字元串,可以在這個字元串中指定初始目錄。Pointer to a null terminated string that can specify the initial directory. 在不同的平台上,為選擇初始目錄有不同的運算法則。
Windows 7:
如果lpstrInitialDir與應用程式第一次使用打開或另外儲存為對話框的值相同,路徑由用戶選擇作為初始目錄。
否則,如果lpstrFile包含路徑,路徑是初始目錄。
否則,如果lpstrInitialDir不是NULL,它指定初始目錄。
如果lpstrInitialDir為NULL,並且當前目錄包含有一些指定過濾器類型的檔案,初始目錄是當前目錄。
否則,初始目錄是當前用戶的個人目錄(即我的文檔)。
否則,初始目錄是桌面資料夾。
Windows 2000:
如果lpstrFile包含了一個路徑,這個路徑就是初始目錄。
否則,lpstrInitialDir指定的為初始目錄。
如果lpstrInitialDir為NULL,並且當前目錄下包含有一些指定過濾器類型的檔案,初始目錄就是當前目錄。
否則,如果應用程式在過去使用過打開哐另外儲存為對話框,使用最近選擇的路徑作為初始目錄。然而,如果一個應用程式長時間沒有運行過,它保存的選擇的路徑將被丟棄。
否則,初始目錄是當前用戶的私人檔案目錄(即我的文檔)。
否則,初始目錄是桌面資料夾。
Windows 98:
lpstrInitialDir指定初始目錄。
如果lpstrInitialDir是NULL並且lpstrFile包含了一個路徑,那么這個路徑就是初始目錄。
否則,如果當前目錄包含了一些指定的過濾類型的檔案,那么初始化目錄是當前目錄。
否則,初始目錄是當前用戶的私人檔案目錄(即我的文檔)。
Windows和Windows NT/ 2000的早期版本:
lpstrInitialDir指定初始目錄。
如果lpstrInitialDir是NULL並且lpstrFile包含了一個路徑,那么這個路徑就是初始目錄。
否則,初始目錄是當前目錄。
lpstrTitle
指向在對話框標題欄中放置的字元串。如果這個成員是NULL,系統使用默認標題(另外儲存為或打開)
Flags
位標記的設定,你可以使用來初始化對話框。當對話框返回時,它設定的這些標記指出用戶的輸入。這個成員可以是下列標記的組合。 標記 含意
OFN_ALLOWMULTISELECT指定檔案名稱列表框允許多選。如果同時你設定了OFN_EXPLORER標記,對話框使用Explorer風格用戶界面;否則它使用舊風格用戶界面。
如果用戶選擇了一個以上的檔案,lpstrFile緩衝返回當前目錄下所有被選擇的檔案的檔案名稱。nFileOffset成員是到第一個檔案名稱的偏移量(位元組或字元),並且nFileExtension成員不被使用。對於Explorer風格對話框,目錄和檔案名稱是被NULL分隔的,在最後的檔案名稱後帶有額外的NULL。這個格式使Explorer風格的對話框能返回包含空格的長檔案名稱。對於舊風格對話框,目錄和檔案字元串是被空格分隔的,函式為帶有空格的檔案名稱使用短檔案名稱。你可以使用FindFirstFile函式在短檔案名稱和長檔案名稱之間轉換。
如果你為一個舊風格對話框指定了一個定製的模板,檔案名稱列表框的定義必須包含LBS_EXTENDEDSEL值。
OFN_CREATEPROMPT如果用戶指定了一個不存在的檔案,這個標記使用對話框能提示用戶是否新建這個檔案。如果用戶選擇了新建這個檔案,對話框關閉並且函式返回指定的名字;否則,對話框繼續停留。如果你使用帶有OFN_ALLOWMULTISELECT標記的這個標記,對話框允許用戶去指定一個不存在的檔案。
OFN_DONTADDTORECENTWindows 2000:防止系統為選擇的檔案增加快捷連結到最近使用文檔中。要找回目錄的位置,調用還有CSIDL_RECENT標記的SHGetSpecialFolderLocation函式。
OFN_ENABLEHOOK激活在lpfnHook成員中指定的鉤子函式
OFN_ENABLEINCLUDENOTIFYWindows 2000:當用戶打開一個資料夾時,引起對話框傳送CDN_INCLUDEITEM通知訊息到你的OFNHookProc程式。對話框為在最近打開的資料夾中的每一個項目傳送一個通知。這些訊息使你能夠控制那些在對話框中顯示的資料夾項目的列表。
OFN_ENABLESIZINGWindows 2000,Windows 98:使Explorer風格的對話框可以使用滑鼠或鍵盤調整大小。預設時,Explorer風格的打開和另外儲存為對話框允許被調整大小,不顧這個標記是否被設定。這標記僅在你提供了一個鉤子程式或定製模板時是必需的。舊風格的對話框不允許調整大小。
OFN_ENABLETEMPLATE指出lpTemplateName成員是指向對話框模板資源的名字,這個模板資源在能被hInstance成員識別的模組中。
如果OFN_EXPLORER標記被設定,系統使用指定的模板去建立一個對話框,是默認Explorer風格對話框的子視窗。如果OFN_EXPLORER標記沒有被設定,系統使用舊風格的對話框替代默認的對話框。
OFN_ENABLETEMPLATEHANDLE指出hInstance成員能識別的包含預載對話框模板的數據塊。如果這個標記被指定的,系統忽略lpTemplateName。
如果OFN_EXPLORER標記被設定,系統使用指定的模板去建立一個對話框,是默認Explorer風格對話框的子視窗。如果OFN_EXPLORER標記沒有被設定,系統使用模板去建立一個舊風格對話框替代默認對話框。
OFN_EXPLORER指出任何打開或另外儲存為對話框使用新的Explorer風格的用戶化模組。關於更多的信息,參見Explorer-Style Hook Procedures和Explorer-Style Custom Templates。
預設下,打開和另外儲存為對話框使用Explorer風格用戶界面,不顧這個標記是否設定。這個標記僅在你提供了一個鉤子程式或定製模板或設定了OFN_ALLOWMULTISELECT標記時是必需的。
如果你想使用舊風格的界面,省略OFN_EXPLORER 標記,並且提供一個代替的舊風格模板或鉤子程式。如果你想用舊風格但不需要一個定製模板或鉤子程式,簡單的提供一個鉤子程式,讓它返回FALSE。
OFN_EXTENSIONDIFFERENT指定用戶輸入的一個檔案的擴展名與lpstrDefExt指定的擴展名不同。如果lpstrDefExt是NULL,函式不使用這個標記。
OFN_FILEMUSTEXIST指定用戶僅可以在檔案名稱登錄欄位中輸入已存在的檔案的名字。如果這個標記被指定的並且用戶輸入了一個無效的名字,對話框程式顯示一個等待訊息框。如果這個標記被指定,OFN_PATHMUSTEXIST標記也被使用。
OFN_FORCESHOWHIDDENWindows 2000:強制顯示系統和隱藏屬性的檔案,從而壓倒用戶設定的顯示或不顯示隱藏檔案。否則,帶有系統和隱藏標記的檔案不被顯示。
OFN_HIDEREADONLY隱藏唯讀複選框
OFN_LONGNAMES對於舊風格對話框,這個標記引起對話框使用長檔案名稱。如果這個標記沒有被指定,或如果OFN_ALLOWMULTISELECT標記也被設定,舊風格對話框為帶有空格的檔案名稱使用短檔案名稱(8.3格式)。
Explorer風格對話框忽略這個標記,通常顯示長檔案名稱。
OFN_NOCHANGEDIR如果當搜尋檔案時用戶改變了目錄的時候,恢復當前目錄到它的初始值。
OFN_NODEREFERENCELINKS引導對話框為選擇的捷徑(.LNK)檔案返迴路徑和檔案名稱。如果這個值沒有被指定,對話框返回這個捷徑所引用檔案的路徑和檔案名稱。
OFN_NOLONGNAMES對於舊風格對話框,這個標識引起對話框去使用短檔案名稱(8.3格式)。
Explorer風格對話框忽略這個標記,通常顯示長檔案名稱
OFN_NONETWORKBUTTON隱藏和顯示風格按鈕。
OFN_NOREADONLYRETURN指定返回的檔案不帶有隻讀複選框,不是在防寫的目錄中。
OFN_NOTESTFILECREATE指定檔案不是在對話框關閉前建立的。如果應用程式保存檔案到一個建立的非映象風格共享上,這個標記應該被指定的。當一個應用程式指定了這標記,庫不能檢查防寫,磁碟滿,打開驅動器門或網路保護。應用程式使用這個標記必須小心執行檔案操作,因為一旦檔案被關閉,它不能重新打開。
OFN_NOVALIDATE 指定公共對話框允許在返回的檔案名稱中有無效的字元。典型的,正在調用的程式使用一個鉤子程式通過FILEOKSTRING訊息檢查檔案名稱。如果在編輯控制項中的文本框是空的或只包含了空格,那么檔案和目錄列表框是被更新的。如果編輯控制項中的文本框包含了別的東西,那么nFileOffset和nFileExtension的設定值是通過分析文本產生的。沒有默認的擴展名被添加到文本,也沒有文本被複製到lpstrFileTitle指定的緩衝。
如果通過nFileOffset指定的值比0小,檔案是無效的。否則,檔案名稱是有效的。如果OFN_NOVALIDATE沒有被指定,nFileExtension和nFileOffset可以被使用。
OFN_OVERWRITEPROMPT如果選擇的檔案已經存在,使用另外儲存為對話框產生一個訊息框。用戶必須確認是否覆蓋這個檔案。
OFN_PATHMUSTEXIST指定用戶僅能輸入的路徑和檔案名稱。如果這個標記被使用並且用戶在檔案名稱輸入欄位中鍵入了一個用效的路徑和檔案名稱,對話框函式顯示一個等待訊息。
OFN_READONLY當對話框建立時,顯示被選擇的唯讀複選框。這個標記指出當對話框被關閉時唯讀複選框的狀態。
OFN_SHAREAWARE指出如果調用OpenFile函式因為網路共享衝突而失敗,這個錯誤被忽略並且對話框返回選擇的檔案名稱。
如果這個標記沒有被設定,當用戶選擇的檔案名稱發生網路共享衝突時,對話框傳送通知到你的鉤子程式。如果你設定了OFN_EXPLORER標記,對話框傳送CDN_SHAREVIOLATION訊息到鉤子程式。如果你沒有設定OFN_EXPLORER,對話框傳送SHAREVISTRING註冊的訊息到鉤子程式。
OFN_SHOWHELP使對話框顯示幫助按鈕。hwndOwner成員必須指定一個視窗,這個視窗作為接收對話框傳送的HELPMSGSTRING註冊的訊息,當用戶單擊幫助按鈕時對話框傳送這個訊息。
當用戶單擊幫助按鈕時,一個Explorer風格的對話框傳送CDN_HELP通知訊息到你的鉤子程式
nFileOffset
指定從路徑開始到通過lpstrFile指定的檔案名稱字元串基於0的偏移,以TCHARs為單位。對於ANSI版本,是位元組的個數;對於Unicode版本,是字元的個數。例如,如果lpstrFile指向下列的字元串,“c:\dir1\dir2\file.ext”,這個成員包含指出“file.ext”字元串偏移的位置值13。
如果用戶選擇了多於一個的檔案,nFileOffset是到第一個檔案名稱的偏移。
nFileExtension
指定從路徑開始到通過lpstrFile指定的檔案名稱字元串中擴展名基於0的偏移,以TCHARs為單位。對於ANSI版本,是位元組的個數;對於Unicode版本,是字元的個數。例如,如果lpstrFile指向下列的字元串,“c:\dir1\dir2\file.ext”,這個成員包含的值是18。如果用戶沒有輸入一個擴展名並且lpstrDefExt是NULL,這個成員指定的偏移是結束字元NULL。如果用戶在檔案名稱中輸入一個“.”作為最後的字元,這個成員是0。
lpstrDefExt
指向包含默認擴展名的緩衝。如果用戶忘記輸入擴展名,GetOpenFileNameGetSaveFileName附加這個擴展名到檔案名稱中。這個字元串可以是任一長度,但但只有頭三個字元被附加。字元串不應該包含一個句點(.)。如果這個成員是NULL並且用戶忘記了輸入一個擴展名,那么將沒有擴展名被附加。
lCustData
指定應用程式定義的數據,這數據是能被lpfnHook成員識別的系統傳到的鉤子程式。當系統傳送WM_INITDIALOG訊息到程式,訊息的lParam參數指向當對話框建立時指定的OPENFILENAME結構。鉤子程式可以使用這個指針獲得lCustData的值。
lpfnHook
指向一個鉤子程式。除非Flags成員中包含OFN_ENABLEHOOK標記,要么這個成員將被忽略。
如果在Flags成員中OFN_EXPLORER標記沒有被設定,lpfnHook指向一個OFNHookProcOldStyle鉤子程式,這個程式有意的從對話框接收訊息。鉤子程式返回FALSE傳遞一個訊息到默認的對話框程式或返回TRUE丟棄訊息。
如果OFN_EXPLORER被設定,lpfnHook指向一個OFNHookProc鉤子程式。這個鉤子程式接收從對話框發出的通知訊息。這個鉤子程式也接收你通過一個子對話框模板定義的附加控制項的訊息。鉤子程式不有意接收默認對話框的標準控制項的訊息。
lpTemplateName
指向一個以空字元結束的字元串,字元串是對話框模板資源的名字,資源保存在能被hInstance成員識別的模組中。對於有限的對話框資源,這可以是通過MAKEINTRESOURCE返回的值。除非在Flags成員中設定了OFN_ENABLETEMPLATE標記,要么這個成員被忽略。
如果OFN_EXPLORER標記被設定,系統使用指定的模板去建立一個對話框,是默認Explorer風格對話框的子視窗。如果OFN_EXPLORER標記沒有被設定,系統使用模板去建立一個舊風格的對話框來替代默認對話框。
pvReserved
保留。
dwReserved
保留。
FlagsEx
Windows 2000:設定位標記,你可以使用來初始化對話框。這個成員可以是下列標記的組合。 標記 含意
OFN_EX_NOPLACESBAR如果這個標記被設定,則位置欄被不顯示。如果這個標記沒有設定,則Explorer風格的對話框包含一般使用檔案圖示的位置欄,例如像收藏夾和桌面。
切記:#include <Commdlg.h>

相關詞條

熱門詞條

聯絡我們