속성 시트 정보

속성 시트는 사용자가 항목의 속성을 보고 편집할 수 있는 창입니다. 예를 들어, 스프레드시트 애플리케이션에서는 속성 시트를 이용해 사용자가 셀의 글꼴과 테두리 속성을 설정하거나 디스크 드라이브, 프린터 또는 마우스 같은 디바이스의 속성을 보고 설정할 수 있습니다.

이 섹션에서는 다음 항목을 설명합니다.

속성 시트 기본 사항

애플리케이션에서 속성 시트를 구현하려면 프로젝트에 Prsht.h 헤더 파일을 포함합니다. Prsht.h에는 속성 시트에 사용되는 식별자가 모두 포함되어 있습니다.

속성 시트에는 페이지라고 하는 겹치는 자식 창이 하나 이상 포함되어 있고, 각 창에는 관련 속성 그룹을 설정하기 위한 제어 창이 포함되어 있습니다. 예를 들어 페이지에는 형식 스타일, 점 크기, 색 등을 포함해 항목의 글꼴 속성을 설정하기 위한 컨트롤이 포함될 수 있습니다. 각 페이지에는 사용자가 속성 시트의 전경으로 페이지를 가져오기 위해 선택할 수 있는 탭이 있습니다. 예를 들어 Date-Time 제어판 애플리케이션은 다음과 같은 속성 시트를 표시합니다.

screen shot of a property sheet with two tabs, one of which shows a clock and a monthly calendar control

탭 페이지가 여러 개 있는 표준 속성 시트를 이용하면 사용자가 모든 속성에 임의로 액세스할 수 있습니다. 속성을 순서대로 설정하는 것이 더 적절한 경우 마법사를 사용할 수 있습니다.

속성 시트 대화 상자

속성 시트와 이 시트에 포함된 페이지는 실제로는 대화 상자입니다. 속성 시트는 페이지를 관리하고 공용 컨테이너를 제공하는 시스템 정의 대화 상자입니다. 속성 시트 대화 상자는 모달일 수도 있고, 모덜리스일 수도 있습니다. 여기에는 프레임과 제목 표시줄 및 확인, 취소, 적용, 도움말(선택 사항)의 네 가지 단추가 포함됩니다. 페이지 대화 상자 프로시저에서는 사용자가 단추를 클릭할 때 WM_NOTIFY 메시지 형식의 알림 코드를 받습니다.

참고

이 섹션의 모든 정보가 모양과 동작이 다소 다른 마법사에 적용되는 것은 아닙니다. 예를 들어 마법사에는 각기 다른 단추 집합이 있고 탭이 없습니다. 자세한 내용은 마법사 만들기를 참조하세요.

속성 시트의 각 페이지는 모덜리스 대화 상자로, 항목의 속성을 보고 편집하는 데 사용되는 컨트롤 창을 관리합니다. 각 페이지를 만드는 데 사용되는 대화 상자 템플릿뿐만 아니라, 컨트롤을 관리하고 해당 항목의 속성을 설정하는 대화 상자 프로시저를 제공합니다.

속성 시트는 페이지가 활성화 기능을 얻거나 잃을 때 그리고 사용자가 확인, 취소, 적용 또는 도움말 단추를 클릭할 때 페이지의 대화 상자 프로시저로 알림 코드를 보냅니다. 알림은 WM_NOTIFY 메시지 형식으로 전송됩니다. lParam 매개 변수는 NMHDR 구조체의 주소로, 속성 시트 대화 상자에 대한 창 핸들을 포함합니다.

일부 알림 코드는 페이지에서 WM_NOTIFY 메시지에 대한 응답으로 TRUE 또는 FALSE를 반환하도록 요구합니다. 이렇게 하려면 페이지에서 SetWindowLong 함수를 사용하여 페이지 대화 상자의 DWL_MSGRESULT 값을 TRUE 또는 FALSE로 설정해야 합니다.

페이지

속성 시트는 하나 이상의 페이지를 포함해야 하지만, Windows 헤더 파일에 정의된 MAXPROPPAGES 값보다 많이 포함할 수는 없습니다. 각 페이지에는 속성 시트에 페이지가 추가되는 순서에 따라 속성 시트가 할당하는 인덱스(0부터 시작)가 있습니다. 인덱스는 속성 시트로 보내는 메시지에서 사용됩니다.

