您的位置:首页 > Web前端 > HTML

使用CHtmlView制作浏览器的简单记录

2014-03-12 23:18 357 查看
这几天做了一个简易浏览器,其中碰到了一些问题,在这里记录下来,以供之后查阅。

1、简单的浏览器一些基本功能,例如回到主页、向前、后退、刷新、停止,都可以直接使用CHtmlView中的操作。

例如GoBack、GoForward、GoHome、Refresh、Stop等

CHtmlView成员:http://msdn.microsoft.com/zh-cn/library/be4ak306(v=vs.80).aspx

2、点击链接弹出IE窗口打开,需要重载OnNewWindow2

这一部分代码,网上流传的很广

3、提示脚本错误,可以在OnInitialUpdate中添加SetSilent(TRUE);

4、在视图上屏蔽右键,重载PreTranslateMessage

BOOL CMyWebBrowserView::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if ((pMsg->message == WM_RBUTTONDOWN) ||(pMsg->message == WM_RBUTTONDBLCLK))
return TRUE;

return CHtmlView::PreTranslateMessage(pMsg);
}


5、地址栏可以用弹出带输入控件的对话框实现,我选择使用DialogBar上的combobox作为地址栏,并将其他功能按键也放在DialogBar上

CdialogBar的使用,参考:http://www.cnblogs.com/cylee025/archive/2011/05/04/2036201.html

子控件尝试了一下,总是绑定不上,不知道哪里出问题了,只好把对控件操作改成CdialogBar派生类的成员函数...

7、从combobox中选择地址,响应CBN_SELCHANGE事件

6、在地址栏中输入地址后,按回车键确认,同时将这个地址与combobox已有数据比较,如果存在,选中这一项

如果不存在,将新输入的地址添加到combobox中。同时选中这一项并打开这个地址

同样重载PreTranslateMessage,拦截回车键

BOOL CMyDlgBar::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
//捕获回车键
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN){
//MessageBox(L"huiche");
CString strTemp;
m_comAddr.GetWindowText(strTemp);//从combobox获得输入的地址
//与已有数据比较
int iCnt = m_comAddr.GetCount();
for(int i = 0;i < iCnt;i++){
//如果找到则选中,没有找到则添加并选中
if(CB_ERR == m_comAddr.SelectString(-1,strTemp)){
m_comAddr.AddString(strTemp);
m_comAddr.SetCurSel(iCnt);
break;
}
}
//调用combobox响应CBN_SELCHANGE事件
OnCbnSelchangeDlgAddrcom();
}
return CDialogBar::PreTranslateMessage(pMsg);
}


9、仿照现在大多数浏览器,刷新和停止使用同一个按钮,因此需要获得何时开始和结束导航

重载OnBeforeNavigate2,导航发生之前调用

OnDocumentComplete响应文档就绪状态

10、当文档就绪后,获取html中的title,将其显示在窗口标题栏

//获得新打开的网页title
CComPtr<IHTMLDocument2> pHTMLDocument2;
m_pBrowserApp->get_Document((IDispatch **)&pHTMLDocument2);
BSTR htmlTitle;
pHTMLDocument2->get_title(&htmlTitle);
显示在窗口标题栏可以使用SetWindowText

11、保存html文件

ExecWB(OLECMDID_SAVEAS, OLECMDEXECOPT_DODEFAULT, NULL, NULL);


12、缩放功能利用SliderCtrl,比例在50%-200%之间变化,响应SliderCtrl的NM_ONCUSTOMDARW事件,将getpos得到的位置发送给view

使用ExecWB实现

CComVariant varZoom(m_nPos);  // nZoom是要设置的缩放比例,m_nPos为SliderCtrl滑标的位置
ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DODEFAULT, &varZoom, NULL);


13、还原默认大小

CComVariant varZoom(100);
ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DODEFAULT, &varZoom, NULL);
同时一定要将SliderCtrl的位置还原

14、在状态栏中添加网页打开的进度条(Progress Bar),进度条在开始加载网页(OnBeforeNavigate2)时创建,在加载完成(OnDocumentComplete)后销毁(或延时销毁)。

网页打开的进度可以在view中使用OnProgressChange获得,可以将它得到的两个参数设计为结构体,将其指针传递给进度条。

进度条应该设计为(0,100)的范围,收到消息后将当前位置改为(nProgress / nProgressMax)*100,此处需对直接获得的long进行类型转换

问题:OnDocumentComplete会多次响应

15、控制窗口可调整的的大小,在CMainFrame中响应WM_GETMINMAXINFO

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
lpMMI->ptMinTrackSize.x = 400;//设置最小窗口为400*300
lpMMI->ptMinTrackSize.y = 300;

CFrameWnd::OnGetMinMaxInfo(lpMMI);
}


16、窗口大小改变后,控件的位置需要调整

响应WM_SIZE,使用GetClientRect和SetWindowPos

这一步最好还是先设计好界面

17、vs2012默认生成的文件无法再xp上运行

有人说更改平台工具集为xp,尝试后不行

改成静态库后可以,exe文件大小会增加



工程文件:(vs2012)
http://download.csdn.net/detail/hrxd1270/7031567
其他问题:1、比较懒,没有随时记录的习惯,很多小问题现在已经记不得了

2、事先没有计划好,很多东西都是边做边想,结构比较乱
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息