Здравствуйте, algol, Вы писали:
A>Продолжим допрос. Какие IPersist интерфейсы реализованы, и каким образом, через IPersistStreamInitImpl, IPersistPropertyBagImpl или как-то еще? Есть ли PROP_MAP c
A> PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
A> PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)?
Итак, полный листинг таблицы свойств
BEGIN_PROP_MAP(CMyCtrl)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
PROP_ENTRY("BackColor", DISPID_BACKCOLOR, CLSID_StockColorPage)
PROP_ENTRY("BorderColor", DISPID_BORDERCOLOR, CLSID_StockColorPage)
PROP_ENTRY("ForeColor", DISPID_FORECOLOR, CLSID_StockColorPage)
PROP_ENTRY("BorderVisible", DISPID_BORDERVISIBLE, CLSID_NULL)
PROP_ENTRY("BorderWidth", DISPID_BORDERWIDTH, CLSID_NULL)
END_PROP_MAP()
Контрол наследует следующие интерфейсы (я могу ошибаться в терминологии, так что звиняйте, от силы этим занимаюсь чуть больше месяца):
class ATL_NO_VTABLE CMyCtrl :
//...
public IPersistStreamInitImpl<CMyCtrl>,
public IPersistStorageImpl<CMyCtrl>,
public IPersistPropertyBagImpl<CMyCtrl>
//..
{
//...
}
COM карта контрола:
BEGIN_COM_MAP(CShapeCtl)
//...
COM_INTERFACE_ENTRY(IPersistStreamInit)
COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
//...
COM_INTERFACE_ENTRY(IPersistPropertyBag)
//...
COM_INTERFACE_ENTRY(IPersistStorage)
//...
END_COM_MAP()
Для наследуемых интерфейсов в контроле реализованы следующие методы
// IPersistStreamImpl
STDMETHOD(Load)(IStream *pStream);
STDMETHOD(Save)(IStream *pStream, BOOL fClearDirty);
STDMETHOD(GetSizeMax)(ULARGE_INTEGER* pcbSize);
// IPersistStorageImpl
STDMETHOD(Load)(IStorage *Storage);
STDMETHOD(Save)(IStorage *pStorage, BOOL fSameAsLoad);
// IPersistPropertBag
STDMETHOD(Load)(IPropertyBag *pPropBag, IErrorLog* pErrorLog);
STDMETHOD(Save)(IPropertyBag *pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties);
что отвечает за размеры контрола в контейнере (IE в расчет не берем)?