속성 페이지에는 중첩된 대화 상자가 포함될 수 있습니다. 이 경우, 최상위 대화 상자에 대한 WS_EX_CONTROLPARENT 스타일을 포함하고 부모 대화 상자에 대한 핸들을 사용하여 IsDialogMessage 함수를 호출해야 합니다. 이렇게 하면 사용자가 니모닉과 대화 상자 탐색 키를 사용하여 중첩된 대화 상자의 컨트롤로 포커스를 이동할 수 있습니다.

각 페이지에는 해당 아이콘과 레이블이 있습니다. 속성 시트에서는 각 페이지에 대한 탭을 만들고 탭에 아이콘과 레이블을 표시합니다. 모든 속성 시트 페이지에서는 굵지 않은 글꼴을 사용해야 합니다. 글꼴이 굵게 표시되지 않도록 하려면 대화 상자 템플릿에서 DS_3DLOOK 스타일을 지정합니다.

페이지 대화 상자 프로시저에서 EndDialog 함수를 호출하면 안 됩니다. 이렇게 하면 페이지뿐만 아니라 전체 속성 시트가 삭제됩니다.

속성 시트 페이지의 최소 크기는 대화 상자 가로 단위 212개, 세로 단위 114개입니다. 페이지 대화 상자가 이보다 작으면 페이지가 최소 크기를 충족할 때까지 확대됩니다. Prsht.h 헤더 파일에는 다음 표와 같이 속성 시트 페이지에 권장되는 세 가지 크기 집합이 포함되어 있습니다.

크기 설명
PROP_SM_CXDLG 작은 속성 시트 페이지의 너비(대화 상자 단위)입니다.
PROP_SM_CYDLG 작은 속성 시트 페이지의 높이(대화 상자 단위)입니다.
PROP_MED_CXDLG 중간 크기인 속성 시트 페이지의 너비(대화 상자 단위)입니다.
PROP_MED_CYDLG 중간 크기인 속성 시트 페이지의 높이(대화 상자 단위)입니다.
PROP_LG_CXDLG 큰 속성 시트 페이지의 너비(대화 상자 단위)입니다.
PROP_LG_CYDLG 큰 속성 시트 페이지의 높이(대화 상자 단위)입니다.

이러한 권장 크기를 사용하면 애플리케이션과 다른 Microsoft Windows 애플리케이션 간의 시각적 일관성을 보장하는 데 도움이 됩니다.

Microsoft Visual Studio 리소스 편집기의 리소스 추가 대화 상자에서 적절한 크기의 페이지를 만들 수 있습니다. 대화 상자 노드를 확장하고 IDD_PROPPAGE_LARGE, IDD_PROPPAGE_MEDIUM 또는 IDD_PROPPAGE_SMALL을 선택합니다.

속성 시트는 가장 큰 페이지에 맞게 자동으로 크기가 조정됩니다.

속성 시트 만들기

속성 시트를 만들기 전에 하나 이상의 페이지를 정의해야 합니다. 여기에는 PROPSHEETPAGE 구조체를 아이콘, 레이블, 대화 상자 템플릿, 대화 상자 프로시저 등의 페이지 관련 정보로 채운 다음 CreatePropertySheetPage 함수 호출 시 구조체의 주소를 지정하는 작업이 포함됩니다. 함수는 페이지를 고유하게 식별하는 HPROPSHEETPAGE 형식에 대한 핸들을 반환합니다.

속성 시트를 만들려면 PropertySheet 함수 호출 시 PROPSHEETHEADER 구조체의 주소를 지정합니다. 구조체는 속성 시트의 아이콘과 제목을 정의하고, CreatePropertySheetPage를 사용하여 가져온 HPROPSHEETPAGE 핸들 배열의 주소도 포함합니다. PropertySheet에서 속성 시트를 만들 때 배열에서 식별된 페이지가 포함됩니다. 페이지는 배열에 포함된 것과 동일한 순서로 속성 시트에 표시됩니다.

속성 시트에 페이지를 할당하는 또 다른 방법은 HPROPSHEETPAGE 핸들 배열 대신 PROPSHEETPAGE 구조체의 배열을 지정하는 것입니다. 이 경우 PropertySheet에서는 페이지를 속성 시트에 추가하기 전에 페이지용 핸들을 만듭니다.

