다음을 통해 공유


속성 시트 및 속성 페이지

개체의 속성은 COM 인터페이스 또는 개체의 IDispatch 구현을 통해 메서드와 동일한 클라이언트에 노출되므로 이러한 메서드를 호출하는 프로그램에서 속성을 변경할 수 있습니다. 속성 페이지의 OLE 기술은 Windows 사용자 인터페이스 표준에 따라 개체의 속성에 대한 사용자 인터페이스를 빌드하는 수단을 제공합니다. 따라서 속성은 최종 사용자에게 노출됩니다. 개체의 속성 시트는 각 탭이 특정 속성 페이지에 해당하는 탭 대화 상자입니다. 속성 페이지 작업을 위한 OLE 모델은 다음 기능으로 구성됩니다.

  • 각 속성 페이지는 IPropertyPage 또는 IPropertyPage2를 구현하는 In-process 개체 의해 관리됩니다. 각 페이지는 고유한 CLSID로 식별됩니다.
  • 개체는 ISpecifyPropertyPages를 구현하여 속성 페이지에 대한 지원을 지정합니다. 이 인터페이스를 통해 호출자는 개체가 지원하는 특정 속성 페이지를 식별하는 CLSID 목록을 가져올 수 있습니다. 개체가 속성 페이지 CLSID를 지정하는 경우 개체는 속성 페이지에서 속성 변경 내용을 받을 수 있어야 합니다.
  • 개체의 속성 시트를 표시하려는 모든 코드 조각(클라이언트 또는 개체)은 개체의 IUnknown 포인터(또는 여러 개체가 영향을 받는 경우 배열)를 OleCreatePropertyFrame 또는 OleCreatePropertyFrameIndirect에 대한 페이지 CLSID 배열과 함께 전달하여 탭 대화 상자를 만듭니다.
  • 속성 프레임 대화 상자는 각 CLSID에서 CoCreateInstance를 사용하여 각 속성 페이지의 단일 instance 인스턴스화합니다. 속성 프레임은 각 페이지에 대해 적어도 IPropertyPage 포인터를 가져옵니다. 또한 프레임은 각 페이지에 대한 속성 페이지 사이트 개체를 자체적으로 만듭니다. 각 사이트는 IPropertyPageSite 를 구현하고 이 포인터는 각 페이지에 전달됩니다. 그런 다음 이 인터페이스 포인터를 통해 페이지가 사이트와 통신합니다.
  • 또한 각 페이지는 호출된 개체 또는 개체를 인식합니다. 즉, 속성 프레임은 개체의 IUnknown포인터를 각 페이지에 전달합니다. 개체에 변경 내용을 적용하라는 지시가 있으면 각 페이지에서 적절한 인터페이스 포인터를 쿼리하고 원하는 방식으로 개체에 새 속성 값을 전달합니다. 그러한 의사 소통이 어떻게 일어나야 하는지에 대한 규정은 없습니다.
  • 또한 개체는 IPerPropertyBrowsing 인터페이스를 통해 속성별 검색을 지원하여 개체가 속성 페이지가 표시될 때 초기 포커스를 받을 속성을 지정하고 자체 사용자 인터페이스에서 클라이언트가 표시할 수 있는 문자열과 값을 지정할 수 있습니다.

이러한 기능은 다음 다이어그램에 설명되어 있습니다.

속성 시트 및 속성 페이지 기능을 보여 주는 다이어그램

해당 인터페이스는 다음과 같이 정의합니다.

interface ISpecifyPropertyPages : IUnknown 
  { 
    HRESULT GetPages([out] CAUUID *pPages); 
  }; 
 
 
interface IPropertyPage : IUnknown 
  { 
    HRESULT SetPageSite([in] IPropertyPageSite *pPageSite); 
    HRESULT Activate([in] HWND hWndParent, [in] LPCRECT prc 
        , [in] BOOL bModal); 
    HRESULT Deactivate(void); 
    HRESULT GetPageInfo([out] PROPPAGEINFO *pPageInfo); 
    HRESULT SetObjects([in] ULONG cObjects 
        , [in, max_is(cObjects)] IUnknown **ppunk); 
    HRESULT Show([in] UINT nCmdShow); 
    HRESULT Move([in] LPCRECT prc); 
    HRESULT IsPageDirty(void); 
    HRESULT Apply(void); 
    HRESULT Help([in] LPCOLESTR pszHelpDir); 
    HRESULT TranslateAccelerator([in] LPMSG pMsg); 
  } 
 
interface IPropertyPageSite : IUnknown 
  { 
    HRESULT OnStatusChange([in] DWORD dwFlags); 
    HRESULT GetLocaleID([out] LCID *pLocaleID); 
    HRESULT GetPageContainer([out] IUnknown **ppUnk); 
    HRESULT TranslateAccelerator([in] LPMSG pMsg); 
  } 
 

