Мне нужно сделать, чтобы в качестве ActiveX-элемента в окне эксплорера отображался диалог.
Это нужно сделать без использования MFC или ATL.
Я понимаю как можно сделать, чтобы элемент себя отрисовывал на контекте. Но в случае с дилогом
это не подходит. Нужно каким-то обрахом передавать контейнеру окно диалога.
(Или не нужно? Поправте меня). Однако у меня так и не получилось создать окно с закрашенной,
клиентской частью, и передать его контейнеру так, чтобы оно отобразилось в IE.
Я попытался сделать это следующим образом:
1. Имплементировал IOleInPlaceActiveObject и IOleObject
2. в реализации метода SetClientSite сделал m_pFrame->SetActiveObject(this, NULL).
Код:
virtual HRESULT STDMETHODCALLTYPE SetClientSite(
/* [unique][in] */ IOleClientSite *pClientSite)
{
m_pClientSite = pClientSite;
CComPtr<IOleInPlaceSite> pInPlaceSite;
OLEINPLACEFRAMEINFO frameInfo;
RECT posRect, clipRect;
HRESULT hr = m_pClientSite.QueryInterface(&pInPlaceSite);
if(hr == S_OK) hr = pInPlaceSite->GetWindowContext(&m_pFrame, &pUIWin, &posRect, &clipRect, &frameInfo);
if(hr == S_OK) hr = m_pFrame->SetActiveObject(this, NULL);
....
}
3. После этого начал вызываться метод GetWindow моего копанента. В этом методе я создаю окно, в оконной процедуре,
которого, при обработке WM_PAINT, клиентская часть заполняется цветом десктопа.
Однако это не приводит к желаемому результату. Окно activex-элемента в IE так и остаётся белым.
Чтобы донести до контейнера, что нужно отрисовывать окно, я пробовал вызывать. m_pFrame->Show,
m_pClientSite->OnInPlaceActivate(), pInPlaceSite->OnUIActivate(); m_pClientSite->ShowObject()
m_pFrame->GetWindow(&hwnd); ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd);
Не помогает. Во время выполненеия программы ни разу не было послано сообщение WM_PAINT моему окну.