Доброго времени суток!
Я начинающий програмист, пишу WinAPI веб-браузер используя IWebBrowser2. Браузер у меня создаётся и всё работает нормально, но проблема вот в чём: когда я изменяю размеры окна браузера, то окно увеличивается, а сам браузер остаётся прежним.
Вот фрагмент кода, создающего веб-браузер:
struct Window : IOleClientSite, IOleInPlaceSite
{
public:
/****************** IUnknown ***************************************************/
HRESULT __stdcall QueryInterface( REFIID riid, void** ppvObject )
{
if( !ppvObject )
return E_POINTER;
if( riid==IID_IUnknown || riid==IID_IOleWindow || riid==IID_IOleInPlaceSite )
return *ppvObject = (void*)dynamic_cast<IOleInPlaceSite*>(this), S_OK;
if( riid==IID_IOleClientSite )
return *ppvObject = (void*)dynamic_cast<IOleClientSite*>(this), S_OK;
*ppvObject = NULL;
return E_NOINTERFACE;
}
ULONG __stdcall AddRef() { return 1; /*one instance*/ }
ULONG __stdcall Release() { return 1; /*one instance*/ }
/********************* IOleWindow ***********************************************/
HRESULT __stdcall GetWindow( HWND *phwnd ) { return phwnd?(*phwnd = this->hwnd, S_OK):E_INVALIDARG; }
HRESULT __stdcall ContextSensitiveHelp( BOOL ) { return S_OK; }
/********************* IOleInPlaceSite ******************************************/
HRESULT __stdcall CanInPlaceActivate() { return S_OK; }
HRESULT __stdcall OnInPlaceActivate() { return S_OK; }
HRESULT __stdcall OnUIActivate() { return S_OK; }
HRESULT __stdcall GetWindowContext( IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
{
if( !(ppFrame && ppDoc && lprcPosRect && lprcClipRect && lpFrameInfo) )
return E_INVALIDARG;
*ppFrame = NULL;
*ppDoc = NULL;
GetClientRect( this->hwnd, lprcPosRect );
GetClientRect( this->hwnd, lprcClipRect );
lpFrameInfo->fMDIApp = false;
lpFrameInfo->hwndFrame = this->hwnd;
lpFrameInfo->haccel = 0;
lpFrameInfo->cAccelEntries = 0;
return S_OK;
}
HRESULT __stdcall Scroll( SIZE ) { return S_OK; }
HRESULT __stdcall OnUIDeactivate( BOOL ) { return S_OK; }
HRESULT __stdcall OnInPlaceDeactivate() { return S_OK; }
HRESULT __stdcall DiscardUndoState() { return S_OK; }
HRESULT __stdcall DeactivateAndUndo() { return S_OK; }
HRESULT __stdcall OnPosRectChange( LPCRECT ) { return S_OK; }
/*************************************** IOleClientSite ***************************************/
HRESULT __stdcall SaveObject() { return S_OK; }
HRESULT __stdcall GetMoniker( DWORD, DWORD, IMoniker **ppmk ) { return *ppmk = NULL, E_NOTIMPL; }
HRESULT __stdcall GetContainer( IOleContainer** ppContainer ) { return *ppContainer=NULL, E_NOINTERFACE; }
HRESULT __stdcall ShowObject() { return S_OK; }
HRESULT __stdcall OnShowWindow( BOOL ) { return S_OK; }
HRESULT __stdcall RequestNewObjectLayout() { return E_NOTIMPL; }
// данные
HWND hwnd;
IWebBrowser2* webBrowser;
HWND conteneur; //Окно в котором отображаеться браузе
};
Window* window;
IOleObject* oleObject;
Функция, которая создаёт браузер:
int CWebBrowser::CreateWebBrowser(HWND hWnd, RECT rect)
{
HRESULT r;
window = new Window;
window->conteneur = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE, rect.left - 1,
rect.top - 1, rect.right + 2,
rect.bottom -= (35 - 3) ,hWnd, 0, 0, 0);
window->hwnd = window->conteneur;
SetWindowLong(window->conteneur, GWL_USERDATA, (LONG)window);
r = CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_INPROC, IID_IOleObject, (void**)&oleObject);
if(FAILED(r))
{
MessageBox(0, L"error", L"error", MB_OK);
return 1;
}
r = oleObject->SetClientSite(dynamic_cast<IOleClientSite*>(window));
if(FAILED(r))
{
MessageBox(0, L"oleObject->SetClientSite()", L"Error", MB_OK);
return 1;
}
rect.left = 0;
rect.top = 0;
rect.right = 800;
rect.bottom = 800;
r = oleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, dynamic_cast<IOleClientSite*>(window), 0, window->conteneur, &rect);
if(FAILED(r))
{
MessageBox(0, L"oleObject->DoVerb()", L"Error", MB_OK);
return 1;
}
r = oleObject->QueryInterface( IID_IWebBrowser2, (void**)&window->webBrowser);
if(FAILED(r))
{
MessageBox(0, L"oleObject->QueryInterface()", L"Error", MB_OK);
return 1;
}
oleObject->Release();
window->webBrowser->put_Height(800);
window->webBrowser->put_Width(800);
window->webBrowser->Release();
window->webBrowser->GoHome();
return 1;
}
Размер окна изменяю с помощью сообщеня WM_SIZE.
Ниже привожеу функцию, устанавливающие новые размеры:
void CWebBrowser::WebSreenPos(RECT rect)
{
SetWindowPos(window->conteneur, HWND_BOTTOM, rect.left - 1, rect.top - 1, rect.right + 2, rect.bottom, SWP_DRAWFRAME);
}
В итоге получается, что размеры conteneur изменяются в соответствии с родительским окном, а сам браузер остаётся на месте (как я уже писал). Подскажите, чего не хватает в програмном коде для того, чтобы размер браузера изменялся вместе с окном?
Заранее благодарю за ответ!