다른 이름으로 열기 및 저장 대화 상자
참고
[Windows Vista부터 일반 항목 대화 상자로 열기 및 저장 대화 상자가 대체되었습니다. 공통 대화 상자 라이브러리에서 이러한 대화 상자 대신 공통 항목 대화 상자 API를 사용하는 것이 좋습니다.]
열기 대화 상자를 사용하면 사용자가 열 파일 또는 파일 집합의 드라이브, 디렉터리 및 이름을 지정할 수 있습니다. OPENFILENAME 구조를 초기화하고 구조를 GetOpenFileName 함수에 전달하여 열기 대화 상자를 만들고 표시합니다.
다른 이름으로 저장 대화 상자를 사용하면 사용자가 저장할 파일의 드라이브, 디렉터리 및 이름을 지정할 수 있습니다. OPENFILENAME 구조를 초기화하고 구조를 GetSaveFileName 함수에 전달하여 다른 이름으로 저장 대화 상자를 만들고 표시합니다.
Explorer 스타일 열기 및 다른 이름으로 저장 대화 상자는 Windows Explorer 유사한 사용자 인터페이스 기능을 제공합니다. 그러나 시스템은 이전 스타일 사용자 인터페이스와 일치해야 하는 애플리케이션에 대해 이전 스타일의 열기 및 다른 이름으로 저장 대화 상자를 계속 지원합니다.
모양 차이 외에도 Explorer 스타일 및 이전 스타일 대화 상자는 대화 상자를 사용자 지정하기 위한 사용자 지정 템플릿 및 후크 프로시저를 사용하는 데 차이가 있습니다. 그러나 Explorer 스타일 및 이전 스타일 대화 상자는 파일 이름 필터 지정, 사용자 입력 유효성 검사 및 사용자가 지정한 파일 이름 가져오기와 같은 대부분의 기본 작업에 대해 동일한 동작을 갖습니다. Explorer 스타일 및 이전 스타일 대화 상자에 대한 자세한 내용은 열기 및 다른 이름으로 저장 대화 상자 사용자 지정을 참조하세요.
다음 그림에서는 일반적인 Explorer 스타일 열기 대화 상자를 보여 줍니다.
다음 그림에서는 일반적인 Explorer 스타일 다른 이름으로 저장 대화 상자를 보여 줍니다.
사용자가 파일 이름을 지정하고 확인 단추를 클릭하면 GetOpenFileName 또는 GetSaveFileName 이 TRUE를 반환합니다. OPENFILENAME 구조체의 lpstrFile 멤버가 가리키는 버퍼에는 사용자가 지정한 전체 경로와 파일 이름이 포함됩니다.
사용자가 다른 이름으로 열기 또는 저장 대화 상자를 취소하거나 오류가 발생하면 함수는 FALSE를 반환합니다. 오류의 원인을 확인하려면 CommDlgExtendedError 함수를 호출하여 확장된 오류 값을 검색합니다. lpstrFile 버퍼가 너무 작아서 전체 이름을 받을 수 없는 경우 CommDlgExtendedError는 FNERR_BUFFERTOOSMALL 반환하고 lpstrFile 멤버가 가리키는 버퍼의 처음 2바이트는 전체 이름을 받는 데 필요한 크기를 지정하는 정수 값으로 설정됩니다.
이 섹션에서 설명하는 항목은 다음과 같습니다.
- 파일 이름 및 디렉터리
- 필터
- 파일 및 디렉터리 유효성 검사
- 다른 이름으로 열기 및 저장 대화 상자 사용자 지정
- Explorer 스타일 후크 프로시저
- Explorer 스타일 사용자 지정 템플릿
- Explorer 스타일 컨트롤 식별자
- Old-Style 대화 상자 사용자 지정
파일 이름 및 디렉터리
이 섹션의 정보는 Explorer 스타일과 이전 스타일의 열기 및 다른 이름으로 저장 대화 상자에 모두 적용됩니다.
GetOpenFileName 또는 GetSaveFileName 함수를 호출하기 전에 OPENFILENAME 구조체의 lpstrFile 멤버가 버퍼를 가리키고 파일 이름을 받아야 합니다. nMaxFile 멤버는 lpstrFile 버퍼의 크기를 문자 단위로 지정해야 합니다. ANSI 함수의 경우 바이트 수이지만 유니코드 함수의 경우 문자 수입니다.
사용자가 파일 이름을 지정하고 확인 단추를 클릭하면 대화 상자에서 선택한 드라이브, 디렉터리 및 파일 이름을 lpstrFile 버퍼에 복사합니다. 또한 함수는 nFileOffset 및 nFileExtension 멤버를 버퍼 시작부터 파일 이름, 파일 이름 확장명까지 각각 오프셋(문자)으로 설정합니다.
파일 이름 및 확장명만 검색하려면 lpstrFileTitle 멤버를 버퍼를 가리키도록 설정하고 nMaxFileTitle 멤버를 버퍼의 크기(문자 단위)로 설정합니다. 또는 GetFileTitle 함수에 대한 호출에서 lpstrFile 버퍼를 전달하여 선택한 파일의 표시 이름을 가져올 수 있습니다. 그러나 GetFileTitle 이 반환하는 파일 이름에는 파일 이름을 표시하기 위한 사용자의 기본 설정인 경우에만 확장명을 포함합니다.
대화 상자는 호출 프로세스의 현재 디렉터리를 파일 및 디렉터리를 표시할 초기 디렉터리로 사용합니다. GetCurrentDirectory 및 SetCurrentDirectory 함수를 사용하여 프로세스의 현재 디렉터리를 가져와서 변경합니다. 현재 디렉터리를 변경하지 않고 다른 초기 디렉터리를 지정하려면 lpstrInitialDir 멤버를 사용하여 디렉터리의 이름을 지정합니다. 대화 상자는 사용자가 다른 드라이브 또는 디렉터리를 선택할 때 현재 디렉터리를 자동으로 변경합니다. 대화 상자가 현재 디렉터리를 변경하지 못하도록 하려면 OFN_NOCHANGEDIR 플래그를 설정합니다. 이 플래그는 사용자가 파일을 찾기 위해 디렉터리를 변경하는 것을 방지하지 않습니다.
기본 파일 이름 확장명을 지정하려면 lpstrDefExt 멤버를 사용합니다. 사용자가 확장명이 없는 파일 이름을 지정하면 대화 상자에서 기본 확장명을 추가합니다. 기본 확장을 지정하고 사용자가 다른 확장명을 가진 파일 이름을 지정하는 경우 대화 상자는 OFN_EXTENSIONDIFFERENT 플래그를 설정합니다.
사용자가 디렉터리에서 둘 이상의 파일을 선택할 수 있도록 하려면 OFN_ALLOWMULTISELECT 플래그를 설정합니다. 이전 애플리케이션과의 호환성을 위해 기본 다중 선택 대화 상자는 이전 스타일의 사용자 인터페이스를 사용합니다. Explorer 스타일 다중 선택 대화 상자를 표시하려면 OFN_EXPLORER 플래그도 설정해야 합니다.
사용자가 둘 이상의 파일을 선택하는 경우 lpstrFile 멤버가 가리키는 버퍼는 현재 디렉터리에 대한 경로와 선택한 파일의 파일 이름을 반환합니다. nFileOffset 멤버는 첫 번째 파일 이름의 오프셋이며 nFileExtension 멤버는 사용되지 않습니다. 다음 표에서는 여러 파일 이름을 반환하는 Explorer 스타일 대화 상자와 이전 스타일 대화 상자의 차이점을 설명합니다.
대화 상자 스타일 | 설명 |
---|---|
Explorer 스타일 대화 상자 | 디렉터리 및 파일 이름 문자열은 NULL 로 구분되며, 마지막 파일 이름 뒤에 추가 NULL 문자가 있습니다. 이 형식을 사용하면 Explorer 스타일 대화 상자에서 공백이 포함된 긴 파일 이름을 반환할 수 있습니다. |
이전 스타일 대화 상자 | 디렉터리 및 파일 이름 문자열은 공백으로 구분됩니다. 공백이 있는 파일 이름의 경우 함수는 짧은 파일 이름을 사용합니다. |
FindFirstFile 함수를 사용하여 긴 파일 이름과 짧은 파일 이름 간에 변환할 수 있습니다.
OFN_ALLOWMULTISELECT 지정하고 사용자가 파일을 하나만 선택하는 경우 lpstrFile 문자열에는 경로와 파일 이름 사이에 구분 기호가 없습니다.
필터
이 섹션의 정보는 Explorer 스타일과 이전 스타일 열기 및 다른 이름으로 저장 대화 상자에 모두 적용됩니다.
사용자가 대화 상자가 표시하는 파일 이름을 제한하는 데 도움이 되는 파일 이름 필터를 제공할 수 있습니다. 파일 이름 필터는 null로 끝나는 문자열 쌍, 설명 및 패턴으로 구성되며, 하나는 다른 문자열과 연결됩니다. 대화 상자에는 사용자가 사용할 필터를 선택할 수 있도록 하는 설명이 표시됩니다. 패턴을 사용하여 표시할 파일을 선택합니다.
필터를 지정하려면 OPENFILENAME 구조체의 lpstrFilter 멤버를 필터 문자열 쌍 배열이 포함된 버퍼를 가리키도록 설정합니다. 배열의 마지막 문자열 뒤에 추가 null 문자가 있어야 합니다.
패턴 문자열은 유효한 파일 이름 문자와 별표(*)의 조합일 수 있습니다. 별표는 유효한 파일 이름 문자의 조합을 나타내는 와일드카드입니다. 대화 상자에는 패턴과 일치하는 파일만 표시됩니다. 동일한 설명에 여러 패턴을 지정하려면 세미콜론(;) 패턴을 구분합니다. 패턴 문자열의 공백 문자는 예기치 않은 결과를 생성할 수 있습니다.
다음 코드 조각은 두 개의 필터를 지정합니다. "원본" 설명이 있는 필터에는 두 가지 패턴이 있습니다. 사용자가 이 필터를 선택하면 대화 상자에 가 있는 파일만 표시됩니다. C 및 입니다. CXX 확장. C 프로그래밍 언어에서는 큰따옴표로 묶인 문자열이 null로 종료됩니다.
OPENFILENAME ofn; // common dialog box structure
ofn.lpstrFilter = "Source\0*.C;*.CXX\0All\0*.*\0"
ofn.nFilterIndex = 1;
OPENFILENAME 구조체의 nFilterIndex 멤버는 대화 상자에서 처음에 사용하는 필터를 나타내는 인덱스를 지정합니다. 버퍼의 첫 번째 필터에는 인덱스 1, 두 번째 2 등이 있습니다. 사용자가 대화 상자를 사용하는 동안 필터를 변경하면 nFilterIndex 멤버가 반환 시 선택한 필터의 인덱스로 설정됩니다.
lpstrCustomFilter 멤버를 단일 필터가 포함된 버퍼의 주소로 설정하고 nMaxCustFilter 멤버를 버퍼 크기(문자 또는 바이트)로 설정하여 사용자 지정 필터를 만들 수 있습니다. 대화 상자는 항상 필터 목록의 시작 부분에 사용자 지정 필터를 배치하고, 반환 시 항상 필터의 패턴 부분을 사용자가 선택한 필터의 패턴으로 업데이트합니다.
Explorer 스타일 대화 상자의 경우 사용자가 다른 필터를 선택하면 기본 확장이 변경됩니다. 사용자가 첫 번째 패턴이 *형식인 필터를 선택하는 경우 xxx (즉, 확장에 와일드카드 문자가 포함되지 않음)는 대화 상자에서 xxx 를 기본 확장으로 사용합니다. 이는 OPENFILENAME 구조체의 lpstrDefExt 멤버에서 기본 확장을 지정한 경우에만 발생합니다. 예를 들어 사용자가 "Source\0*를 선택하는 경우입니다. C;*. CXX\0" 필터는 기본 확장이 "C"로 변경됩니다. 그러나 필터를 "Source\0*로 정의한 경우 C*\0"은(는) 확장에 와일드카드가 포함되어 있으므로 기본 확장이 변경되지 않습니다.
CDN_INCLUDEITEM 알림 메시지는 대화 상자가 표시하는 이름을 필터링하는 또 다른 방법을 제공합니다. 이 메시지를 사용하려면 OFNHookProc 후크 프로시저를 제공하고 대화 상자를 만들 때 OPENFILENAME 구조체에서 OFN_ENABLEINCLUDENOTIFY 플래그를 지정합니다. 사용자가 폴더를 열 때마다 대화 상자는 새로 연 폴더의 각 항목에 대한 후크 프로시저에 CDN_INCLUDEITEM 알림을 보냅니다. 후크 프로시저의 반환 값은 대화 상자에 폴더의 항목 목록에 항목을 표시할지 여부를 나타냅니다.
파일 및 디렉터리 유효성 검사
언급된 경우를 제외하고 이 섹션의 정보는 Explorer 스타일과 이전 스타일의 열기 및 다른 이름으로 저장 대화 상자에 모두 적용됩니다.
대화 상자는 사용자가 입력한 파일 이름의 유효성을 자동으로 검사하여 이름에 유효한 문자만 포함되도록 합니다. 파일 이름 문자 유효성 검사를 재정의하려면 OFN_NOVALIDATE 플래그를 설정합니다.
대화 상자에서 사용자가 기존 파일의 이름을 지정했는지 확인하려면 OFN_FILEMUSTEXIST 플래그를 설정합니다. 지정된 경로가 있는지 강제로 확인하려면 OFN_PATHMUSTEXIST 플래그를 설정합니다. OFN_CREATEPROMPT 플래그를 설정하면 대화 상자에서 사용자에게 존재하지 않는 파일을 만들 수 있는 권한을 묻는 메시지를 표시합니다. 이 플래그가 설정되고 사용자가 새 파일을 만들도록 선택하면 대화 상자가 닫히고 함수가 지정된 이름을 반환합니다. 그렇지 않으면 대화 상자가 열린 상태로 유지됩니다.
다른 이름으로 저장 대화 상자를 사용하는 경우 OFN_OVERWRITEPROMPT 플래그를 설정하여 사용자에게 기존 파일을 덮어쓸 수 있는 권한을 묻는 메시지를 표시하도록 대화 상자를 지시할 수 있습니다.
기본적으로 대화 상자는 선택한 디렉터리에서 새 파일을 만들 수 있는지 여부를 결정하는 길이가 0인 테스트 파일을 만듭니다. 이 테스트 파일이 생성되지 않도록 하려면 OFN_NOTESTFILECREATE 플래그를 설정합니다.
후크 프로시저를 사용하도록 설정하면 사용자가 지정한 파일 이름에 대해 네트워크 공유 위반이 발생할 때 대화 상자가 후크 프로시저에 알깁니다. OFN_EXPLORER 플래그를 설정하면 대화 상자에서 CDN_SHAREVIOLATION 메시지를 후크 프로시저로 보냅니다. OFN_EXPLORER 설정하지 않으면 대화 상자에서 SHAREVISTRING 등록된 메시지를 후크 프로시저로 보냅니다. 대화 상자에서 공유 위반에 대한 알림을 보내지 않도록 하려면 OFN_SHAREAWARE 플래그를 설정합니다.
사용자가 읽기 전용 검사 상자를 선택하면 대화 상자는 반환할 때 OFN_READONLY 플래그를 설정합니다. 읽기 전용으로 열기 검사 상자를 숨기려면 OFN_HIDEREADONLY 플래그를 설정합니다. 대화 상자에서 읽기 전용 특성이 있는 기존 파일의 이름을 반환하지 않도록 하려면 OFN_NOREADONLYRETURN 플래그를 설정합니다.
대화 상자가 링크 파일을 역참조하지 않도록 하려면 OFN_NODEREFERENCELINKS 값을 설정합니다. 이 경우 대화 상자는 링크 파일에서 참조하는 파일의 이름이 아닌 링크 파일의 이름을 반환합니다.
다른 이름으로 열기 및 저장 대화 상자 사용자 지정
후크 프로시저, 사용자 지정 템플릿 또는 둘 다를 제공하여 다른 이름으로 열기 또는 저장 대화 상자를 사용자 지정할 수 있습니다. 그러나 대화 상자의 Explorer 스타일 및 이전 스타일 버전은 사용자 지정 템플릿 및 후크 프로시저의 사용과 다릅니다.
Explorer 스타일 대화 상자를 사용자 지정하는 방법에 대한 자세한 내용은 Explorer 스타일 후크 프로시저, Explorer 스타일 사용자 지정 템플릿 및 Explorer 스타일 컨트롤 식별자를 참조하세요. 이전 스타일 대화 상자를 사용자 지정하는 방법에 대한 자세한 내용은 Old-Style 대화 상자 사용자 지정을 참조하세요.
다음 표에서는 두 스타일 간의 차이점을 요약합니다.
사용자 지정 | Description |
---|---|
Explorer 스타일 후크 프로시저 | 후크 프로시저는 공통 대화 상자에서 보낸 알림 메시지와 자식 대화 상자 템플릿을 지정하여 정의한 추가 컨트롤에 대한 메시지를 받습니다. 후크 프로시저는 기본 대화 상자의 표준 컨트롤에 대한 메시지를 받지 않습니다. |
Explorer 스타일 사용자 지정 템플릿 | 시스템은 사용자 지정 템플릿을 사용하여 자식 대화 상자를 만듭니다. 템플릿은 추가 컨트롤을 정의할 수 있으며 표준 컨트롤 클러스터의 위치를 지정할 수 있습니다. 사용자 지정 템플릿은 기본 템플릿을 대체하지 않습니다. |
이전 스타일 후크 프로시저 | 후크 프로시저는 표준 컨트롤 및 사용자 지정 컨트롤에 대한 메시지를 포함하여 대화 상자로 전송된 모든 메시지를 받습니다. 후크 프로시저는 일반 대화 상자에서 전송된 등록된 메시지도 받습니다. |
이전 스타일 사용자 지정 템플릿 | 사용자 지정 템플릿은 기본 템플릿을 대체합니다. Fileopen.dlg 파일에 지정된 기본 템플릿을 수정하여 사용자 지정 템플릿을 만듭니다. |
Explorer 스타일 대화 상자와 이전 스타일 대화 상자의 기본 제목은 "열기" 또는 "다른 이름으로 저장"입니다. 제목을 변경하려면 OPENFILENAME 구조체의 lpstrTitle 멤버에 새 제목을 지정합니다.
사용자의 HKEY_CURRENT_USER 레지스트리 하이브에는 Explorer 스타일 열기 및 다른 이름으로 저장 대화 상자의 내용을 사용자 지정하는 값이 포함될 수 있습니다. 이러한 레지스트리 항목은 레지스트리 하이브와 연결된 사용자에 대해 표시되는 대화 상자에만 영향을 줍니다.
Explorer 스타일 열기 및 다른 이름으로 저장 대화 상자의 기능을 숨기려면 관리자는 이 하위 키 아래의 다음 표에 있는 값을 설정할 수 있습니다.
HKEY_CURRENT_USER
Software
Microsoft
Windows
CurrentVersion
Policies
Comdlg32
값 이름 | 값 | 의미 |
---|---|---|
NoPlacesBar | 1 | 위치 표시줄을 숨깁니다. |
NoFileMRU | 1 | MRU(가장 최근에 사용한) 목록을 숨깁니다. |
NoBackButton | 1 | 뒤로 단추를 숨깁니다. |
장소 표시줄의 내용은 다음 하위 키의 내용에 따라 결정됩니다.
HKEY_CURRENT_USER
Software
Microsoft
Windows
CurrentVersion
Policies
Comdlg32
Placesbar
현재 이 키 아래에는 5개의 항목만 있을 수 있으며 값/이름 인덱스는 0부터 시작합니다. 항목의 이름은 Place0, Place1, Place2, Place3 및 Place4여야 합니다. 항목의 값은 위치 표시줄에 포함할 위치를 식별하는 REG_DWORD ,REG_SZ 또는 REG_EXPAND_SZ 값일 수 있습니다.
값 형식 | 의미 |
---|---|
REG_DWORD | 폴더를 식별하는 CSIDL 값입니다. CSIDL 값 목록은 CSIDL 값을 참조하세요. |
REG_SZ 또는 REG_EXPAND_SZ | 유효한 경로를 지정하는 null로 끝나는 문자열입니다. |
Explorer-Style 후크 프로시저
후크 프로시저, 사용자 지정 템플릿 또는 둘 다를 제공하여 Explorer 스타일 열기 또는 다른 이름으로 저장 대화 상자를 사용자 지정할 수 있습니다. Explorer 스타일 대화 상자에 대한 후크 프로시저를 제공하는 경우 시스템은 기본 대화 상자의 자식인 대화 상자를 만듭니다. 후크 프로시저는 자식 대화 상자의 대화 프로시저 역할을 합니다. 이 자식 대화 상자는 사용자 지정 템플릿을 기반으로 하거나 기본 템플릿이 제공되지 않은 경우 입니다. 자세한 내용은 Explorer 스타일 사용자 지정 템플릿을 참조하세요.
Explorer 스타일 열기 또는 다른 이름으로 저장 대화 상자에 후크 프로시저를 사용하도록 설정하려면 대화 상자를 만들 때 OPENFILENAME 구조를 사용합니다. Flags 멤버에서 OFN_ENABLEHOOK 및 OFN_EXPLORER 플래그를 설정하고 lpfnHook 멤버에서 OFNHookProc 후크 프로시저의 주소를 지정합니다. 후크 프로시저를 제공하고 OFN_EXPLORER 플래그를 생략하는 경우 OFNHookProcOldStyle 후크 프로시저를 사용해야 하며 이전 스타일의 사용자 인터페이스가 표시됩니다. 자세한 내용은 Old-Style 대화 상자 사용자 지정을 참조하세요.
Explorer 스타일 후크 프로시저는 대화 상자가 열려 있는 동안 다양한 메시지를 받습니다. 여기에는 다음과 같은 옵션이 포함됩니다.
- WM_INITDIALOG 메시지 및 WM_CTLCOLORDLG 컨트롤 색 메시지와 같은 기타 표준 대화 상자 메시지입니다.
- 사용자 또는 다른 대화 상자 이벤트가 수행한 작업을 나타내는 WM_NOTIFY 알림 메시지 집합입니다.
- 자식 대화 상자 템플릿을 지정하여 정의한 추가 컨트롤에 대한 메시지입니다.
또한 정보를 얻거나 대화 상자의 동작과 모양을 제어하기 위해 Explorer 스타일 대화 상자에 보낼 수 있는 메시지 집합이 있습니다.
Explorer 스타일 대화 상자에 후크 프로시저를 제공하는 경우 기본 대화 상자 프로시저는 기본 대화 프로시저가 WM_INITDIALOG 메시지를 처리할 때 자식 대화 상자를 만듭니다. 후크 프로시저는 자식 대화 상자의 대화 프로시저 역할을 합니다. 이때 후크 프로시저는 lParam 매개 변수가 대화 상자를 초기화하는 데 사용되는 OPENFILENAME 구조체의 주소로 설정된 고유한 WM_INITDIALOG 메시지를 받습니다. 자식 대화 상자가 자체 WM_INITDIALOG 메시지 처리를 완료한 후 기본 대화 프로시저는 필요한 경우 표준 컨트롤을 이동하여 자식 대화 상자의 추가 컨트롤을 위한 공간을 만듭니다. 그런 다음 기본 대화 상자 프로시저는 CDN_INITDONE 알림 메시지를 후크 프로시저로 보냅니다.
후크 프로시저는 대화 상자에서 사용자가 수행한 작업을 나타내는 WM_NOTIFY 알림 메시지를 받습니다. 이러한 메시지 중 일부를 사용하여 대화 상자의 동작을 제어할 수 있습니다. 예를 들어 후크 프로시저는 사용자가 파일 이름을 선택하고 확인 단추를 클릭하면 CDN_FILEOK 메시지를 받습니다. 이 메시지에 대한 응답으로 후크 프로시저는 SetWindowLong 함수를 사용하여 선택한 이름을 거부하고 대화 상자를 열어 두도록 할 수 있습니다.
각 WM_NOTIFY 메시지에 대한 lParam 매개 변수는 작업을 정의하는 OFNOTIFY 또는 OFNOTIFYEX 구조체에 대한 포인터입니다. 이 구조체의 헤더에 있는 코드 멤버에는 다음 알림 메시지 중 하나가 포함됩니다.
메시지 | 의미 |
---|---|
CDN_FILEOK | 사용자가 확인 단추를 클릭했습니다. 대화 상자가 닫히려고 합니다. |
CDN_FOLDERCHANGE | 사용자가 새 폴더 또는 디렉터리를 열었습니다. |
CDN_HELP | 사용자가 도움말 단추를 클릭했습니다. |
CDN_INCLUDEITEM | 항목을 표시할지 여부를 결정합니다. 사용자가 새 폴더 또는 디렉터리를 열면 시스템에서 폴더 또는 디렉터리의 각 항목에 대해 이 알림을 보냅니다. 시스템은 OFN_ENABLEINCLUDENOTIFY 플래그가 설정된 경우에만 이 알림을 보냅니다. |
CDN_INITDONE | 시스템에서 대화 상자 초기화를 완료했으며 대화 상자에서 WM_INITDIALOG 메시지 처리를 완료했습니다. 또한 시스템에서는 자식 대화 상자의 컨트롤을 위한 공간을 만들기 위해 공통 대화 상자의 컨트롤 배열을 완료했습니다(있는 경우). |
CDN_SELCHANGE | 사용자가 파일 목록에서 새 파일 또는 폴더를 선택했습니다. |
CDN_SHAREVIOLATION | 일반적인 대화 상자에서 반환될 파일에 대한 공유 위반이 발생했습니다. |
CDN_TYPECHANGE | 사용자가 파일 형식 목록에서 새 파일 형식을 선택했습니다. |
이러한 WM_NOTIFY 메시지는 이전 버전의 열기 및 다른 이름으로 저장 대화 상자에서 사용한 FILEOKSTRING, LBSELCHSTRING, SHAREVISTRING 및 HELPMSGSTRING 등록 메시지를 대체합니다. 그러나 후크 프로시저는 WM_NOTIFY 처리에서 SetWindowLong을 사용하여 0이 아닌 DWL_MSGRESULT 값을 설정하지 않는 경우 WM_NOTIFY 메시지 다음에 대체된 메시지를 받습니다.
대화 상자의 상태 대한 정보를 검색하거나 대화 상자의 동작과 모양을 제어하기 위해 후크 프로시저는 대화 상자에 다음 메시지를 보낼 수 있습니다.
메시지 | 의미 |
---|---|
CDM_GETFILEPATH | 선택한 파일의 경로 및 파일 이름을 검색합니다. |
CDM_GETFOLDERIDLIST | 대화 상자가 열려 있는 현재 폴더에 해당하는 항목 식별자 목록을 검색합니다. 항목 식별자 목록에 대한 자세한 내용은 셸 네임스페이스 소개를 참조하세요. |
CDM_GETFOLDERPATH | 대화 상자의 현재 폴더 또는 디렉터리의 경로를 검색합니다. |
CDM_GETSPEC | 대화 상자에서 현재 선택된 파일의 파일 이름(경로 포함 안 됨)을 검색합니다. |
CDM_HIDECONTROL | 지정된 컨트롤을 숨깁니다. |
CDM_SETCONTROLTEXT | 지정된 컨트롤의 텍스트를 설정합니다. |
CDM_SETDEFEXT | 대화 상자의 기본 파일 이름 확장명을 설정합니다. |
사용자 지정 템플릿 Explorer-Style
Explorer 스타일 열기 또는 다른 이름으로 저장 대화 상자에 대한 추가 컨트롤을 정의하려면 OPENFILENAME 구조를 사용하여 추가 컨트롤이 포함된 자식 대화 상자의 템플릿을 지정합니다. 자식 대화 상자 템플릿이 애플리케이션 또는 동적 링크 라이브러리의 리소스인 경우 Flags 멤버에서 OFN_ENABLETEMPLATE 플래그를 설정하고 구조체의 hInstance 및 lpTemplateName 멤버를 사용하여 모듈 및 리소스 이름을 식별합니다. 템플릿이 이미 메모리에 있는 경우 OFN_ENABLETEMPLATEHANDLE 플래그를 설정하고 hInstance 멤버를 사용하여 템플릿이 포함된 메모리 개체를 식별합니다. Explorer 스타일 대화 상자에 자식 대화 서식 파일을 제공하는 경우 OFN_EXPLORER 플래그도 설정해야 합니다. 그렇지 않으면 시스템에서 이전 스타일 대화 상자에 대한 대체 템플릿을 제공한다고 가정합니다. 일반적으로 추가 컨트롤을 제공하는 경우 새 컨트롤에 대한 메시지를 처리하는 Explorer 스타일 후크 프로시저도 제공해야 합니다.
WS_CHILD 및 WS_CLIPSIBLINGS 스타일을 지정하고 DS_3DLOOK 및 DS_CONTROL스타일을 지정해야 한다는 점을 제외하고 다른 템플릿과 마찬가지로 자식 대화 상자 템플릿을 만들 수 있습니다. 템플릿이 기본 열기 또는 다른 이름으로 저장 대화 상자의 자식 대화 상자를 정의하기 때문에 시스템에는 WS_CHILD 스타일이 필요합니다. WS_CLIPSIBLINGS 스타일은 자식 대화 상자가 기본 대화 상자의 컨트롤 위에 그려지지 않도록 합니다. DS_3DLOOK 스타일은 자식 대화 상자의 컨트롤 모양이 기본 대화 상자의 컨트롤과 일치하는지 확인합니다. DS_CONTROL 스타일은 사용자가 사용자 지정 대화 상자에서 TAB 및 기타 탐색 키를 사용하여 모든 컨트롤(기본 또는 사용자 지정) 간에 이동할 수 있도록 합니다.
새 컨트롤을 위한 공간을 확보하기 위해 시스템은 사용자 지정 대화 상자의 너비와 높이에 따라 기본 대화 상자를 확장합니다. 기본적으로 사용자 지정 대화 상자의 모든 컨트롤은 기본 대화 상자의 컨트롤 아래에 배치됩니다. 그러나 사용자 지정 대화 상자 템플릿에 정적 텍스트 컨트롤을 포함하고 stc32의 컨트롤 식별자 값을 할당하여 이 기본 위치를 재정의할 수 있습니다. 이 값은 Dlgs.h 헤더 파일에 정의되어 있습니다. 이 경우 시스템은 컨트롤을 참조 지점으로 사용하여 새 컨트롤의 위치를 결정합니다. stc32 컨트롤의 위와 왼쪽에 있는 모든 새 컨트롤은 기본 대화 상자에서 컨트롤의 왼쪽 위와 왼쪽에 동일한 크기로 배치됩니다. stc32 컨트롤의 오른쪽 아래와 오른쪽에 있는 새 컨트롤은 기본 컨트롤의 아래와 오른쪽에 배치됩니다. 일반적으로 각 새 컨트롤은 stc32 컨트롤과 기본 컨트롤을 기준으로 동일한 위치를 가지도록 배치됩니다. 이러한 새 컨트롤을 위한 공간을 만들기 위해 시스템은 필요에 따라 기본 대화 상자의 왼쪽, 오른쪽, 아래쪽 및 맨 위에 공간을 추가합니다.
시스템에서는 후크 프로시저가 사용자 지정 대화 상자에 대한 모든 메시지를 처리해야 하므로 다른 대화 상자 프로시저와 동일한 창 메시지를 후크 프로시저로 보냅니다. 예를 들어 후크 프로시저는 사용자가 사용자 지정 대화 상자에서 단추 컨트롤을 클릭할 때 WM_COMMAND 메시지를 받습니다. 후크 프로시저는 이러한 컨트롤을 초기화하고 대화 상자가 닫혀 있을 때 컨트롤에서 값을 검색합니다. 후크 프로시저가 WM_INITDIALOG 메시지를 받으면 시스템에서 아직 컨트롤을 최종 위치로 이동하지 않았습니다.
기본 대화 상자 프로시저는 기본 대화 상자의 모든 컨트롤에 대한 메시지를 처리하지만 후크 프로시저는 Explorer 스타일 후크 프로시저에 설명된 대로 이러한 컨트롤에 대한 사용자 작업에 대한 알림 메시지를 받습니다.
Explorer-Style 컨트롤 식별자
Windows SDK(소프트웨어 개발 키트)는 이전 스타일 대화 상자에 대한 기본 대화 상자 템플릿을 제공하지만 Explorer 스타일 대화 상자의 기본 템플릿은 포함하지 않습니다. Explorer 스타일 대화 상자를 사용하면 고유한 컨트롤을 추가할 수 있지만 표준 컨트롤에 대한 템플릿 수정은 지원하지 않기 때문입니다. 그러나 경우에 따라 기본 템플릿에 사용되는 컨트롤 식별자를 알아야 할 수 있습니다. 예를 들어 CDM_HIDECONTROL 및 CDM_SETCONTROLTEXT 메시지에는 컨트롤 식별자가 필요합니다.
다음 표에서는 Explorer 스타일 열기 및 다른 이름으로 저장 대화 상자에서 표준 컨트롤의 식별자를 보여 줍니다. 식별자는 Dlgs.h 및 Winuser.h에 정의된 상수입니다.
컨트롤 식별자 | 컨트롤 설명 |
---|---|
chx1 | 읽기 전용 검사 상자 |
cmb1 | 파일 형식 필터 목록을 표시하는 드롭다운 콤보 상자 |
stc2 | cmb1 콤보 상자의 레이블 |
cmb2 | 현재 드라이브 또는 폴더를 표시하고 사용자가 열 드라이브 또는 폴더를 선택할 수 있는 드롭다운 콤보 상자 |
stc4 | cmb2 콤보 상자의 레이블 |
cmb13 | 현재 파일의 이름을 표시하는 드롭다운 콤보 상자를 사용하면 사용자가 열 파일의 이름을 입력하고 최근에 열거나 저장한 파일을 선택할 수 있습니다. 이는 후크 또는 대화 상자 템플릿이 없는 이전 Explorer 호환되는 애플리케이션용입니다. edt1과 비교합니다. |
edt1 | 현재 파일의 이름을 표시하거나 사용자가 열 파일의 이름을 입력할 수 있도록 하는 편집 컨트롤입니다. cmb13과 비교합니다. |
stc3 | cmb13 콤보 상자 및 edt1 편집 컨트롤에 대한 레이블 |
lst1 | 현재 드라이브 또는 폴더의 내용을 표시하는 목록 상자 |
stc1 | lst1 목록 상자의 레이블 |
IDOK | 확인 명령 단추(누름 단추) |
IDCANCEL | 취소 명령 단추(누름 단추) |
pshHelp | 도움말 명령 단추(누름 단추) |
Old-Style 대화 상자 사용자 지정
기본 대화 상자 프로시저에 대한 메시지 또는 알림을 수신하는 OFNHookProcOldStyle 후크 프로시저를 제공하여 이전 스타일의 열기 또는 다른 이름으로 저장 대화 상자를 사용자 지정할 수 있습니다. 기본 템플릿 대신 사용할 사용자 지정 템플릿을 제공할 수도 있습니다. 이전 스타일 대화 상자와 함께 사용되는 후크 프로시저 및 템플릿은 다른 일반적인 대화 상자와 함께 사용되는 것과 유사합니다. 자세한 내용은 일반 대화 상자 및 사용자 지정 템플릿에 대한 후크 프로시저를 참조하세요.
이전 스타일의 열기 또는 다른 이름으로 저장 대화 상자에 후크 프로시저를 사용하도록 설정하려면 대화 상자를 만들 때 OPENFILENAME 구조를 사용합니다. Flags 멤버에서 OFN_ENABLEHOOK 플래그를 설정하고 lpfnHook 멤버에서 OFNHookProcOldStyle 후크 프로시저의 주소를 지정합니다. 대화 상자 프로시저는 Param 매개 변수가 대화 상자를 초기화하는 데 사용되는 OPENFILENAME 구조체의 주소로 설정된 후크 프로시저에 WM_INITDIALOG 메시지를 보냅니다.
OPENFILENAME 구조를 사용하여 기본 템플릿 대신 사용할 열기 또는 다른 이름으로 저장 대화 상자에 대한 사용자 지정 템플릿을 지정할 수 있습니다. 사용자 지정 템플릿이 애플리케이션 또는 동적 연결 라이브러리의 리소스인 경우 Flags 멤버에서 OFN_ENABLETEMPLATE 플래그를 설정하고 구조체의 hInstance 및 lpTemplateName 멤버를 사용하여 모듈 및 리소스 이름을 식별합니다. 사용자 지정 템플릿이 이미 메모리에 있는 경우 OFN_ENABLETEMPLATEHANDLE 플래그를 설정하고 hInstance 멤버를 사용하여 템플릿이 포함된 메모리 개체를 식별합니다. Fileopen.dlg 파일에 지정된 기본 템플릿을 수정하여 사용자 지정 템플릿을 만듭니다. 기본 찾기 및 바꾸기 대화 상자 템플릿에 사용되는 컨트롤 식별자는 Dlgs.h 파일에 정의되어 있습니다.
기본적으로 GetOpenFileName 및 GetSaveFileName 함수는 Explorer 스타일 대화 상자를 표시합니다. 이전 스타일 대화 상자를 표시하려면 OFNHookProcOldStyle 후크 프로시저를 제공하고 OPENFILENAME 구조체의 Flags 멤버에 OFN_EXPLORER 플래그가 설정되지 않았는지 확인해야 합니다.
OFN_EXPLORER 플래그를 설정하면 시스템에서 후크 프로시저 또는 사용자 지정 템플릿을 Explorer 스타일 사용자 지정으로 처리합니다. Explorer 스타일 대화 상자를 사용자 지정하는 방법에 대한 자세한 내용은 Explorer 스타일 사용자 지정 템플릿을 참조하세요.