Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Размер экрана веб-браузера  (Прочитано 3836 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Rianorix
Новенький

ru
Offline Offline

« : 05-03-2011 15:27 » new

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines