Вы не можете хотеть, чтобы все ваши свойства обнаружились под “Общей” категорией, так что эта следующая секция демонстрирует, как использовать встроенные категории.
1 Идут к Представлению Класса в IDE Visual C++, щелкают правой кнопкой мыши на заказном интерфейсе примитива (типа IAsdkSquareWrapper), и выбирают AddProperty. Добавьте свойства для квадратного центра и номера ID.
2 Затем изменяют образование из объекта COM, чтобы включить IOPMPropertyExtensionImpl и IOPMPropertyExpander:
public IOPMPropertyExtensionImpl<CAsdkSquareWrapper>,
public IOPMPropertyExpander
3 Добавляют интерфейсы к карте интерфейса COM:
COM_INTERFACE_ENTRY(IOPMPropertyExtension)
COM_INTERFACE_ENTRY(ICategorizeProperties)
COM_INTERFACE_ENTRY(IPerPropertyBrowsing)
COM_INTERFACE_ENTRY(IOPMPropertyExpander)
4 Добавляют объявление для интерфейса IOPMPropertyExtension:
// IOPMPropertyExtension
//
BEGIN_OPMPROP_MAP()
OPMPROP_ENTRY(0, 0x00000001, PROPCAT_Data, \
0, 0, 0, "", 0, 1, IID_NULL, IID_NULL, "")
OPMPROP_ENTRY(0, 0x00000003, PROPCAT_Geometry, \
0, 0, 0, "", 0, 1, IID_NULL, IID_NULL, "")
END_OPMPROP_MAP()
5 Добавляют следующий две подставляемых функции к классу:
STDMETHOD(GetCategoryName)(
THIS_
/* [in] */ PROPCAT propcat,
/* [in] */ LCID lcid,
/* [out] */ BSTR* pbstrName)
{return S_FALSE;}
virtual HINSTANCE GetResourceInstance()
{
return _Module.GetResourceInstance();
}
6 Добавляют объявления для следующих функций:
STDMETHOD(GetElementValue)(
/* [in] */ DISPID dispID,
/* [in] */ DWORD dwCookie,
/* [out] */ VARIANT * pVarOut) ;
// Used for property expansion (currently variant types)
//
STDMETHOD(SetElementValue)(
/* [in] */ DISPID dispID,
/* [in] */ DWORD dwCookie,
/* [in] */ VARIANT VarIn) ;
// Used for property expansion (currently variant types)
//
STDMETHOD(GetElementStrings)(
/* [in] */ DISPID dispID,
/* [out] */ OPMLPOLESTR __RPC_FAR *pCaStringsOut,
/* [out] */ OPMDWORD __RPC_FAR *pCaCookiesOut) ;