GetOpenFileName

원형

BOOL GetOpenFileName(LPOPENFILENAME lpofn);

MFC 원형

해당하는 함수 없음

인수

▶lpofn : 파일 열기 공통 대화상자 초기화에 사용될 OPENFILENAME 구조체의 포인터. 이 구조체의 대화상자의 옵션을 설정한 후 GetOpenFileName 함수를 호출하며 사용자의 선택 결과도 이 구조체로 리턴받는다.

리턴

사용자가 확인(OK) 버튼을 눌러 파일을 선택했으면 0이 아닌 값이 리턴되며 파일 선택을 취소했거나 에러가 발생했으면 0이 리턴된다. 에러 발생시 CommonDlgExtendedError 함수로 에러 코드를 조사할 수 있으며 다음 에러 중 하나가 리턴된다.

CDERR_DIALOGFAILURE
CDERR_FINDRESFAILURE
CDERR_NOHINSTANCE
CDERR_INITIALIZATION
CDERR_NOHOOK
CDERR_LOCKRESFAILURE
CDERR_NOTEMPLATE
CDERR_LOADRESFAILURE
CDERR_STRUCTSIZE
CDERR_LOADSTRFAILURE
FNERR_BUFFERTOOSMALL
CDERR_MEMALLOCFAILURE
FNERR_INVALIDFILENAME
CDERR_MEMLOCKFAILURE
FNERR_SUBCLASSFAILURE

설명

파일 입출력을 하기 전에 대상 파일을 입력받기 위해 이 함수를 호출한다. 이 함수는 lpofn 구조체의 설정대로 파일 열기 공통 대화상자를 열어 주며 사용자가 선택한 파일의 완전 경로를 구조체로 다시 리턴해 준다. 함수를 호출하기 전에 먼저 구조체에 초기값을 적절하게 설정해 주어야 하며 리턴값과 구조체의 결과값으로 사용자가 선택한 파일명을 구할 수 있다. 이렇게 입력받은 파일명은 이후 CreateFile 등의 함수로 열어서 입출력에 사용한다.

예제 1

다음 예제는 하나의 파일명을 입력받는 가장 일반적인 파일 열기 예제이다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	OPENFILENAME OFN;
	char lpstrFile[MAX_PATH]="";
	char str[256];
	char Mes[]="마우스 왼쪽 버튼을 누르십시오";

	switch(iMessage) {
	case WM_LBUTTONDOWN:
		memset(&OFN, 0, sizeof(OPENFILENAME));
		OFN.lStructSize = sizeof(OPENFILENAME);
		OFN.hwndOwner=hWnd;
		OFN.lpstrFilter="Every File(*.*)\0*.*\0Text File\0*.txt;*.doc\0";
		OFN.lpstrFile=lpstrFile;
		OFN.nMaxFile=256;
		if (GetOpenFileName(&OFN)!=0) {
			wsprintf(str,"%s 파일을 선택했습니다.",OFN.lpstrFile);
			MessageBox(hWnd,str,"파일 열기 성공",MB_OK);
		}
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,10,Mes,lstrlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

OPENFILENAME 구조체를 선언하고 이 구조체의 모든 멤버를 0으로 초기화해 준 후 필수적으로 필요한 멤버에만 값을 대입해 주었다. lpstrFile 멤버에는 사용자가 선택한 파일명을 리턴받기 위한 충분한 길이의 버퍼 포인터를 반드시 대입해 주어야 함을 유의하도록 하자. 사용자가 파일을 선택했으면 lpstrFile 멤버를 읽어 어떤 파일을 선택했는지 메시지 박스로 보여준다. 이 멤버로 리턴되는 경로는 CreateFile 함수에 곧바로 사용할 수 있다.

이 대화상자로 복수개의 파일명을 입력받고자 할 때는 OFN_ALLOWMULTISELECT 플래그를 주되 이 때 OFN_EXPLORER 플래그를 같이 주어야 탐색기 형식의 대화상자가 열린다. 선택된 파일들은 lpstrFile 버퍼에 널 문자로 구분되어 차례대로 기록되어 있으므로 이 버퍼를 계속 읽으면 된다. lpstrFile 버퍼의 선두에는 파일들의 폴더가 있으며 두번째 이후에 선택한 파일의 이름만 나열된다. 복수 선택된 파일들을 모두 저장할 수 있는 충분한 길이의 버퍼를 제공해야 하는데 NT 4.0과 2000이상의 ANSI 버전에서는 32K의 버퍼 한계가 있다.

예제 2

다음 예제는 파일 열기 대화상자로 복수개의 파일을 선택받아 선택한 파일명을 보여준다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	char Mes[]="마우스 왼쪽 버튼을 누르십시오";
	OPENFILENAME OFN;
	char str[32000]="";
	char lpstrFile[10000]="";
	char *p;
	char Name[MAX_PATH];
	char szTmp[MAX_PATH];
	int i=1;

	switch(iMessage) {
	case WM_LBUTTONDOWN:
		memset(&OFN, 0, sizeof(OPENFILENAME));
		OFN.lStructSize = sizeof(OPENFILENAME);
		OFN.hwndOwner=hWnd;
		OFN.lpstrFilter="모든 파일(*.*)\0*.*\0";
		OFN.lpstrFile=lpstrFile;
		OFN.nMaxFile=10000;
		OFN.Flags=OFN_EXPLORER | OFN_ALLOWMULTISELECT;
		if (GetOpenFileName(&OFN)!=0) {
			p=lpstrFile;
			strcpy(Name, p);
			if (*(p+strlen(Name)+1)==0) {
				wsprintf(str,"%s 파일 하나만 선택했습니다",Name);
			} else {
				wsprintf(str,"%s 디렉토리에 있는 다음 파일들이 선택되었습니다"
					"\r\n\r\n", Name);

				for (;;) {
					p=p+strlen(Name)+1;
					if (*p==0)
						break;
					strcpy(Name,p);
					wsprintf(szTmp,"%d번째 파일 = %s \r\n",i++,Name);
					strcat(str,szTmp);
				}
			}
			MessageBox(hWnd,str,"선택한 파일",MB_OK);
		} else {
			if (CommDlgExtendedError()==FNERR_BUFFERTOOSMALL) {
				MessageBox(hWnd,"버퍼 크기가 너무 작습니다","에러",MB_OK);
			}
		}
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,10,Mes,strlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

lpstrFile 버퍼에는 10000바이트 정도의 비교적 충분한 길이를 주었으나 많은 수의 파일을 선택했을 경우는 메모리 부족 에러가 발생할 수 있으므로 이 에러는 반드시 처리해 주어야 한다.

참고함수

SHBrowseForFolder : 파일 이름 대신 폴더 경로를 입력받는다.
GetSaveFileName : 저장을 위한 파일명을 입력받는다.

플랫폼

95이상

참조

 


written by http://www.winapi.co.kr