페이지가 만들어지면 해당 대화 상자 프로시저에서 WM_INITDIALOG 메시지를 수신합니다. 메시지의 lParam 매개 변수는 페이지를 만들 때 정의된 PROPSHEETPAGE 구조체의 복사본을 가리키는 포인터입니다. 특히 페이지를 만들 때 구조체의 lParam 멤버를 사용하여 애플리케이션 정의 정보를 대화 상자 프로시저에 전달할 수 있습니다. lParam 멤버를 제외하고 이 구조체는 읽기 전용으로 처리되어야 합니다. lParam 이외의 항목을 수정하면 예측할 수 없는 결과가 발생합니다.

이후에 시스템에서 페이지의 PROPSHEETPAGE 구조체 복사본을 애플리케이션에 전달하는 경우 동일한 포인터를 사용합니다. 구조체에 대한 모든 변경 내용이 전달됩니다. lParam 멤버는 시스템에서 무시되기 때문에 애플리케이션의 다른 부분에 정보를 보내도록 수정할 수 있습니다. 예를 들면, lParam을 사용하여 페이지의 PropSheetPageProc 호출 함수에 정보를 전달할 수 있습니다.

PropertySheet는 속성 시트의 크기와 초기 위치를 자동으로 설정합니다. 위치는 소유자 창의 위치를 기반으로 하며, 크기는 속성 시트를 만들 때 페이지 배열에 지정된 가장 큰 페이지를 기반으로 합니다. 페이지가 속성 시트 하단에 있는 단추 네 개의 너비와 일치하도록 하려면 가장 넓은 페이지의 너비를 대화 상자 단위 190개로 설정합니다.

속성 시트의 크기는 리소스 파일에 있는 대화 상자 템플릿의 너비높이 속성에서 계산됩니다. 자세한 내용은 DIALOG 리소스 또는 DIALOGEX 리소스를 참조하세요. 그러나 호환성을 위해 차원은 페이지에서 사용하는 글꼴이 아닌 MS Shell Dlg 글꼴을 기준으로 계산됩니다. 다른 글꼴을 사용하는 페이지를 디자인하는 경우, 다음 제안 중 하나를 사용할 수 있습니다.

  • 대화 상자 템플릿의 크기를 조정하여 MS Shell Dlg 글꼴과 페이지에서 실제로 사용하는 글꼴 간의 크기 차이를 보정합니다. 예를 들어 MS Shell Dlg보다 두 배 넓은 글꼴을 선택한 경우, 대화 상자 템플릿의 너비 속성을 일반 사용의 두 배로 설정합니다.
  • DIALOGEX 템플릿을 사용하고 DS_SHELLFONT 대화 상자 스타일을 설정합니다. 이 경우 속성 시트 관리자는 대화 상자 템플릿에서 사용하는 글꼴을 기준으로 대화 상자 템플릿 차원을 해석합니다.

페이지 추가 및 제거

속성 시트를 만든 후 애플리케이션에서 PSM_ADDPAGE 메시지를 보내 기존 페이지 집합의 끝에 페이지를 추가할 수 있습니다. 기존 페이지 사이에 페이지를 삽입하려면 PropSheet_InsertPage 메시지를 보냅니다. 속성 시트를 만든 후에는 그 크기를 변경할 수 없습니다. 추가되거나 삽입된 모든 페이지는 현재 속성 시트에 있는 가장 큰 페이지보다 크지 않아야 합니다. 페이지를 제거하려면 PSM_REMOVEPAGE 메시지를 보냅니다.

페이지를 정의할 때 페이지를 만들거나 제거하는 경우 속성 시트에서 호출하는 PropSheetPageProc 호출 함수의 주소를 지정할 수 있습니다. PropSheetPageProc을 사용하면 개별 페이지에 대해 초기화 및 정리 작업을 수행할 수 있습니다.

참고

속성 시트가 페이지 목록을 조작하는 동안 여러 개의 메시지와 한 개의 함수 호출이 발생합니다. 이 작업이 진행되는 동안 페이지 목록을 수정하려고 하면 예측할 수 없는 결과가 발생합니다. PropSheetPageProc 구현 시 또는 다음과 같은 알림 및 Windows 메시지를 처리하는 동안 페이지를 추가, 삽입하거나 제거하지 마세요.

