您的位置:首页 > 其它

MFC单文档中嵌入CEF(Chromium Embedded Framework)使用多进程

2013-07-26 17:19 741 查看
闲言碎语一大堆,大家见谅。。。

最开始我是用单文档嵌入CEF,但是后来发现单文档的MFC程序使用多进程,ShellExecute(this->m_hWnd, TEXT("open"), strPath, addr, NULL, SW_SHOWNORMAL);本行代码执行错误,strPath是我MFC可执行文件的路径,而addr则是我要传给的http地址,但是在运行时发现,MFC把addr的路径当作了一个文档,提示不能打开,不得已放弃使用单文档,改用Dlg程序嵌入。

Dlg程序中可以很好的实现参数的传递,也成功运行出了网站中的内容,但是后面出现了一个更大的问题:拖动窗口移动后,窗口花屏,吐血啊。。。

但是用单文档的嵌入却不会出现花屏,这就坑了,最后攻克点只能放在单文档MFC传递命令行参数上。

1.单文档MFC命令行参数传递:

添加一个类命名为:CMyCommandLineInfo

MyCommandLineInfo.h如下:

#pragma once

#include "afxwin.h"

class CMyCommandLineInfo :

public CCommandLineInfo

{

public:

void ParseParam(LPCTSTR lpszParam, BOOL bFlag, BOOL bLast);

CMyCommandLineInfo(void);

~CMyCommandLineInfo(void);

};

MyCommandLineInfo.cpp如下:

#include "StdAfx.h"

#include "MyCommandLineInfo.h"

#include "CEF_MFC.h"

CMyCommandLineInfo::CMyCommandLineInfo(void)

{

}

CMyCommandLineInfo::~CMyCommandLineInfo(void)

{

}

void CMyCommandLineInfo::ParseParam(LPCTSTR lpszParam, BOOL bFlag, BOOL bLast)

{

static int num = 0;

//CMyCommandLineInfo::ParseParam(lpszParam, bFlag, bLast);

switch(num)

{

case 0:

theApp.urlPath = CString(lpszParam);

break;

}

num++;

}

找到你的应用程序中的CCommandLineInfo cmdInfo;将其注销,添加上述头文件,使用:

CMyCommandLineInfo cmdInfo;

ParseCommandLine(cmdInfo);

这时在你的程序中使用:CString addr = AfxGetApp()->m_lpCmdLine;便可得到命令行参数信息。

2.上篇文章《CEF嵌入到单文档mfc》中提到的方法:

void CCEF_MFCView::OnSize(UINT nType, int cx, int cy)

{

CView::OnSize(nType, cx, cy);

// TODO: Add your message handler code here

if(m_cWebClient.get())

{

CefRefPtr<CefBrowser> browser = m_cWebClient->GetBrowser();

if(browser)

{

CefWindowHandle hwnd = browser->GetWindowHandle();

RECT rect;

this->GetClientRect(&rect);

::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, cx, cy, SWP_NOZORDER);

}

}

}

//该方法在OnCreate()中使用

int CCEF_MFCView::CreateFCView(void)

{

CefRefPtr<WebClient2> client(new WebClient2());

m_cWebClient = client;

CString addr = AfxGetApp()->m_lpCmdLine;

CefSettings cSettings;

CefSettingsTraits::init( &cSettings);

cSettings.multi_threaded_message_loop = true;

CefString(&cSettings.cache_path).FromASCII("./cache");//"C:\\temp\\cache"

CefRefPtr<CefApp> spApp;

CefInitialize( cSettings, spApp);

CefWindowInfo info;

CRect rect;

this->GetClientRect(&rect);

info.SetAsChild( m_hWnd, rect/*CRect(0, 0, 1000, 800)*/);

CefBrowserSettings browserSettings;

CefString addStr(addr);

CefBrowser::CreateBrowser( info, static_cast<CefRefPtr<CefClient> >(client),

addStr, browserSettings);

return 0;

}

2.通过上述方法,实现了单文档MFC的命令行参数传递,但是发现打开传递网站的地址后,网页没有充满整个对话框,不过还是让哥找到了解决办法:

在刚才添加cmdInfo的函数中添加:

//设置对话框初始大小

CRect temprect(0,0,1000,800);

m_pMainWnd->SetWindowPos(NULL,0,0,temprect.Width(),temprect.Height(),SWP_NOZORDER|SWP_NOMOVE);

m_pMainWnd->ShowWindow(SW_SHOW);

m_pMainWnd->UpdateWindow();

成功解决。。。,。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: