다음을 통해 공유


대화 상자 프로그래밍 고려 사항

이 개요에서는 대화 상자와 관련된 몇 가지 프로그래밍 고려 사항에 대해 설명합니다.

개요에는 다음 항목이 포함되어 있습니다.

대화 상자 프로시저

대화 상자 프로시저는 제공하거나 수행할 작업이 있는 경우 시스템에서 프로시저에 메시지를 보내는 창 프로시저와 유사합니다. 창 프로시저와 달리 대화 상자 프로시저는 DefWindowProc 함수를 호출하지 않습니다. 대신 메시지를 처리하는 경우 TRUE를 반환하고 그렇지 않으면 FALSE를 반환합니다.

모든 대화 상자 프로시저의 형식은 다음과 같습니다.

BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
 
        // Place message cases here. 
 
        default: 
            return FALSE; 
    } 
}

프로시저 매개 변수는 창 프로시저와 동일한 용도로 사용되며 hwndDlg 매개 변수는 대화 상자의 창 핸들을 받습니다.

대부분의 대화 상자 프로시저는 WM_INITDIALOG 메시지와 컨트롤에서 보낸 WM_COMMAND 메시지를 처리하지만 다른 메시지가 있는 경우 거의 처리하지 않습니다. 대화 상자 프로시저가 메시지를 처리하지 않는 경우 시스템에서 메시지를 내부적으로 처리하도록 지시하려면 FALSE를 반환해야 합니다. 이 규칙의 유일한 예외는 WM_INITDIALOG 메시지입니다. 대화 상자 프로시저는 시스템에 WM_INITDIALOG 메시지를 추가로 처리하도록 지시하려면 TRUE반환해야 합니다. 어떤 경우든 프로시저는 DefWindowProc를 호출하지 않아야 합니다.

WM_INITDIALOG 메시지

시스템에서 대화 상자 프로시저에 WM_CREATE 메시지를 보내지 않습니다. 대신 대화 상자와 모든 컨트롤을 만들 때 대화 상자를 표시하기 전에 WM_INITDIALOG 메시지를 보냅니다. 이 절차는 대화 상자에 작업과 연결된 현재 설정이 표시되는지 확인하는 데 필요한 초기화를 수행해야 합니다. 예를 들어 대화 상자에 현재 드라이브와 디렉터리를 표시하는 컨트롤이 포함되어 있는 경우 프로시저는 현재 드라이브와 디렉터리를 결정하고 컨트롤을 해당 값으로 설정해야 합니다.

이 프로시저는 SetDlgItemText 및 CheckDlgButton같은 함수를 사용하여 컨트롤을 초기화할 수 있습니다. 컨트롤은 창이므로 EnableWindow 및 SetFocus같은 창 관리 함수를 사용하여 컨트롤을 조작할 수도 있습니다. 이 프로시저는 GetDlgItem 함수를 사용하여 컨트롤에 대한 창 핸들을 검색할 수 있습니다.

대화 상자 프로시저는 필요에 따라 컨트롤의 내용, 상태 및 위치를 변경할 수 있습니다. 예를 들어 파일 이름 목록 상자와 열기 단추가 포함된 대화 상자에서 사용자가 목록에서 파일을 선택할 때까지 프로시저에서 열기 단추를 사용하지 않도록 설정할 수 있습니다. 이 예제에서 대화 상자 템플릿은 열기 단추의 WS_DISABLED 스타일을 지정하고 시스템에서 단추를 만들 때 자동으로 단추를 사용하지 않도록 설정합니다. 대화 상자 프로시저가 사용자가 파일을 선택했음을 나타내는 알림 메시지를 목록 상자에서 받으면 프로시저는 EnableWindow 함수를 호출하여 열기 단추를 사용하도록 설정합니다.

대화 상자의 캡션 표시줄에 사용자 지정 아이콘을 표시하려면 WM_INITDIALOG 처리기가 대화 상자에 WM_SETICON 메시지를 보낼 수 있습니다.

애플리케이션이 DialogBoxParam, DialogBoxIndirectParam, CreateDialogParam 또는 CreateDialogIndirectParam 함수 중 하나를 사용하여 대화 상자를 만드는 경우 WM_INITDIALOG 메시지에 대한 lParam 매개 변수에는 함수에 전달된 추가 매개 변수가 포함됩니다. 애플리케이션은 일반적으로 이 추가 매개 변수를 사용하여 추가 초기화 정보에 대한 포인터를 대화 상자 프로시저에 전달하지만 대화 상자 프로시저는 매개 변수의 의미를 결정해야 합니다. 애플리케이션이 다른 함수를 사용하여 대화 상자를 만드는 경우 시스템은 lParam 매개 변수를 NULL설정합니다.