이러한 메시지 중 하나를 처리하는 동안 또는 PropSheetPageProc이 작동하는 동안 속성 시트 페이지를 수정해야 하는 경우 프라이빗 Windows 메시지를 게시합니다. 애플리케이션은 속성 시트 관리자가 작업을 완료할 때까지 해당 메시지를 수신하지 않습니다. 이때 페이지 목록을 수정해도 안전합니다.

속성 시트가 제거되면 속성 시트에 추가된 모든 페이지가 자동으로 제거됩니다. 해당 페이지는 페이지를 만드는 데 사용된 배열에 지정된 것과 반대 순서로 제거됩니다. CreatePropertySheetPage 함수에 의해 만들어졌지만 속성 시트에 추가되지 않은 페이지를 제거하려면 DestroyPropertySheetPage 함수를 사용합니다.

속성 시트 제목 및 페이지 레이블

속성 시트를 만드는 데 사용된 PROPSHEETHEADER 구조체에서 속성 시트의 제목을 지정합니다. dwFlags 멤버에 PSH_PROPTITLE 값이 포함된 경우, 속성 시트는 버전에 따라 접미사 ‘Properties’ 또는 접두사 ‘Properties for’를 추가합니다. PSM_SETTITLE 메시지를 사용하여 속성 시트를 만든 후에는 제목을 변경할 수 있습니다. Aero 마법사에서 이 메시지를 사용하여 내부 페이지의 제목을 동적으로 변경할 수 있습니다.

기본적으로 속성 시트는 대화 상자 템플릿에 지정된 이름 문자열을 페이지의 레이블로 사용합니다. 페이지를 정의하는 PROPSHEETPAGE 구조체의 dwFlags 멤버에 PSP_USETITLE 값을 포함하여 이름 문자열을 재정의할 수 있습니다. PSP_USETITLE이 지정된 경우 pszTitle 멤버는 페이지의 레이블 문자열 주소를 포함해야 합니다.

페이지 활성화

속성 시트는 한 번에 하나의 활성 페이지만 포함할 수 있습니다. 활성화된 페이지는 겹치는 페이지 스택의 전경에 있습니다. 사용자는 탭을 선택하여 페이지를 활성화하고, 애플리케이션은 PSM_SETCURSEL 메시지를 사용하여 페이지를 활성화합니다.

속성 시트는 활성화를 잃게 될 페이지에 PSN_KILLACTIVE 알림 코드를 보냅니다. 이에 대한 응답으로 페이지에서는 사용자가 페이지에 변경한 내용의 유효성을 검사해야 합니다. 활성화를 잃기 전 페이지에 사용자가 추가로 입력해야 하는 경우 SetWindowLong 함수를 사용하여 페이지의 DWL_MSGRESULT 값을 TRUE로 설정합니다. 또한 페이지에 문제를 설명하고 권장 작업을 제공하는 메시지 상자가 표시되어야 합니다. 활성화를 잃어도 괜찮은 경우 DWL_MSGRESULTFALSE로 설정합니다.

활성화되는 페이지를 표시하기 전에 속성 시트는 PSN_SETACTIVE 알림 코드를 페이지로 보냅니다. 페이지는 컨트롤 창을 초기화하여 응답해야 합니다.

도움말 단추

속성 시트에는 프레임 하단의 확인/취소/적용 단추 옆에 표시되는 속성 시트 도움말 단추와 상황에 맞는 도움말을 제공하는 표준 캡션 표시줄 단추 등 두 개의 도움말 단추가 표시될 수 있습니다.

속성 시트 도움말 단추는 선택 사항이며, 페이지별로 페이지에서 사용하도록 설정할 수 있습니다. 하나 이상의 페이지에 대한 속성 시트 도움말 단추를 표시하려면 다음을 수행합니다.

  • 속성 시트 PROPSHEETHEADER 구조체의 dwFlags 멤버에서 PSH_HASHELP 플래그를 설정합니다.
  • 도움말 단추를 표시할 각 페이지에 대해 페이지 PROPSHEETPAGE 구조체의 dwFlags 멤버에서 PSP_HASHELP 플래그를 설정합니다.

