1

WebKitをCOMオブジェクトとして純粋なWinApiアプリに埋め込みます。そして、WM_WINDOWPOSCHANGEDを​​取得してWebKitウィンドウのサイズを変更したいと思います。

LRESULT CALLBACK CBrowserView::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    typedef LRESULT (CBrowserView::*PFNPROC)(WPARAM wParam, LPARAM lParam);
    PFNPROC pfnProc;
    switch (uMsg)
    {
        case WM_WINDOWPOSCHANGED:
            pfnProc = &CBrowserView::DoWindowPosChanged;
...


// CBrowserView::DoWindowPosChanged

LRESULT CBrowserView::DoWindowPosChanged(WPARAM wParam, LPARAM lParam)
{
    _ASSERT(m_hWnd);

    WINDOWPOS* pwp = (WINDOWPOS*)lParam;
    {
        if (pwp->cx != m_lClientWidth || pwp->cy != m_lClientHeight)
        {
            m_lClientWidth = pwp->cx;
            m_lClientHeight = pwp->cy;

            if (m_pIWebBrowser)
            {
                {
                    RECT rcClient;
                    rcClient.left = 0;
                    rcClient.top = 0;
                    rcClient.right = m_lClientWidth;
                    rcClient.bottom = m_lClientHeight;

                    HRESULT hr = m_pIWebBrowser->initWithFrame(rcClient, 0, 0);
                    if (FAILED(hr))
                        return E_FAIL;

                    hr = m_pIWebBrowser->mainFrame(&m_mainWebFrame);
                    if (FAILED(hr))
                        return E_FAIL;

                    BSTR urlBstr = SysAllocString(m_pszFile);;
                    WebKitToUrl(urlBstr, true);
                }
            }
        }
    }

    return 0;
}

ただし、これは1回だけ機能し、OnCreateダイアログでウィジェットがこのクライアント領域を埋めます。このサイズ変更が失敗すると、m_pIWebBrowser-> initWithFrame(rcClient、0、0)はE_FAILを返します。

m_pIWebBrowserのサイズを設定する別の方法はありますか?

4

1 に答える 1

0

1.. ウィジェット HWND が見つかるはずです。

...

hr = m_pIWebBrowser->QueryInterface(IID_IWebViewPrivate, reinterpret_cast<void**>(&webViewPrivate));

if (FAILED(hr))
    return E_FAIL;

hr = webViewPrivate->viewWindow(reinterpret_cast<OLE_HANDLE*>(&m_hudWnd));
if (FAILED(hr) || !m_hudWnd)
    return E_FAIL;

if (webViewPrivate)
{
    webViewPrivate->Release();
    webViewPrivate = NULL;
}

...

2.. 標準の WinApi を使用して、ウィンドウのサイズを変更します。

LRESULT CBrowserView::DoWindowPosChanged(WPARAM wParam, LPARAM lParam)
{
    _ASSERT(m_hWnd);

    WINDOWPOS* pwp = (WINDOWPOS*)lParam;
    {
        if (pwp->cx != m_lClientWidth || pwp->cy != m_lClientHeight)
        {
            m_lClientWidth = pwp->cx;
            m_lClientHeight = pwp->cy;

            if (m_pIWebBrowser && m_hudWnd)
            {
                RECT rcClient;
                rcClient.left = 0;
                rcClient.top = 0;
                rcClient.right = m_lClientWidth;
                rcClient.bottom = m_lClientHeight;

                ::MoveWindow(m_hudWnd, rcClient.left, rcClient.top, rcClient.right, rcClient.bottom, TRUE);
            }
        }
    }
    return 0;
}
于 2013-03-06T06:12:47.823 に答える