Берем наш проект из предыдущего шага. Вот на нем мы и поупражняемся. Нам теперь необходимо заставить его изменять размеры и передвигаться. Хранить рамку объекта мы будем в классе CRect. Вот его мы и добавим в класс CTestOleContCntrItem.
class CTestOleContCntrItem : public COleClientItem { ....... public: CRect m_Rect; ~CTestOleContCntrItem(); .......Теперь в констукторе нам надо эту переменную инициализивать. Посмотреть значения можно в функции OnDraw.
void CTestOleContView::OnDraw(CDC* pDC) { ............ if (m_pSelection != NULL) m_pSelection->Draw(pDC, CRect(10, 10, 210, 210)); }Вот эти значения. Ими мы нашу переменную и инициализируем.
CTestOleContCntrItem::CTestOleContCntrItem(CTestOleContDoc* pContainer) : COleClientItem(pContainer) { m_Rect=CRect(10,10,210,210); }Теперь и OnDraw можно изменить сославшись на m_Rect.
void CTestOleContView::OnDraw(CDC* pDC) { ........ if (m_pSelection != NULL) m_pSelection->Draw(pDC, m_pSelection->m_Rect); }В классе CTestOleContCntrItem есть функция, которая возвращает видимый прямоугольник - OnGetItemPosition, надо чтобы она возвращала наш прямоугольник. Именно эта
void CTestOleContCntrItem::OnGetItemPosition(CRect& rPosition) { ASSERT_VALID(this); rPosition = m_Rect; }
И теперь нам надо сохранять значения при изменении позиции, это делается в OnChangeItemPosition
BOOL CTestOleContCntrItem::OnChangeItemPosition(const CRect& rectPos) { ASSERT_VALID(this); m_Rect=rectPos; GetDucument()->SetModifiedFlag(); GetDocument()->UpdateAllViews(NULL); if (!COleClientItem::OnChangeItemPosition(rectPos)) return FALSE; // TODO: update any cache you may have of the item's rectangle/extent return TRUE; }
Можно запускать и проверять. Вот как это выглядит с листом Excel
Если кратко. Мы с Вами используем функцию OnDraw вида для отображения объекта OLE функцию OnGetItemPosition для получения прямоугольника, и функцию OnChangeItemPosition для сохранения измененных размеров.