사용자가 도움말 단추를 클릭하면 활성 페이지에서 PSN_HELP 알림 코드를 수신합니다. 페이지는 일반적으로 WinHelp 함수를 호출하여 도움말 정보를 표시함으로써 응답해야 합니다.

캡션 표시줄 도움말 단추 제거

캡션 표시줄 도움말 단추는 기본적으로 표시되므로, 확인/취소/적용 단추에서 상황에 맞는 도움말을 항상 사용할 수 있습니다. 그러나 필요한 경우 이 단추를 제거할 수 있습니다. 속성 시트의 캡션 표시줄 도움말 단추를 제거하려면 다음을 수행합니다.

  • 버전 5.80 이전의 공용 컨트롤 버전에서는 속성 시트 호출 함수를 구현해야 합니다.
  • 공용 컨트롤 버전 5.80 이상의 경우 속성 시트 PROPSHEETHEADER 구조체의 dwFlags 멤버에서 PSH_NOCONTEXTHELP 플래그를 간단히 설정할 수 있습니다. 그러나 이전 공용 컨트롤 버전과 이전 버전이 호환되어야 하는 경우 호출 함수를 구현해야 합니다.

캡션 표시줄 도움말 단추를 제거하는 속성 시트 호출 함수를 구현하려면 다음을 수행합니다.

  • 속성 시트 PROPSHEETHEADER 구조체의 dwFlags 멤버에서 PSH_USECALLBACK 플래그를 설정합니다.
  • 호출 함수를 가리키도록 PROPSHEETHEADER 구조체의 pfnCallBack 멤버를 설정합니다.
  • 호출 함수를 구현합니다. 이 함수는 PSCB_PRECREATE 메시지를 받으면 속성 시트의 대화 상자 템플릿에 대한 포인터도 받게 됩니다. 이 템플릿에서 DS_CONTEXTHELP 스타일을 제거합니다.

다음 샘플에는 이러한 호출 함수를 구현하는 방법이 나와 있습니다.

int CALLBACK RemoveContextHelpProc(HWND hwnd, UINT message, LPARAM lParam)
{
    switch (message) 
    {
    case PSCB_PRECREATE:
        // Remove the DS_CONTEXTHELP style from the
        // dialog box template
        if (((LPDLGTEMPLATEEX)lParam)->signature ==    
           0xFFFF)
           {
            ((LPDLGTEMPLATEEX)lParam)->style 
            &= ~DS_CONTEXTHELP;
        }
        else {
            ((LPDLGTEMPLATE)lParam)->style 
            &= ~DS_CONTEXTHELP;
        }
        return TRUE;
    }
    return TRUE;
}

DLGTEMPLATEEX 구조체가 정의되지 않은 경우 다음 선언을 포함합니다.

#include <pshpack1.h>

typedef struct DLGTEMPLATEEX
{
    WORD dlgVer;
    WORD signature;
    DWORD helpID;
    DWORD exStyle;
    DWORD style;
    WORD cDlgItems;
    short x;
    short y;
    short cx;
    short cy;
} DLGTEMPLATEEX, *LPDLGTEMPLATEEX;

#include <poppack.h>

확인, 취소, 적용 단추

확인 단추와 적용 단추는 비슷합니다. 둘 다 사용자가 변경한 속성의 유효성을 검사하고 변경 내용을 적용하도록 속성 시트의 페이지에 지시합니다. 유일한 차이점은 확인 단추를 클릭하면 변경 내용이 적용된 후 속성 시트가 제거된다는 것입니다.

사용자가 확인 또는 적용 단추를 클릭하면 속성 시트가 활성 페이지에 PSN_KILLACTIVE 알림을 전송하여 사용자가 변경한 내용의 유효성을 검사할 수 있는 기회를 제공합니다. 변경 내용이 유효한 경우 페이지는 DWL_MSGRESULT 값이 FALSE로 설정된 SetWindowLong 함수를 호출해야 합니다. 사용자의 변경 내용이 잘못된 경우 페이지는 DWL_MSGRESULTTRUE로 설정하고 사용자에게 문제를 알리는 대화 상자를 표시해야 합니다. PSN_KILLACTIVE 메시지에 대한 응답으로 DWL_MSGRESULTFALSE로 설정할 때까지 페이지는 활성 상태를 유지합니다.

