Страница 1 из 1
Изменение размеров безоконного ActiveX-компонента
Добавлено: 07 дек 2010, 16:24
Decoder
Всем привет!
Подскажите, как программно задать координаты и размер элемента ActiveX, у которого отсутствует собственный дескриптор окна HWND? В этом случае метод MoveWindow() не работает.
Использую окно диалога в приложении на MFC и встраиваю в него Windows Media Player 11.
При изменении размера окна диалога мне нужно изменить размер контрола Media Player.
Re: Изменение размеров безоконного ActiveX-компонента
Добавлено: 07 дек 2010, 20:10
Romeo
Не может он быть без HWHD. Ты пробовал анализировать свой диалог с помощью Spy++, например. С трудов верится, что медиа-плеер будет рисовать себя напрямую через HDC прямо на твоём диалоге. Скорее всего это обычный ActiveX контрол, у которого легко получить дескриптор окна.
Re: Изменение размеров безоконного ActiveX-компонента
Добавлено: 07 дек 2010, 20:49
WinMain
Запроси у ActiveX-контрола интерфейс
IOleInPlaceObject и через него задай размер.
В коде на MFC это будет выглядеть так...
Код: Выделить всё
void CWMPlayerDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
//
CComQIPtr<IOleInPlaceObject> pInPlaceObject = m_MediaPlayer.GetControlUnknown();
if (pInPlaceObject != NULL)
{
RECT rc = {0, 0, cx, cy};
pInPlaceObject->SetObjectRects(&rc, &rc);
}
}
Re: Изменение размеров безоконного ActiveX-компонента
Добавлено: 10 дек 2010, 11:52
Decoder
Спасибо, WinMain!
Размеры компонента действительно меняются вместе с окном диалога, но возникает другая проблема...
Если я увеличиваю размер окна диалога, то кнопки на панели Windows Media Player перестают работать.
На клик мыши они не реагируют, при наведении курсора мыши они не выделяются, всплывающие подсказки не появляются. Как эту проблему решить?
Re: Изменение размеров безоконного ActiveX-компонента
Добавлено: 11 дек 2010, 12:09
WinMain
Да,
Decoder, нужно менять размеры не только визуальной части контрола, но и его активной области, которая собственно и реагирует на манипуляции мышью. Та часть контрола, которая выходит за пределы активной области, становится неактивной для мыши.
Измени свой код обработчика OnSize() следующим образом...
Код: Выделить всё
void CWMPlayerDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
//
COleControlSite* pControlSite = GetOleControlSite(IDC_MEDIAPLAYER);
if (pControlSite != NULL)
{
RECT rc = {0, 0, cx, cy};
pControlSite->m_rect = rc;
LPOLEINPLACEOBJECT pInPlaceObject = pControlSite->m_pInPlaceObject;
if (pInPlaceObject != NULL)
{
pInPlaceObject->SetObjectRects(&rc, &rc);
}
RedrawWindow();
}
}