Re[5]: Использование IPersistStream
От: alexby81  
Дата: 08.02.05 12:32
Оценка:
Здравствуйте, 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 в расчет не берем)?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.