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

来源:互联网 发布:苹果手机写作软件 编辑:程序博客网 时间:2024/06/14 21:51

闲言碎语一大堆,大家见谅。。。

最开始我是用单文档嵌入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();

成功解决。。。,。。。



原创粉丝点击