在弹出窗口中管理CEF客户端区域的窗口消息



我正在C++上使用原始WinAPI开发一个应用程序,该应用程序使用CEF3来显示UI。问题是这个UI嵌套在一个弹出窗口中(没有标题栏和关闭/最小化按钮)。所以我想让一些客户端区域充当一个标题,用户可以拖动和移动窗口。

最简单的解决方案是子类化CEF窗口和"预处理"WM_NCHITTEST消息,将其传递给父窗口(返回HTTRANSPARENT),并在父窗口中管理窗口移动消息(在WM_NCHITTEST上返回HTCAPTION,在WM_MOVE、WM_PAINT和其他消息上做一些事情)。如果我手动执行CEF消息循环调用CefDoMessageLoopWork,这会起作用,但这会占用所有CPU资源。

使用多线程CEF消息循环是一种解决方案,但这种技术不起作用。

所以,问题是:如何使用多线程CEF消息循环使clien区域充当标题,因为它使用的资源要少得多?

设法解决了我的问题。最初的消息循环类似于

if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
    GetMessage( &msg, NULL, 0, 0 );
    TranlateMessage( &msg );
    DispatchMessage( &msg );
}
else 
{
    CefDoMessageLoopWork();
}

但是,似乎可以在主消息处理之前调用CefDoMessageLoopWork(),如下所示

if(GetMessage(&msg, NULL, 0, 0) > 0)
{
    CefDoMessageLoopWork();
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

在这种情况下,CPU使用率是可以的;

相关内容

  • 没有找到相关文章

最新更新