WM_INITDIALOG 메시지에서 반환하기 전에 프로시저는 입력 포커스를 지정된 컨트롤로 설정해야 하는지 여부를 결정해야 합니다. 대화 상자 프로시저가 TRUE를 반환하면 시스템은 창 핸들이 wParam 매개 변수에 있는 컨트롤에 입력 포커스를 자동으로 설정합니다. 기본 포커스를 받는 컨트롤이 적절하지 않은 경우 SetFocus 함수를 사용하여 포커스를 적절한 컨트롤로 설정할 수 있습니다. 프로시저에서 입력 포커스를 설정하는 경우 시스템이 기본 포커스를 설정하지 못하도록 하려면 FALSE를 반환해야 합니다. 기본 입력 포커스를 받는 컨트롤은 항상 템플릿에 지정된 첫 번째 컨트롤로, 표시되고, 사용하지 않도록 설정되지 않으며, WS_TABSTOP 스타일이 있습니다. 이러한 컨트롤이 없으면 시스템은 기본 입력 포커스를 템플릿의 첫 번째 컨트롤로 설정합니다.

WM_COMMAND 메시지

컨트롤은 사용자가 컨트롤에서 작업을 수행할 때 대화 상자 프로시저에 WM_COMMAND 메시지를 보낼 수 있습니다. 알림 메시지라고 하는 이러한 메시지는 사용자 입력 절차를 알리고 적절한 응답을 수행하도록 허용합니다.

정적 컨트롤을 제외한 모든 미리 정의된 컨트롤은 선택한 사용자 작업에 대한 알림 메시지를 보냅니다. 예를 들어 누름 단추는 사용자가 단추를 클릭할 때마다 BN_CLICKED 알림 메시지를 보냅니다. 모든 경우에 wParam 매개 변수의 하위 단어에는 컨트롤 식별자가 포함되고, wParam상위 단어에는 알림 코드가 포함되고, lParam 매개 변수에는 컨트롤 창 핸들이 포함됩니다.

대화 상자 프로시저는 알림 메시지를 모니터링하고 처리해야 합니다. 특히 프로시저는 IDOK 또는 IDCANCEL 식별자가 있는 메시지를 처리해야 합니다. 이러한 메시지는 사용자가 대화 상자를 닫아 달라는 요청을 나타냅니다. 프로시저는 모달 대화 상자에 EndDialog 함수를 사용하고 모달 대화 상자에 DestroyWindow 함수를 사용하여 대화 상자를 닫아야 합니다.

또한 창 메뉴와 같은 메뉴가 대화 상자에 있고 사용자가 메뉴 항목을 클릭하면 시스템에서 WM_COMMAND 메시지를 대화 상자 프로시저로 보냅니다. 특히 시스템에서는 사용자가 대화 상자의 창 메뉴에서 닫기를 클릭때마다 wParam 매개 변수가 IDCANCEL로 설정된 WM_COMMAND 메시지를 보냅니다. 메시지는 취소 단추에서 보낸 알림 메시지와 거의 동일하며 정확히 동일한 방식으로 처리되어야 합니다.

WM_PARENTNOTIFY 메시지

컨트롤은 사용자가 컨트롤을 가리키는 동안 마우스 단추를 누를 때마다 WM_PARENTNOTIFY 메시지를 보냅니다. 일부 애플리케이션은 컨트롤의 용도를 설명하는 텍스트 줄을 표시하는 등 컨트롤과 관련된 작업을 수행하기 위한 신호로 이 메시지를 해석합니다.

또한 시스템은 창을 만들고 삭제할 때 WM_PARENTNOTIFY 메시지를 보내지만 대화 상자 템플릿에서 만든 컨트롤에는 전송되지 않습니다. 시스템은 컨트롤을 만들 때 WS_EX_NOPARENTNOTIFY 스타일을 지정하여 이러한 메시지를 방지합니다. 애플리케이션은 대화 상자에 대한 자체 컨트롤을 만들지 않는 한 이 기본 동작을 재정의할 수 없습니다.

컨트롤 색 메시지

컨트롤과 시스템은 대화 상자 프로시저가 특정 브러시 및 색을 사용하여 컨트롤 또는 다른 창의 배경을 그리도록 할 때 컨트롤 색 메시지를 보낼 수 있습니다. 이는 애플리케이션이 대화 상자 및 해당 컨트롤에 사용되는 기본 색을 재정의할 때 유용할 수 있습니다. 다음은 WM_CTLCOLOR 메시지를 대체한 컨트롤 색 메시지입니다.

컨트롤이 자체 배경을 그리기 직전에 컨트롤 색 메시지를 대화 상자 프로시저로 보냅니다. 이 메시지를 통해 프로시저는 사용할 브러시를 지정하고 배경색과 전경색을 설정할 수 있습니다. 이 프로시저는 브러시 핸들을 반환하여 브러시를 지정합니다. 배경색과 전경색을 설정하기 위해 프로시저는 컨트롤의 디스플레이 디바이스 컨텍스트와 함께 SetBkColor SetTextColor 함수를 사용합니다. 컨트롤 색 메시지는 표시 디바이스 컨텍스트에 대한 핸들을 메시지의 wParam 매개 변수의 프로시저에 전달합니다.

프로시저가 WM_ERASEBKGND 메시지를 처리하지 않으면 시스템에서 대화 상자 프로시저에 WM_CTLCOLORDLG 메시지를 보냅니다. 미리 정의된 대화 상자 클래스에는 클래스 배경 브러시가 없으므로 이 메시지를 통해 프로시저가 작업을 수행하는 코드를 포함하지 않고도 자체 배경을 정의할 수 있습니다.

대화 상자 프로시저가 컨트롤 색 메시지를 처리하지 않는 경우 시스템은 기본 창 색의 브러시를 사용하여 스크롤 막대를 제외한 모든 컨트롤과 창의 배경을 그립니다. 애플리케이션은 getSysColor 함수에 COLOR_WINDOW 값을 전달하여 기본 창 색을 검색할 수 있습니다. 배경이 그려지는 동안 디스플레이 디바이스 컨텍스트의 전경색은 기본 텍스트 색(COLOR_WINDOWTEXT)으로 설정됩니다. 스크롤 막대의 경우 시스템은 기본 스크롤 막대 색(COLOR_SCROLLBAR)을 갖는 브러시를 사용합니다. 이 경우 디스플레이 디바이스 컨텍스트의 배경색과 전경색은 각각 흰색과 검은색으로 설정됩니다.

대화 상자 기본 메시지 처리

미리 정의된 대화 상자 클래스의 창 프로시저는 대화 상자 프로시저가 처리하지 않는 모든 메시지에 대한 기본 처리를 수행합니다. 대화 상자 프로시저가 모든 메시지에 대해 FALSE를 반환하면 미리 정의된 창 프로시저가 메시지를 검사 다음 기본 작업을 수행합니다.

메시지 기본 작업
DM_GETDEFID 이 메시지를 대화 상자에 보낼 수 있습니다. 대화 상자에 기본 누름 단추가 있으면 이 대화 상자는 컨트롤 식별자를 반환합니다. 그렇지 않으면 0을 반환합니다.
DM_REPOSITION 이 메시지를 최상위 대화 상자로 보낼 수 있습니다. 대화 상자는 바탕 화면 영역에 맞게 위치를 변경합니다.
DM_SETDEFID 이 메시지를 대화 상자에 보낼 수 있습니다. 대화 상자는 기본 푸시 단추를 wParam 매개 변수의 컨트롤 식별자가 지정한 컨트롤로 설정합니다.
WM_ACTIVATE 대화 상자가 활성화되면 입력 포커스를 이전에 저장된 핸들로 식별된 컨트롤로 복원합니다. 그렇지 않으면 프로시저는 입력 포커스가 있는 컨트롤에 핸들을 저장합니다.
WM_CHARTOITEM 0을 반환합니다.
WM_CLOSE IDCANCEL컨트롤 식별자로 지정하여 대화 상자에 BN_CLICKED 알림 메시지를 게시합니다. 대화 상자에 IDCANCEL 컨트롤 식별자가 있고 컨트롤이 현재 비활성화되어 있으면 프로시저에서 경고가 표시되고 메시지를 게시하지 않습니다.
WM_COMPAREITEM 0을 반환합니다.
WM_ERASEBKGND WM_CTLCOLORDLG 메시지에서 반환된 브러시 또는 기본 창 색을 사용하여 대화 상자 클라이언트 영역을 채웁니다.
WM_GETFONT 애플리케이션 정의 대화 상자 글꼴에 대한 핸들을 반환합니다.
WM_INITDIALOG 0을 반환합니다.
WM_LBUTTONDOWN 입력 포커스가 있는 콤보 상자에 CB_SHOWDROPDOWN 메시지를 보내 컨트롤이 드롭다운 목록 상자를 숨기도록 지시합니다. 이 프로시저는 DefWindowProc를 호출하여 기본 작업을 완료합니다.
WM_NCDESTROY 대화 상자에서 편집 컨트롤에 할당된 전역 메모리를 해제하고(DS_LOCALEDIT 스타일을 지정하는 대화 상자에 적용됨) 애플리케이션 정의 글꼴을 해제합니다(DS_SETFONT 또는 DS_SHELLFONT 스타일을 지정하는 대화 상자에 적용됨). 이 프로시저는 DefWindowProc 함수를 호출하여 기본 작업을 완료합니다.
WM_NCLBUTTONDOWN 입력 포커스가 있는 콤보 상자에 CB_SHOWDROPDOWN 메시지를 보내 컨트롤이 드롭다운 목록 상자를 숨기도록 지시합니다. 이 프로시저는 DefWindowProc를 호출하여 기본 작업을 완료합니다.
WM_NEXTDLGCTL 입력 포커스를 대화 상자의 다음 또는 이전 컨트롤, wParam 매개 변수의 핸들로 식별된 컨트롤 또는 대화 상자의 첫 번째 컨트롤로 설정합니다. 이 컨트롤은 표시되고 비활성화되지 않으며 WS_TABSTOP 스타일이 있습니다. 입력 포커스가 있는 현재 창이 컨트롤이 아닌 경우 프로시저에서 이 메시지를 무시합니다.
WM_SETFOCUS 입력 포커스를 이전에 저장된 컨트롤 창 핸들로 식별된 컨트롤로 설정합니다. 이러한 핸들이 없으면 프로시저는 입력 포커스를 대화 상자 템플릿의 첫 번째 컨트롤로 설정합니다. 이 컨트롤은 표시되고 비활성화되지 않으며 WS_TABSTOP 스타일이 있습니다. 이러한 컨트롤이 없으면 프로시저는 입력 포커스를 템플릿의 첫 번째 컨트롤로 설정합니다.
WM_SHOWWINDOW 대화 상자가 숨겨져 있는 경우 입력 포커스가 있는 컨트롤에 핸들을 저장한 다음 DefWindowProc를 호출하여 기본 작업을 완료합니다.
WM_SYSCOMMAND 대화 상자가 최소화되는 경우 입력 포커스가 있는 컨트롤에 핸들을 저장한 다음 DefWindowProc를 호출하여 기본 작업을 완료합니다.
WM_VKEYTOITEM 0을 반환합니다.