DWL_MSGRESULTFALSE로 설정하여 페이지가 PSN_KILLACTIVE 알림에 응답하면 속성 시트는 각 페이지에 PSN_APPLY 알림을 보냅니다. 페이지에서 이 알림을 받으면 해당 항목에 새 속성을 적용해야 합니다. 페이지에 대한 변경 내용이 유효함을 속성 시트에 나타내려면 DWL_MSGRESULTPSNRET_NOERROR로 설정하여 SetWindowLong을 호출합니다. 페이지에 대한 변경 내용이 유효하지 않으면 오류를 반환합니다. 이렇게 하면 속성 시트가 제거되지 않고, PSN_APPLY 알림을 받은 페이지 또는 적용 단추를 눌렀을 때 포커스가 있는 페이지에 포커스를 반환합니다. 오류를 반환하고 포커스를 받을 페이지를 나타내려면 DWL_MSGRESULT를 다음 값 중 하나로 설정합니다.

  • PSNRET_INVALID. 속성 시트는 삭제되지 않고 포커스가 이 페이지로 돌아갑니다.
  • PSNRET_INVALID_NOCHANGEPAGE. 속성 시트가 제거되지 않고 단추를 눌렀을 때 포커스가 있는 페이지로 포커스가 반환됩니다.

애플리케이션은 PSM_APPLY 메시지를 사용하여 적용 단추의 선택을 시뮬레이션할 수 있습니다.

페이지가 활성화되면 처음에는 적용 단추를 사용할 수 없게 설정되어 적용할 속성 변경 내용이 아직 없음을 나타냅니다. 사용자가 속성을 편집했음을 나타내는 컨트롤 중 하나를 통해 페이지가 입력을 받으면 페이지에서 속성 시트에 PSM_CHANGED 메시지를 보내야 합니다. 이 메시지로 인해 속성 시트에서 적용 단추를 사용할 수 있게 됩니다. 이후에 사용자가 적용 또는 취소 단추를 클릭하면 페이지에서 컨트롤을 다시 초기화한 후 PSM_UNCHANGED 메시지를 보내 적용 단추를 다시 사용할 수 없도록 설정해야 합니다.

경우에 따라서는 적용 단추로 인해 페이지에서 속성 시트가 변경되고 변경 내용을 실행 취소할 수 없게 됩니다. 이 경우 페이지에서 속성 시트에 PSM_CANCELTOCLOSE 메시지를 보내야 합니다. 이 메시지로 인해 속성 시트에서 확인 단추의 텍스트가 ‘닫기’로 변경되어 적용된 변경 내용을 취소할 수 없음을 나타냅니다.

경우에 따라 페이지는 변경 내용을 적용하기 전에 Windows를 다시 시작하거나 시스템을 다시 부팅해야 하는 시스템 구성을 변경합니다. 이와 같이 변경한 후에는 페이지에서 속성 시트에 PSM_RESTARTWINDOWS 또는 PSM_REBOOTSYSTEM 메시지를 보내야 합니다. 이러한 메시지로 인해 속성 시트가 제거되면 PropertySheet 함수에서 ID_PSRESTARTWINDOWS 또는 ID_PSREBOOTSYSTEM 값을 반환합니다.

사용자가 취소 단추를 클릭하면 속성 시트에서 모든 페이지에 PSN_RESET 알림 코드를 보내 속성 시트가 곧 제거될 예정임을 나타냅니다. 페이지는 알림을 사용하여 정리 작업을 수행해야 합니다.

마법사

마법사는 특별한 유형의 속성 시트입니다. 마법사는 애플리케이션에서 제어하는 시퀀스로 한 번에 하나씩 페이지를 표시하도록 설계되었습니다. 사용자는 탭을 클릭하여 페이지 그룹에서 선택하는 대신 단추를 클릭하여 한 번에 한 페이지씩 순서를 앞뒤로 이동합니다. 예를 들어 다음 스크린샷은 하드웨어 추가 마법사의 시작 페이지를 보여 줍니다.

screen shot of the welcome page of a wizard

다음 스크린샷은 Windows Vista에 도입된 새로운 스타일인 Aero 마법사의 첫 번째 페이지를 보여 줍니다.

screen shot of the first page of an aero wizard

마법사에 대한 자세한 내용은 마법사 만들기를 참조하세요.