窗口大小自适应需要响应WM_SIZE消息,但是在Dlg类中如何获取浏览器的子窗口呢?下面继续修改MyCefClient类。
MyCefClient.h的内容如下:

#include <include/cef_client.h>
#include <include/base/cef_lock.h>
#include <include/cef_life_span_handler.h>

class MyCefClient :	public CefClient,
					public CefLifeSpanHandler
{
protected:
	// 实现的每个Handler都需要返回this指针
	virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() override;

	virtual void OnBeforeClose(CefRefPtr<CefBrowser> browser) override;
	virtual void OnAfterCreated(CefRefPtr<CefBrowser> browser) override;

public:
	CefRefPtr<CefBrowser> GetBrowser() const;

private:
	IMPLEMENT_REFCOUNTING(MyCefClient);
	mutable base::Lock lock_;
	CefRefPtr<CefBrowser> browser_ ;
};

MyCefClient.cpp的内容如下:

CefRefPtr<CefLifeSpanHandler> MyCefClient::GetLifeSpanHandler() {
	return this;
}

CefRefPtr<CefBrowser> MyCefClient::GetBrowser() const
{
	base::AutoLock lock_scope(lock_);
	return browser_;
}

void MyCefClient::OnAfterCreated(CefRefPtr<CefBrowser> browser) {
	if (!GetBrowser()) {
		base::AutoLock lock_scope(lock_);
		browser_ = browser;
	}
}

void MyCefClient::OnBeforeClose(CefRefPtr<CefBrowser> browser)
{
	base::AutoLock lock_scope(lock_);
	browser_ = NULL;
}

这部分代码的最终目的只有一个,就是提供一个GetBrowser()函数,使Dlg类中可以得到当前浏览器窗口。


接下来,就可以在OnSize中调整浏览器窗口大小了。

void CHelloCefDlg::OnSize(UINT nType, int cx, int cy)
{
	if (handler != NULL)
	{
		CefRefPtr<CefBrowser> browser = handler->GetBrowser();
		if (browser)
		{
			CefWindowHandle hwnd = browser->GetHost()->GetWindowHandle();
			::MoveWindow(hwnd, 0, 0, cx, cy, TRUE); 
		}
	}
	CDialogEx::OnSize(nType, cx, cy);
}



本文链接地址: LibCef的使用4-窗口大小自适应
https://blog.qingfengju.com/index.asp?id=431

上一篇: LibCef的使用3-从最简单的项目开始
下一篇: LibCef的使用5-所有链接在同一窗口打开

分类:Win32/C++ 查看次数:631 发布时间:2020/5/4 7:57:33