미리 정의된 창 프로시저는 기본 처리를 위해 다른 모든 메시지를 DefWindowProc에 전달합니다.

대화 상자 키보드 인터페이스

시스템은 여러 키에 대한 특수 처리를 수행하는 대화 상자용 특수 키보드 인터페이스를 제공합니다. 인터페이스는 대화 상자의 특정 단추에 해당하는 메시지를 생성하거나 입력 포커스를 한 컨트롤에서 다른 컨트롤로 변경합니다. 다음은 이 인터페이스에 사용되는 키와 해당 동작입니다.

작업
ALT+니모닉 지정된 니모닉을 포함하는 정적 컨트롤 뒤의 첫 번째 컨트롤(WS_TABSTOP 스타일 포함)로 입력 포커스를 이동합니다.
아래로 입력 포커스를 그룹의 다음 컨트롤로 이동합니다.
Enter 키 대화 상자 프로시저에 WM_COMMAND 메시지를 보냅니다. wParam 매개 변수는 기본 푸시 단추의 IDOK 또는 컨트롤 식별자로 설정됩니다.
ESC 키 대화 상자 프로시저에 WM_COMMAND 메시지를 보냅니다. wParam 매개 변수는 IDCANCEL로 설정됩니다.
LEFT 입력 포커스를 그룹의 이전 컨트롤로 이동합니다.
니모닉 지정된 니모닉을 포함하는 정적 컨트롤 뒤의 첫 번째 컨트롤(WS_TABSTOP 스타일 포함)로 입력 포커스를 이동합니다.
RIGHT 입력 포커스를 그룹의 다음 컨트롤로 이동합니다.
Shift+Tab 입력 포커스를 WS_TABSTOP 스타일이 있는 이전 컨트롤로 이동합니다.
Tab 입력 포커스를 WS_TABSTOP 스타일이 있는 다음 컨트롤로 이동합니다.
UP 입력 포커스를 그룹의 이전 컨트롤로 이동합니다.

시스템은 모든 모달 대화 상자에 대한 키보드 인터페이스를 자동으로 제공합니다. 애플리케이션이 IsDialogMessage 함수를 호출하여 기본 메시지 루프에서 메시지를 필터링하지 않는 한 모덜리스 대화 상자에 대한 인터페이스를 제공하지 않습니다. 즉, 애플리케이션은 메시지 큐에서 메시지를 검색한 직후 IsDialogMessage 에 메시지를 전달해야 합니다. 이 함수는 대화 상자의 메시지인 경우 메시지를 처리하고 0이 아닌 값을 반환하여 메시지가 처리되었으며 TranslateMessage 또는 DispatchMessage 함수에 전달되어서는 안 됨을 나타냅니다.

대화 상자 키보드 인터페이스는 방향 키를 사용하여 대화 상자의 컨트롤 사이를 이동하기 때문에 애플리케이션은 이러한 키를 사용하여 모달 대화 상자의 내용이나 IsDialogMessage가 호출되는 모달 대화 상자의 내용을 스크롤할 수 없습니다. 대화 상자에 스크롤 막대가 있는 경우 애플리케이션은 스크롤 막대에 대한 대체 키보드 인터페이스를 제공해야 합니다. 시스템에 마우스가 포함된 경우 스크롤을 위한 마우스 인터페이스를 사용할 수 있습니다.

WS_TABSTOP 스타일

