#c #excel #winapi #mfc #activex
#c #excel #winapi #mfc #activex
Вопрос:
Сегодня я создал простой элемент управления ActiveX MFC. Моя цель — вставить этот элемент управления в лист Excel и создать дочерний элемент управления с полями (или задать заполнение ActiveX). Я не могу использовать C # и Windows forms для этого (только 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(amp;width, amp;height);
::MoveWindow(HWND(newContent), 10, 10, width - 20, height - 20, 0);
m_content = HWND(newContent);
}
}
}
это только одна часть кода, которая выполняет манипуляции с элементом управления (в методе setContent)
Это Paint:
void MyActiveXControl::OnPaint()
{
CRect rcBounds;
CPaintDC pdc(this);
this->GetClientRect(amp;rcBounds);
pdc.FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(BLACK_BRUSH)));
}
Что я пробовал :
1) Установите WINDOWPOS вместо MoveWindow с различными флагами, такими как NOSIZE, NOMOVE и т.д.
2) Переопределение сообщения OnSize — существует проблема, заключающаяся в том, что событие onsize срабатывает 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?
Комментарии:
1. Привет, выиграли, если
HWND(newContent)
это дескриптор вашего дочернего элемента управления (светло-зеленый), то из какого окна вы получаете дескрипторthis->GetSafeHwnd()
?2. Привет, спасибо за ответ! Я получаю дескриптор окна управления ActiveX (черный). это — указатель на мой элемент управления ActiveX, который унаследован от класса COleControl
3. Таким образом, это окно элемента управления ActiveX, перемещающееся внутри окна Excel, а не «дочерний элемент управления, перемещающийся внутри элемента управления ActiveX». Вы установили родительское окно элемента управления ActiveX?
4. @RitaHan-Элемент управления ActiveX MSFT остается на своем месте (на втором снимке экрана видна только его половина) И, как вы можете видеть, нижняя часть моей «границы» переопределяется дочерним элементом, который перемещается при прокрутке листа.