GetOpenFileName GetSaveFileName
BOOL GetOpenFileName(
LPOPENFILENAME lpofn
);
BOOL GetSaveFileName(
LPOPENFILENAME lpofn
);
먼저 GetOpenFileName 을 소개하고자 한다. 다이얼로그박스 초기화 구조체, 이 구조체는 사용자의 파일선택정보를 저장한다.
리턴 값 사용자가 한 파일이나 OK 버튼을 클릭하면 0이 아닌값을 리턴한다.
취소나 실패했을 땐 0을 리턴한다.
음 다음으로 OPENFILENAME 구조체를 설명한다.
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;
DWORD lCustData;
LPOFNHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
} OPENFILENAME;
보시다 시피 멤버가 엄청 많다. 2000이상에서 또 3개의 멤버가 추가되었다 -_-..
lStructSize
이 멤버는 그냥 sizeof(OPENFILENAME); 를 대입해 주면 된다.
hwndOwner
대화 상자의 주인을 설정한다. 설정하면 그 대화상자가 끝나기 전까지 주인 윈도우는 사용하지 못한다. NULL 로 설정하면 다른 작업이 가능하다.
lpstrFilter
열 파일의 타입을 지정하는 곳이다. exe 파일이나 php 파일이나 txt 파일등을 지정할 수 있다. (알려지지 않은 파일도 지정할 수 있다.)
지정하는 방법은 \0 로 구분해서 쓰는 방법인데, 형식은 이렇다.
="모오든 파일\0*.*\0문서파일\0*.txt;*.doc;*.hwp\0"
="Every File(*.*)\0*.*\0Text File\0*.txt;*.doc\0";
lpstrFile
이 멤버엔 전체경로가 들어간다.
nMaxFile
적어도 256 이상은 넣어야 한다. 그냥 256 대입해주자.
lpstrFileTitle
파일 이름을 받는다. 필요없으면 NULL
nMaxFileTitle
파일 이름의 최대 길이
그러니까 char FileTitle[256];
lpstrFileTitle = FileTitle; 이라고 했으면 여기엔 256 을 넣는게 좋다.
더 작은 배열의 크기로 할당했으면 이 값도 바뀌어야 한다.
lpstrInitialDir
파일 열기창이 시작되는 디렉토리, 2000 에서는 이 멤버보다 lpstrFile 멤버가 더 우선순위가 높다.
lpstrTitle
열기 박스의 제목 지정.
Flags
......MSDN 참고하기 바란다.
nFileOffset
파일명이 시작되는 위치를 리턴한다. lpstrFile 에서 이 멤버만큼 더하면 그게 파일 이름이다.
nFileExtension
위와 같다. 다른건 한가지, 확장자가 시작되는 위치를 리턴한다. 확장자가 입력되지 않았을 경우엔 NULL 을 가리킨다.
lpstrDefExt
확장자를 입력하지 않았을 경우 디폴트 확장자를 지정한다.
이 정도면 사용하는데 무리없을 듯 싶다. -_-+
예제코드
#define MAX_PATH 256;
OPENFILENAME ofn;
char File[MAX_PATH+1];
ZeroMemory(File, sizeof File); ZeroMemory(&ofn, sizeof ofn);
ofn.lStructSize = sizeof ofn;
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = "실행파일\0*.exe\0\0";
ofn.lpstrFile = File;
ofn.nMaxFile = MAX_PATH;
GetOpenFileName(&ofn)
주의할 점은 문자열을 초기화 시켜주지 않으면 창이 뜨지 않는다.