WS_TABSTOP 스타일은 TAB 키 또는 SHIFT+TAB 키를 눌러 사용자가 이동할 수 있는 컨트롤을 지정합니다.

사용자가 TAB 또는 Shift+TAB을 누르면 시스템에서 먼저 이러한 키가 현재 입력 포커스가 있는 컨트롤에 의해 처리되는지 여부를 결정합니다. 컨트롤 에 WM_GETDLGCODE 메시지를 보내고 컨트롤이 DLGC_WANTTAB 반환하면 시스템에서 키를 컨트롤에 전달합니다. 그렇지 않으면 시스템에서 GetNextDlgTabItem 함수를 사용하여 표시되고 사용하지 않도록 설정되지 않고 WS_TABSTOP 스타일이 있는 다음 컨트롤을 찾습니다. 검색은 현재 입력 포커스가 있는 컨트롤에서 시작하여 컨트롤이 만들어진 순서, 즉 대화 상자 템플릿에 정의된 순서로 진행됩니다. 시스템에서 필요한 특성이 있는 컨트롤을 찾으면 시스템은 입력 포커스를 해당 컨트롤로 이동합니다.

WS_TABSTOP 스타일을 사용하여 다음 컨트롤을 검색하면 WS_EX_CONTROLPARENT 스타일이 있는 창이 발견되면 시스템은 창의 자식을 재귀적으로 검색합니다.

애플리케이션은 GetNextDlgTabItem을 사용하여 WS_TABSTOP 스타일이 있는 컨트롤을 찾을 수도 있습니다. 함수는 입력 포커스를 이동하지 않고 WS_TABSTOP 스타일을 갖는 다음 또는 이전 컨트롤의 창 핸들을 검색합니다.

WS_GROUP 스타일

기본적으로 시스템은 사용자가 방향 키를 누를 때마다 입력 포커스를 다음 또는 이전 컨트롤로 이동합니다. 입력 포커스가 있는 현재 컨트롤이 이러한 키를 처리하지 않고 다음 또는 이전 컨트롤이 정적 컨트롤이 아닌 한, 사용자가 방향 키를 계속 누르면 시스템이 대화 상자의 모든 컨트롤을 통해 입력 포커스를 계속 이동합니다.

애플리케이션은 WS_GROUP 스타일을 사용하여 이 기본 동작을 수정할 수 있습니다. 스타일은 컨트롤 그룹의 시작을 표시합니다. 사용자가 방향 키를 누르기 시작할 때 그룹의 컨트롤에 입력 포커스가 있으면 포커스가 그룹에서 다시 기본. 일반적으로 그룹의 첫 번째 컨트롤에는 WS_GROUP 스타일이 있어야 하며 그룹의 다른 모든 컨트롤에는 이 스타일이 없어야 합니다. 그룹의 모든 컨트롤은 연속적이어야 합니다. 즉, 중간 컨트롤 없이 연속적으로 생성되어야 합니다.

사용자가 방향 키를 누르면 시스템은 먼저 입력 포커스가 있는 현재 컨트롤이 방향 키를 처리하는지 여부를 결정합니다. 시스템은 WM_GETDLGCODE 메시지를 컨트롤에 보내고 컨트롤이 DLGC_WANTARROWS 값을 반환하는 경우 키를 컨트롤에 전달합니다. 그렇지 않으면 시스템에서 GetNextDlgGroupItem 함수를 사용하여 그룹의 다음 컨트롤을 결정합니다.

GetNextDlgGroupItem 은 생성된 순서(또는 역순)로 컨트롤을 검색합니다. 사용자가 RIGHT 또는 DOWN 키를 누르면 해당 컨트롤에 WS_GROUP 스타일이 없으면 GetNextDlgGroupItem이 다음 컨트롤을 반환합니다. 그렇지 않으면 함수는 검색 순서를 반대로 하고 WS_GROUP 스타일이 있는 첫 번째 컨트롤을 반환합니다. 사용자가 LEFT 또는 UP 키를 누르면 현재 컨트롤에 WS_GROUP 스타일이 없는 한 함수는 이전 컨트롤을 반환합니다. 현재 컨트롤에 이 스타일이 있는 경우 함수는 검색 순서를 반대로 하고, WS_GROUP 스타일이 있는 첫 번째 컨트롤을 찾고, 찾은 컨트롤 바로 앞에 있는 컨트롤을 반환합니다.

그룹에서 다음 컨트롤을 검색하면 WS_EX_CONTROLPARENT 스타일이 있는 창이 발견되면 시스템은 창의 자식을 재귀적으로 검색합니다.