ISpecifyPropertyPages::GetPages 메서드는 개체가 표시하려는 속성 페이지의 CLSID를 설명하는 각 UUID(UUID) 값의 계산된 배열을 반환합니다. OleCreatePropertyFrame 또는OleCreatePropertyFrameIndirect를 사용하여 속성 시트를 호출하는 사람은 이 배열을 함수에 전달합니다. 호출자가 여러 개체에 대한 속성 페이지를 표시하려는 경우 모든 개체의 CLSID 목록 교차만 이러한 함수에 전달해야 합니다. 즉, 호출자는 모든 개체에 공통적인 속성 페이지만 호출해야 합니다.

또한 호출자는 영향을 받는 개체에 대한 IUnknown 포인터를 API 함수에도 전달합니다. 두 API 함수는 모두 속성 프레임 대화 상자를 만들고 로드할 각 페이지에 대해 IPropertyPageSite 를 사용하여 페이지 사이트를 인스턴스화합니다. 이 인터페이스를 통해 속성 페이지는 다음을 수행할 수 있습니다.

  • GetLocaleID를 통해 속성 시트에 사용되는 현재 언어를 검색합니다.
  • 프레임에 TranslateAccelerator를 통해 키 입력을 처리하도록 요청합니다.
  • OnStatusChange를 통해 페이지의 변경 내용 프레임에 알립니다.
  • GetPageContainer를 통해 프레임 자체에 대한 인터페이스 포인터를 가져옵니다. 이 함수에 대해 현재 프레임에 대해 정의된 인터페이스는 없지만 항상 E_NOTIMPL 반환합니다.

속성 프레임은 각 속성 페이지 개체를 인스턴스화하고 각 페이지의 IPropertyPage 인터페이스를 가져옵니다. 이 인터페이스를 통해 프레임은 페이지 사이트(SetPageSite)의 페이지에 알리고, 페이지 차원 및 문자열(GetPageInfo)을 검색하고, 영향을 받는 개체(SetObjects)에 인터페이스 포인터를 전달하고, 컨트롤을 만들고 삭제할 때(활성화비활성화)를 페이지에 알리고, 페이지에 자체 표시 또는 위치 변경(표시이동)을 지시하고, 페이지에 현재 값을 적용하도록 지시합니다(적용).는 페이지의 더티 상태(IsPageDirty)를 확인하고 도움말(도움말)을 호출하고 키 입력을 페이지(TranslateAccelerator)에 전달합니다.

개체는 다음을 제공하는 속성별 검색을 지원할 수도 있습니다.

  1. ( IPerPropertyBrowsingIPropertyPage2를 통해) 속성 시트가 처음 표시될 때 초기 포커스를 부여할 속성 페이지의 속성을 지정하는 방법
  2. 개체가 속성에 대한 클라이언트의 사용자 인터페이스에 표시될 수 있는 미리 정의된 값과 해당 설명 문자열을 지정하는 방법( IPerPropertyBrowsing을 통해)입니다.

개체에 속성 시트가 없는 경우와 같이 개체가 (1)를 지원하지 않고 (2)를 지원하도록 선택할 수 있습니다.

IPropertyPage2IPerPropertyBrowsing 인터페이스는 다음과 같이 정의됩니다.

interface IPerPropertyBrowsing : IUnknown 
  { 
    HRESULT GetDisplayString([in] DISPID dispID, [out] BSTR *pbstr); 
    HRESULT MapPropertyToPage([in] DISPID dispID, [out] CLSID *pclsid); 
    HRESULT GetPredefinedStrings([in] DISPID dispID, [out] CALPOLESTR *pcaStringsOut, [out] CADWORD *pcaCookiesOut); 
    HRESULT GetPredefinedValue([in] DISPID dispID, [in] DWORD dwCookie, [out] VARIANT *pvarOut); 
  } 
 
interface IPropertyPage2 : IPropertyPage 
  { 
    HRESULT EditProperty([in] DISPID dispID); 
  } 
 

이러한 기능에 대한 지원을 지정하기 위해 개체는 IPerPropertyBrowsing을 구현합니다. 이 인터페이스를 통해 호출자는 미리 정의된 문자열(GetPredefinedStrings) 및 값(GetPredefinedValue)과 같은 검색에 필요한 정보와 지정된 속성에 대한 표시 문자열(GetDisplayString)을 요청할 수 있습니다.

또한 클라이언트는 사용자가 DISPID(MapPropertyToPage)로 식별된 지정된 속성을 편집할 수 있는 속성 페이지의 CLSID를 가져올 수 있습니다. 그런 다음 클라이언트는 CLSID 및 DISPID를 OleCreatePropertyFrameIndirect에 전달하여 처음에 해당 페이지를 활성화하도록 속성 프레임에 지시합니다. 프레임은 해당 페이지를 먼저 활성화하고 IPropertyPage2::EditProperty를 통해 DISPID를 페이지에 전달합니다. 그런 다음, 페이지에서 해당 속성의 편집 필드에 포커스를 설정합니다. 이러한 방식으로 클라이언트는 자체 사용자 인터페이스의 속성 이름에서 해당 속성을 조작할 수 있는 속성 페이지로 이동할 수 있습니다.

속성 페이지 및 속성 시트