visual-c++ - Chrome 嵌入式 (CEF3)。如何调整新浏览器窗口的大小?

标签 visual-c++ tabs resize popup chromium-embedded

所以我正在使用 CEF v3.1180.823 并且我正在尝试制作具有多个选项卡的浏览器。

对于每个新标签,我是:

1) 创建一个样式为 WS_POPUPWINDOW 的新窗口。

HWND hWndTab = CreateWindowEx(NULL, w.lpszClassName, 0,
    WS_POPUPWINDOW, x, y, width, height, 
    NULL, NULL, hInst, NULL);

2)创建一个新的“g_handler”
CefRefPtr<ClientHandler> cef_hTab = new ClientHandler();

3)创建新的浏览器
CefBrowserHost::CreateBrowser(info, cef_hTab.get(), _url, settings);

4)将此窗口设置为永远不会关闭的第一个(主)选项卡的子窗口
SetParent(hWndTab, g_handler->GetMainHwnd());

5) 将新窗口的 HWND 设置为新处理程序的主要 HWND
cef_hTab->SetMainHwnd(hWndTab);

我的问题是 :当主窗口调整大小时,我如何调整所有选项卡的大小?

默认窗口过程(即主选项卡的过程)具有以下代码:
case WM_SIZE:
        // Minimizing resizes the window to 0x0 
        // which causes our layout to go all
        // screwy, so we just ignore it.
        if (wParam != SIZE_MINIMIZED && 
            g_handler.get() && 
            g_handler->GetBrowser()) 
        {
            CefWindowHandle hwnd = 
                g_handler->GetBrowser()->GetHost()->GetWindowHandle();
            if (hwnd) 
            {
                // Resize the browser window and 
                // address bar to match the new frame
                // window size
                RECT rect;
                GetClientRect(hWnd, &rect);

                rect.top += URLBAR_HEIGHT;

                int urloffset = rect.left + BUTTON_WIDTH * 4;

                HDWP hdwp = BeginDeferWindowPos(1);
                hdwp = DeferWindowPos(hdwp, hwnd, NULL, rect.left, rect.top, 
                    rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);
                EndDeferWindowPos(hdwp);
            }
        }
        break;

我有一个 std::list 标签:
#include <vector>
#include <list>
#include "include/cef_app.h"
#include "cefclient/binding_test.h"

using namespace std;

struct STab
{
    HWND                        hWndTab;
    HWND                        hWndTabButton;
    CefRefPtr<ClientHandler>    cef_handler;

    void Destroy();
};

typedef list<STab> LTabs;

LTabs* GetTabs();

我正在尝试像这样编辑主窗口程序:
case WM_SIZE:
        if (wParam != SIZE_MINIMIZED && 
            g_handler.get() && 
            g_handler->GetBrowser()) 
        {
            CefWindowHandle hwnd = 
                g_handler->GetBrowser()->GetHost()->GetWindowHandle();
            if (hwnd) 
            {
                RECT rect;
                GetClientRect(hWnd, &rect);

                rect.top += URLBAR_HEIGHT;

                int urloffset = rect.left + BUTTON_WIDTH * 4;

                HDWP hdwp = BeginDeferWindowPos(1);
                hdwp = DeferWindowPos(hdwp, hwnd, NULL, rect.left, rect.top, 
                    rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);
                // added:
                //------------------------------------------------------------------
                LTabs* lTabs = GetTabs();
                LTabs::iterator it;
                for (it = lTabs->begin(); it != lTabs->end(); ++it)
                {
                    CefWindowHandle hWndTab = 
                        it->cef_handler->GetBrowser()->GetHost()->GetWindowHandle();
                    if (hWndTab)
                        hdwp = DeferWindowPos(hdwp, hWndTab, NULL, 
                            rect.left, rect.top, rect.right - rect.left, 
                            rect.bottom - rect.top, SWP_NOZORDER);                      
                }
                //------------------------------------------------------------------
                EndDeferWindowPos(hdwp);
            }
        }
        break;

但是在调整主窗口大小时,它既不会调整主选项卡的大小,也不会调整我的自定义选项卡的大小。

我究竟做错了什么?

最佳答案

快速解决方案是使用 SetWindowPos函数代替 DeferWindowPos功能。

//hdwp = DeferWindowPos(hdwp, hWndTab, NULL, 
//                      rect.left, rect.top, rect.right - rect.left, 
//                      rect.bottom - rect.top, SWP_NOZORDER);
SetWindowPos(hWndTab, NULL, rect.left, rect.top, 
             rect.right - rect.left, rect.bottom - rect.top, 
             SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE);

关于visual-c++ - Chrome 嵌入式 (CEF3)。如何调整新浏览器窗口的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17588089/

相关文章:

visual-c++ - 错误 :2678, vs 2010 中的编译错误,

Toshiba Thrive 选项卡上的 android.os.NetworkOnMainThreadException,但三星 Duos 智能手机上没有

javascript - PanResponder 中的 ScrollView

javascript - 刷新后 jQuery window.resize 不起作用

javascript - jQuery 将元素包装在 <li> 中,然后附加到

html - 如何在 Safari 上调整背景图片大小?

c++ - 有一个dll项目,我可以强制将它链接到一个静态库吗?

c++ - memset() 或值初始化以将结构清零?

c++ - 我应该在 Visual Studio 下为 Linux 交叉开发吗

android - ActionBar 选项卡高度