Сегодня я создал простой элемент управления ActiveX MFC. Моя цель состоит в том, чтобы вставить этот элемент управления в лист Excel и создать дочерний элемент управления с полем (или установить отступы ActiveX). Я не могу использовать C # и окна формы управления для этого (только C ++, это требования проекта)
Я создаю простой элемент управления MFC ActiveX и экспортирую 1 функцию - SetContent (HWND newContent), который должен внедрить любое окно в мой элемент управления ActiveX. Я хочу, чтобы это окно отображалось с полем.
https://pasteboard.co/I74MTVN.png - так выглядит элемент управления в начале
https://pasteboard.co/I74NW7T.png - вот как это выглядит, когда я начинаю прокручивать свой лист
Как вы видите, дочерний элемент управления (светло-зеленый) движется при прокрутке
void MyActiveXControl::SetContent(OLE_HANDLE newContent)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (this->m_lReadyState == READYSTATE_COMPLETE)
{
if (newContent != 0)
{
::SetParent(HWND(newContent), this->GetSafeHwnd());
int width, height;
this->GetControlSize(&width, &height);
::MoveWindow(HWND(newContent), 10, 10, width - 20, height - 20, 0);
m_content = HWND(newContent);
}
}
}
это только один пик кода, который выполняет манипуляции с управлением (в методе SetContent)
Это краска:
void MyActiveXControl::OnPaint()
{
CRect rcBounds;
CPaintDC pdc(this);
this->GetClientRect(&rcBounds);
pdc.FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(BLACK_BRUSH)));
}
Что я пробовал:
1) SetWindowPos вместо MoveWindow с различными флагами, такими как NOSIZE, NOMOVE и т. Д.
2) Переопределение сообщения OnSize - проблема в том, что событие size запускается 2 раза за 1 прокрутку:
1. With actual ActiveX control size (width: 500, height: 500)
2. With the size of the area that is visible (width: 500, height: 250)
Как я могу исправить свою проблему и предотвратить перемещение дочернего элемента управления внутри элемента ActiveX?