使用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
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,拦截回车键
9、仿照现在大多数浏览器,刷新和停止使用同一个按钮,因此需要获得何时开始和结束导航
重载OnBeforeNavigate2,导航发生之前调用
OnDocumentComplete响应文档就绪状态
10、当文档就绪后,获取html中的title,将其显示在窗口标题栏
11、保存html文件
12、缩放功能利用SliderCtrl,比例在50%-200%之间变化,响应SliderCtrl的NM_ONCUSTOMDARW事件,将getpos得到的位置发送给view
使用ExecWB实现
13、还原默认大小
14、在状态栏中添加网页打开的进度条(Progress Bar),进度条在开始加载网页(OnBeforeNavigate2)时创建,在加载完成(OnDocumentComplete)后销毁(或延时销毁)。
网页打开的进度可以在view中使用OnProgressChange获得,可以将它得到的两个参数设计为结构体,将其指针传递给进度条。
进度条应该设计为(0,100)的范围,收到消息后将当前位置改为(nProgress / nProgressMax)*100,此处需对直接获得的long进行类型转换
问题:OnDocumentComplete会多次响应
15、控制窗口可调整的的大小,在CMainFrame中响应WM_GETMINMAXINFO
16、窗口大小改变后,控件的位置需要调整
响应WM_SIZE,使用GetClientRect和SetWindowPos
这一步最好还是先设计好界面
17、vs2012默认生成的文件无法再xp上运行
有人说更改平台工具集为xp,尝试后不行
改成静态库后可以,exe文件大小会增加
工程文件:(vs2012)
http://download.csdn.net/detail/hrxd1270/7031567
其他问题:1、比较懒,没有随时记录的习惯,很多小问题现在已经记不得了
2、事先没有计划好,很多东西都是边做边想,结构比较乱
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、事先没有计划好,很多东西都是边做边想,结构比较乱
相关文章推荐
- 制作一个简单的浏览器WebView的使用
- 简单记录(浏览器默认使用webkit)
- python3使用pyqt5制作一个超简单浏览器的实例
- python3使用pyqt5制作一个超简单浏览器
- 使用IEnumerator,IEnumerable接口制作一个简单的迭代器
- HttpClient简单使用记录
- Keras 使用自己的数据分类,并使用tensorboard记录的简单实例
- 怎样制作一个简单ip,以方便在Quartus II和Nios II中使用?.[Nios II][中]
- 【cocos2d-x】如何使用Cocos2D-x制作一款简单的iphone&Android游戏①
- SonarQube使用全记录--最适用简单不准确不官方教程
- 【cocos2d-x】如何使用Cocos2D-x制作一款简单的iphone&Android游戏②
- 使用Android SDK自带工具draw9patch制作简单的.9.png图片
- 使用Spine软件为骨骼动画制作简单特效
- (译)如何使用GameCenter制作一个简单的多人游戏教程:第一部分
- HTML5 Web SQL实现简单的增删改查websql使用方法vue2.0使用websql实现浏览器存储
- 常用编码软件简单使用记录 1 : 自主编码器
- css3 befor after 简单使用 制作时尚焦点图相框
- 使用Vs2005打造简单分页浏览器(1)原创
- 使用MFC的CHtmlView创建浏览器控件