Новичок
Профиль
Группа: Участник
Сообщений: 2
Регистрация: 8.3.2011
Репутация: нет Всего: нет
|
Доброго времени суток! Я начинающий програмист, пишу 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 изменяются в соответствии с родительским окном, а сам браузер остаётся на месте (как я уже писал). Подскажите, чего не хватает в програмном коде для того, чтобы размер браузера изменялся вместе с окном? Заранее благодарю за ответ!
|