시스템에 다음 또는 이전 컨트롤이 있으면 컨트롤에 WM_GETDLGCODE 메시지를 전송하여 컨트롤 형식을 확인합니다. 그런 다음 시스템은 입력 포커스를 이동하여 정적 컨트롤이 아닌지 제어합니다. 컨트롤이 자동 라디오 단추인 경우 시스템은 BM_CLICK 메시지를 보냅니다. 애플리케이션은 GetNextDlgGroupItem을 사용하여 그룹에서 컨트롤을 찾을 수도 있습니다.

일반적으로 그룹의 첫 번째 컨트롤은 사용자가 TAB 키를 사용하여 그룹에서 그룹으로 이동할 수 있도록 WS_GROUP 스타일과 WS_TABSTOP 스타일을 결합합니다. 그룹에 라디오 단추가 포함된 경우 애플리케이션은 그룹의 첫 번째 컨트롤에만 WS_TABSTOP 스타일을 적용해야 합니다. 사용자가 그룹의 컨트롤 사이를 이동할 때 시스템이 자동으로 스타일을 이동합니다. 이렇게 하면 사용자가 TAB 키를 사용하여 그룹으로 이동할 때 입력 포커스가 항상 가장 최근에 선택한 컨트롤에 있게 됩니다.

니모닉

니모닉은 단추 레이블 또는 정적 컨트롤의 텍스트에서 선택한 문자 또는 숫자입니다. 시스템은 사용자가 니모닉에 해당하는 키를 누르거나 이 키와 ALT 키를 함께 누를 때마다 니모닉과 연결된 컨트롤로 입력 포커스를 이동합니다. 니모닉은 사용자가 키보드를 사용하여 지정된 컨트롤로 이동할 수 있는 빠른 방법을 제공합니다.

애플리케이션은 컨트롤의 레이블 또는 텍스트에서 선택한 문자 또는 숫자 바로 앞에 앰퍼샌드(&)를 삽입하여 컨트롤에 대한 니모닉을 만듭니다. 대부분의 경우 대화 상자 템플릿에서 컨트롤과 함께 제공되는 null로 끝나는 문자열에는 앰퍼샌드가 포함됩니다. 그러나 애플리케이션은 SetDlgItemText 함수를 사용하여 컨트롤의 기존 레이블 또는 텍스트를 바꿔 언제든지 니모닉을 만들 수 있습니다. 각 컨트롤에 대해 하나의 니모닉만 지정할 수 있습니다. 권장되지만 대화 상자의 니모닉은 고유할 필요가 없습니다.

사용자가 문자 또는 숫자 키를 누르면 시스템은 먼저 입력 포커스가 있는 현재 컨트롤이 키를 처리하는지 여부를 결정합니다. 시스템은 컨트롤에 WM_GETDLGCODE 메시지를 보내고 컨트롤이 DLGC_WANTALLKEYS 또는 DLG_WANTMESSAGE 값을 반환하면 시스템에서 키를 컨트롤에 전달합니다. 그렇지 않으면 니모닉이 지정된 문자 또는 숫자와 일치하는 컨트롤을 검색합니다. 컨트롤을 찾거나 모든 컨트롤을 검사할 때까지 검색을 계속합니다. 검색하는 동안 SS_NOPREFIX 스타일이 있는 모든 정적 컨트롤을 건너뜁니다.

일치하는 니모닉이 있는 컨트롤을 검색하면 WS_EX_CONTROLPARENT 스타일이 있는 창이 발견되면 시스템은 창의 자식을 재귀적으로 검색합니다.

시스템에서 정적 컨트롤을 찾고 컨트롤을 사용하지 않도록 설정하지 않은 경우 시스템은 표시되고 비활성화되지 않고 WS_TABSTOP 스타일을 가진 정적 컨트롤 다음에 입력 포커스를 첫 번째 컨트롤로 이동합니다. 시스템이 일치하는 니모닉이 있는 다른 컨트롤을 찾은 경우 입력 포커스를 해당 컨트롤로 이동합니다. 컨트롤이 기본 푸시 단추인 경우 시스템은 대화 상자 프로시저에 BN_CLICKED 알림 메시지를 보냅니다. 컨트롤이 다른 단추 스타일이고 대화 상자에 동일한 니모닉이 있는 다른 컨트롤이 없으면 시스템에서 컨트롤에 BM_CLICK 메시지를 보냅니다.

대화 상자 설정

대화 상자 설정은 대화 상자의 컨트롤에 대한 현재 선택 영역 및 값입니다. 대화 상자 프로시저는 대화 상자를 만들 때 이러한 설정으로 컨트롤을 초기화하는 작업을 담당합니다. 또한 대화 상자를 삭제하기 전에 컨트롤에서 현재 설정을 검색해야 합니다. 설정을 초기화하고 검색하는 데 사용되는 메서드는 컨트롤 유형에 따라 달라집니다.

자세한 내용은 아래 항목을 참조하세요.

라디오 단추 및 확인란

