闲言碎语一大堆,大家见谅。。。
最开始我是用单文档嵌入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();
成功解决。。。,。。。