Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Размер экрана веб-браузера 
:(
    Опции темы
Rianorix
  Дата 8.3.2011, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 изменяются в соответствии с родительским окном, а сам браузер остаётся на месте (как я уже писал). Подскажите, чего не хватает в програмном коде для того, чтобы размер браузера изменялся вместе с окном?
Заранее благодарю за ответ!
PM MAIL   Вверх
RastaDja
Дата 14.3.2011, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



Цитата(Rianorix @  8.3.2011,  23:09 Найти цитируемый пост)
В итоге получается, что размеры conteneur изменяются в соответствии с родительским окном, а сам браузер остаётся на месте (как я уже писал). Подскажите, чего не хватает в програмном коде для того, чтобы размер браузера изменялся вместе с окном?
Заранее благодарю за ответ! 


Сильно код не смотрел, просто пробежался.
на сколько я понял из кода браузер находится в window->webBrowser.
а судя из void CWebBrowser::WebSreenPos(RECT rect)
вы меняете размеры window->conteneur

Попробуйте 
Код

SetWindowPos(window->webBrowser, HWND_BOTTOM, rect.left - 1, rect.top - 1, rect.right + 2,     rect.bottom, SWP_DRAWFRAME);


или 
Код

window->webBrowser->put_Height(rect.bottom - rect.top);
    window->webBrowser->put_Width(rect.right - rect.left );





--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
Rianorix
Дата 16.3.2011, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Попробовал оба варианта. На первый выводит следующую ошибку:
error C2664: SetWindowPos: невозможно преобразовать параметр 1 из 'IWebBrowser2 *' в 'HWND'

Второй вариант уже пробовал. Не помогает.
Есть ли ещё варианты?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0413 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.