Берем наш проект из предыдущего шага. Вот на нем мы и поупражняемся. Нам теперь необходимо заставить его изменять размеры и передвигаться. Хранить рамку объекта мы будем в классе 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 для сохранения измененных размеров.