Всем привет!
Подскажите, как программно задать координаты и размер элемента ActiveX, у которого отсутствует собственный дескриптор окна HWND? В этом случае метод MoveWindow() не работает.
Использую окно диалога в приложении на MFC и встраиваю в него Windows Media Player 11.
При изменении размера окна диалога мне нужно изменить размер контрола Media Player.
Изменение размеров безоконного ActiveX-компонента
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Поумнеть несложно, куда труднее от дури избавиться.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Не может он быть без HWHD. Ты пробовал анализировать свой диалог с помощью Spy++, например. С трудов верится, что медиа-плеер будет рисовать себя напрямую через HDC прямо на твоём диалоге. Скорее всего это обычный ActiveX контрол, у которого легко получить дескриптор окна.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Запроси у ActiveX-контрола интерфейс IOleInPlaceObject и через него задай размер.
В коде на MFC это будет выглядеть так...
В коде на 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);
}
}
Спасибо, WinMain!
Размеры компонента действительно меняются вместе с окном диалога, но возникает другая проблема...
Если я увеличиваю размер окна диалога, то кнопки на панели Windows Media Player перестают работать.
На клик мыши они не реагируют, при наведении курсора мыши они не выделяются, всплывающие подсказки не появляются. Как эту проблему решить?
Размеры компонента действительно меняются вместе с окном диалога, но возникает другая проблема...
Если я увеличиваю размер окна диалога, то кнопки на панели Windows Media Player перестают работать.
На клик мыши они не реагируют, при наведении курсора мыши они не выделяются, всплывающие подсказки не появляются. Как эту проблему решить?
Поумнеть несложно, куда труднее от дури избавиться.
Да, Decoder, нужно менять размеры не только визуальной части контрола, но и его активной области, которая собственно и реагирует на манипуляции мышью. Та часть контрола, которая выходит за пределы активной области, становится неактивной для мыши.
Измени свой код обработчика OnSize() следующим образом...
Измени свой код обработчика 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();
}
}