대화 상자는 라디오 단추와 검사 상자를 사용하여 사용자가 옵션 목록에서 선택할 수 있도록 합니다. 라디오 단추를 사용하면 사용자가 상호 배타적인 옵션 중에서 선택할 수 있습니다. 검사 상자를 사용하면 사용자가 옵션 조합을 선택할 수 있습니다.

대화 상자 프로시저는 CheckDlgButton 함수를 사용하여 검사 상자의 초기 상태를 설정할 수 있으며, 이 함수는 검사 상자를 설정하거나 지웁니다. 상호 배타적인 라디오 단추 그룹의 라디오 단추의 경우 대화 상자 프로시저는 CheckRadioButton 함수를 사용하여 적절한 라디오 단추를 설정하고 다른 라디오 단추를 자동으로 지울 수 있습니다.

대화 상자가 종료되기 전에 대화 상자 프로시저는 단추의 현재 상태를 반환하는 IsDlgButtonChecked 함수를 사용하여 각 라디오 단추 및 검사 상자의 상태를 검사 수 있습니다. 대화 상자는 일반적으로 이 정보를 저장하여 다음에 대화 상자를 만들 때 단추를 초기화합니다.

대화 상자 컨트롤 편집

많은 대화 상자에는 사용자가 텍스트를 입력으로 제공할 수 있는 편집 컨트롤이 있습니다. 대부분의 대화 상자 프로시저는 대화 상자가 처음 시작될 때 편집 컨트롤을 초기화합니다. 예를 들어 대화 상자 프로시저는 사용자가 선택, 수정 또는 바꿀 수 있는 컨트롤에 제안된 파일 이름을 배치할 수 있습니다. 대화 상자 프로시저는 지정된 버퍼에서 편집 컨트롤로 텍스트를 복사하는 SetDlgItemText 함수를 사용하여 편집 컨트롤의 텍스트를 설정할 수 있습니다. 편집 컨트롤이 입력 포커스를 받으면 편집할 전체 텍스트를 자동으로 선택합니다.

편집 컨트롤은 해당 텍스트를 대화 상자에 자동으로 반환하지 않으므로 대화 상자 프로시저는 텍스트가 종료되기 전에 검색해야 합니다. 편집 컨트롤 텍스트를 버퍼에 복사하는 GetDlgItemText 함수를 사용하여 텍스트를 검색할 수 있습니다. 대화 상자 프로시저는 일반적으로 나중에 편집 컨트롤을 초기화하기 위해 이 텍스트를 저장하거나 처리를 위해 부모 창에 전달합니다.

일부 대화 상자는 사용자가 숫자를 입력할 수 있도록 하는 편집 컨트롤을 사용합니다. 대화 상자 프로시저는 편집 컨트롤에서 텍스트를 검색하고 텍스트를 10진수 값으로 변환하는 GetDlgItemInt 함수를 사용하여 편집 컨트롤에서 숫자를 검색할 수 있습니다. 사용자가 숫자를 10진수로 형식화합니다. 서명되거나 서명되지 않을 수 있습니다. 대화 상자 프로시저는 SetDlgItemInt 함수를 사용하여 정수를 표시할 수 있습니다. SetDlgItemInt 는 부호 있거나 부호 없는 정수를 10진수 문자열로 변환합니다.

목록 상자, 콤보 상자 및 디렉터리 목록

일부 대화 상자에는 사용자가 하나 이상의 이름을 선택할 수 있는 이름 목록이 표시됩니다. 예를 들어 파일 이름 목록을 표시하기 위해 대화 상자는 일반적으로 목록 상자와 DlgDirListDlgDirSelectEx 함수를 사용합니다. DlgDirList 함수는 현재 디렉터리의 파일 이름으로 목록 상자를 자동으로 채웁니다. DlgDirSelect 함수는 목록 상자에서 선택한 파일 이름을 검색합니다. 이러한 두 함수는 사용자가 이름과 위치를 입력하지 않고도 파일을 선택할 수 있도록 대화 상자에서 디렉터리 목록을 표시하는 편리한 방법을 제공합니다.

대화 상자는 콤보 상자를 사용하여 파일 이름 목록을 표시할 수도 있습니다. DlgDirListComboBox 함수는 콤보 상자의 목록 상자 부분을 현재 디렉터리의 파일 이름으로 자동으로 채웁니다. DlgDirSelectComboBoxEx 함수는 목록 상자 부분에서 선택한 파일 이름을 검색합니다.

대화 상자 컨트롤 메시지

많은 컨트롤은 컨트롤에서 수신할 때 일부 작업을 수행하게 하는 미리 정의된 메시지를 인식합니다. 예를 들어 BM_SETCHECK 메시지는 검사 상자에 검사 설정하고 EM_GETSEL 메시지는 현재 선택된 컨트롤의 텍스트 부분을 검색합니다. 컨트롤 메시지는 표준 함수보다 더 크고 유연한 컨트롤 액세스 권한을 대화 상자에 제공하므로 대화 상자에 사용자와의 복잡한 상호 작용이 필요할 때 자주 사용됩니다.

