다음을 통해 공유


속성 시트에 대하여

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

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

속성 시트 기본 사항

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

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

속성 시트의 스크린샷에는 두 개의 탭이 있으며, 그 중 하나에는 시계와 월별 달력 컨트롤이 표시됩니다.

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

속성 시트 대화 상자

속성 시트와 이 시트에 포함된 페이지는 실제로 대화 상자입니다. 속성 시트는 페이지를 관리하고 공통 컨테이너를 제공하는 시스템 정의 대화 상자입니다. 속성 시트 대화 상자는 모달 또는 모달리스일 수 있습니다. 프레임, 제목 표시줄 및 네 개의 단추가 포함됩니다. 확인, 취소, 적용 및 (필요에 따라) 도움말 . 페이지의 대화 상자 프로시저는 사용자가 단추를 클릭할 때 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 메시지를 사용하여 속성 시트를 만든 후 제목을 변경할 수 있습니다. 에어로 마법사에서 이 메시지를 사용하여 내부 페이지의 제목을 동적으로 변경할 수 있습니다.

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

페이지 활성화

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

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

활성화를 얻는 페이지가 표시되기 전에 속성 시트는 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_MSGRESULT TRUE 설정해야 하며 사용자에게 문제를 알리는 대화 상자를 표시해야 합니다. 페이지는 PSN_KILLACTIVE 메시지에 대한 응답으로 DWL_MSGRESULT을(를) FALSE로 설정해야 활성을 종료합니다.

페이지가 PSN_KILLACTIVE 알림에 응답하여 DWL_MSGRESULTFALSE로 설정하면, 속성 시트는 각 페이지에 PSN_APPLY 알림을 보냅니다. 페이지에서 이 알림을 받으면 해당 항목에 새 속성을 적용해야 합니다. 속성 시트에 변경 내용이 페이지에 유효하다는 것을 나타내기 위해, SetWindowLong 함수를 호출하여 DWL_MSGRESULTPSNRET_NOERROR로 설정합니다. 페이지에 대한 변경 내용이 유효하지 않으면 오류를 반환합니다. 이렇게 하면 속성 시트가 제거되지 않고 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 알림 코드를 보냅니다. 페이지는 정리 작업을 수행하려면 알림을 사용해야 합니다.

마법사

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

마법사 환영 페이지의 스크린샷

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

에어로 마법사

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