美文网首页
CEF3自研究笔记 三、将CEF嵌入到MFC对话框程序中去

CEF3自研究笔记 三、将CEF嵌入到MFC对话框程序中去

作者: simulationer | 来源:发表于2017-04-01 11:58 被阅读2211次

    下载CEF包,我下的是cef_binary_3.2171.1979_windows32版本的,网上的朋友说这个版本比较稳定,具体怎么个稳定法,新版本怎么个不稳定法,也没谁告诉我,只说新版本“坑多”。呵呵呵,由于项目的急需,我也没办法去研究了,同好们如果有兴趣研究,把结果告诉我

    一、用VS2013的向导创建一个对话框的程序。

    二、解压后的cef_binary_3.2171.1979_windows32文件夹如下:

    将include、cefclient文件夹拷贝到我们的MFC,在你的MFC程序文件夹里面创建两个文件夹ReleaseLib,DebugLib,将out\Release\Lib\libcef_dll_wrapper.lib、将out\Debug\Lib\libcef_dll_wrapper.lib分别拷入对应的这两个文件夹中备用。将Release文件夹中的cef_sandbox.lib、libcef.lib拷入MFC程序文件夹中备用。

    三、设置MFC程序的属性。

    为什么要在静态库中使用MFC我也不知道,好象大家都那么说,我就那么做了。至于字符集,你可以使用多字节字符集也可以使用unicode字符集,网上大多说用unicode字符集,其实我试了用多字节字符集也没事,只是向CEF传递中文时要转一下码,否则就是乱码。

    在VC++目录中添加包含目录$(ProjectDir)\cefclient\和$(ProjectDir)\include\,链接器-输入-附加依赖项添加libcef.lib,$(Configuration)Lib\libcef_dll_wrapper.lib,opengl32.lib,C/C++->预编译头->不使用预编译头。然后那么因为所以就差不多是这样了。

    四、运行环境:将cef_binary_3.2171.1979_windows32\out中的Debug和Release中的所有文件复制到你的MFC程序对应的生成这两个文件夹中,具体哪些有用哪些没用,我也没研究了。

    五、将include 和cefclient两个文件夹包含到我们的工程项目中,注意cefclient中带win的一些文件名是示例程序中的win32程序,可以删除掉,编译一下如果报错,把报错的那些代码屏蔽掉,应该都是示例win32程序中的一些调用函数。

    六、初始化CEF:

    在cefclient\client_app.cpp中添加一个用于初始化的成员函数:

    int ClientApp::Init(HINSTANCE instance)  
    {  
        CefMainArgs main_args(instance);  
        // CEF applications have multiple sub-processes (render, plugin, GPU, etc)  
        // that share the same executable. This function checks the command-line and,  
        // if this is a sub-process, executes the appropriate logic.  
        int exit_code = CefExecuteProcess(main_args, this, NULL);  
        if (exit_code >= 0)   
        {  
            // The sub-process has completed so return here.  
            return exit_code;  
        }  
      
        CefSettings settings;  
        AppInitCommandLine(0, NULL);  
      
        AppGetSettings(settings);  
      
        settings.single_process = false;  
        settings.multi_threaded_message_loop = true;  
        settings.no_sandbox = true;  
        // Initialize CEF.  
        CefInitialize(main_args, settings, this, NULL);  
        return exit_code;  
    }  
    

    再添加一个用于退出的函数:

    void ClientApp::Exit()  
    {  
        CefShutdown();  
    }  
    

    在工程主程序APP类中创建一个成员变量CefRefPtr<ClientApp> m_cefApp;
    在InitInstance()中插入如下代码初始化:

    m_cefApp = new ClientApp();  
        if (!(m_cefApp->Init(m_hInstance) < 0))  
            return FALSE;  
    

    在ExitInstance()中插入退出代码:

    int CCEFBrowserApp::ExitInstance()  
    {  
        // TODO:  在此添加专用代码和/或调用基类  
        AfxOleTerm(FALSE);  
        m_cefApp->Exit();  
        m_cefApp = NULL;    
        return CWinApp::ExitInstance();  
    }  
    

    七、在对话框中嵌入CEF

       在响应对话框的WM_CREATE函数OnCreate(LPCREATESTRUCT lpCreateStruct)中添加将CEF嵌入到对话框中的代码:
    
    g_handler = new ClientHandler();  
        CefWindowInfo window_info;  
        CRect rect;  
        GetWindowRect(&rect);  
        rect.bottom -= 160;  
        window_info.SetAsChild(m_hWnd, rect);  
        CefBrowserSettings browser_settings;  
        CefBrowserHost::CreateBrowser(window_info, g_handler.get(), "www.baidu.com", browser_settings, NULL);  
    

    为了让嵌入的CEF跟窗口大小一致,我们还要响应对话框的WM_SIZE消息,对应函数OnSize(UINT nType, int cx, int cy)代码:

    void CCEFBrowserDlg::OnSize(UINT nType, int cx, int cy)  
    {  
        CDialogEx::OnSize(nType, cx, cy);  
      
        // TODO:  在此处添加消息处理程序代码  
        if (g_handler != NULL){  
            CefRefPtr<CefBrowser> browser = g_handler->GetBrowser();  
            if (browser){  
                CefWindowHandle hwnd = browser->GetHost()->GetWindowHandle();  
                ::MoveWindow(hwnd, 0, 0, cx, cy - 160, TRUE);  
            }  
        }  
    }  
    

    好了,基本上就是这样了。如果一切顺利的话,运行一下,一个打开度娘页面的对话框就出现了。唉,分享成果喜悦固然开心,但真要写文章还真是累啊。

    相关文章

      网友评论

          本文标题:CEF3自研究笔记 三、将CEF嵌入到MFC对话框程序中去

          本文链接:https://www.haomeiwen.com/subject/exdiottx.html