대화 상자 프로시저는 컨트롤 식별자를 제공하고 SendDlgItemMessage 함수를 사용하여 컨트롤에 메시지를 보낼 수 있습니다. 이 함수는 창 핸들 대신 컨트롤 식별자를 사용하여 메시지를 받을 컨트롤을 식별한다는 점을 제외하면 SendMessage 함수와 동일합니다. 지정된 메시지를 사용하려면 대화 프로시저에서 메시지와 함께 매개 변수를 보내야 할 수 있으며 메시지에 해당 반환 값이 있을 수 있습니다. 각 컨트롤 메시지의 작업 및 요구 사항은 메시지의 목적과 메시지를 처리하는 컨트롤에 따라 달라집니다.

컨트롤 메시지에 대한 자세한 내용은 Windows 컨트롤을 참조 하세요.

사용자 지정 대화 상자

애플리케이션은 미리 정의된 대화 상자 클래스를 사용하는 대신 대화 상자에 애플리케이션 정의 창 클래스를 사용하여 사용자 지정 대화 상자를 만들 수 있습니다. 애플리케이션은 일반적으로 대화 상자가 기본 창인 경우 이 메서드를 사용하지만 표준 겹치는 창이 있는 애플리케이션에 대한 모달 및 모덜리스 대화 상자를 만드는 데도 유용합니다.

애플리케이션 정의 창 클래스를 사용하면 애플리케이션이 대화 상자의 창 프로시저를 정의하고 메시지를 처리한 후 대화 상자 프로시저로 보낼 수 있습니다. 또한 애플리케이션에서 클래스 아이콘, 클래스 배경 브러시 및 대화 상자의 클래스 메뉴를 정의할 수 있습니다. 애플리케이션은 대화 상자를 만들기 전에 창 클래스를 등록해야 하며 대화 상자 템플릿에 창 클래스의 원자 값 또는 이름을 제공해야 합니다.

대부분의 애플리케이션은 먼저 미리 정의된 대화 상자 클래스에 대한 클래스 정보를 검색하고 정보를 사용하여 WNDCLASS 구조를 채우는 GetClassInfo 함수에 전달하여 새 대화 상자 클래스를 만듭니다. 애플리케이션은 클래스 이름, 브러시 및 아이콘과 같은 구조체의 개별 멤버를 수정한 다음 RegisterClass 함수를 사용하여 새 클래스를 등록합니다. 애플리케이션이 WNDCLASS 구조를 자체적으로 채우는 경우 cbWndExtra 멤버를 DLGWINDOWEXTRA로 설정해야 합니다. 이는 시스템에서 각 대화 상자에 필요한 추가 바이트 수입니다. 애플리케이션이 각 대화 상자에 대해 추가 바이트를 사용하는 경우 시스템에 필요한 추가 바이트를 초과해야 합니다.

사용자 지정 대화 상자의 창 프로시저에는 다른 창 프로시저와 동일한 매개 변수 및 요구 사항이 있습니다. 그러나 다른 창 프로시저와 달리 이 대화 상자의 창 프로시저는 처리하지 않는 메시지에 대해 DefWindowProc 함수 대신 DefDlgProc 함수를 호출해야 합니다. DefDlgProc 은 대화 상자 프로시저 호출을 포함하여 미리 정의된 대화 상자의 창 프로시저와 동일한 기본 메시지 처리를 수행합니다.

애플리케이션은 미리 정의된 대화 상자의 창 프로시저를 서브클래싱하여 사용자 지정 대화 상자를 만들 수도 있습니다. SetWindowLong 함수를 사용하면 애플리케이션에서 지정된 창의 창 프로시저를 지정할 수 있습니다. 애플리케이션은 SetClassLong 함수를 사용하여 서브클래스를 시도할 수도 있지만, 이렇게 하면 애플리케이션에 속한 대화 상자뿐만 아니라 시스템의 모든 대화 상자에도 영향을 줍니다.

사용자 지정 대화 상자를 만드는 애플리케이션은 경우에 따라 대화 상자에 대한 대체 키보드 인터페이스를 제공합니다. 모덜리스 대화 상자의 경우 애플리케이션이 IsDialogMessage 함수를 호출하지 않고 사용자 지정 창 프로시저에서 모든 키보드 입력을 처리하는 것을 의미할 수 있습니다. 이러한 경우 애플리케이션은 WM_NEXTDLGCTL 메시지를 사용하여 입력 포커스를 한 컨트롤에서 다른 컨트롤로 이동하는 데 필요한 코드를 최소화할 수 있습니다. 이 메시지는 DefDlgProc전달될 때 입력 포커스를 지정된 컨트롤로 이동하고 기본 푸시 단추 테두리 이동 또는 자동 라디오 단추 설정과 같은 컨트롤의 모양을 업데이트합니다.