具体看上篇blog
http://blog.csdn.net/LightBoat09/archive/2010/12/14/6074967.aspx
本篇的工程是在上篇的工程项目进行添加...
一,新建对话框
ID 为 IDD_DIALOG_NEW
对话框的Minimize Box属性设为True,
Maximize Box属性也设为True,
二,添加webbrower控件
资源对话框上右击选择[插入ActiveX控件],选择[Microsoft Web Browser],点击"确认",
设置ID为IDC_EXPLORER_NEW
三,添加对话框类
资源对话框上右击--->[添加类],弹出“MFC 类向导"
输入类名:CNewDlg,
基类默认是CDialog,
点击"完成"
四,添加webbrowser控件型变量
在类窗口里选择"CNewDlg",选中右击--->[添加]--->[添加变量],弹出“添加成员变量向导”对话框
选择"控件变量"(check BOX框),控件ID选择IDC_EXPLORER_NEW,变量名输入m_newwebBrowser,点击“完成”!
五,现在要做的是弹出新网页窗口时显示在自己建的对话框里
那改写以前(上篇blog)的NewWindow3Explorer1()函数
- void CbrowserDlg::NewWindow3Explorer1(LPDISPATCH* ppDisp, BOOL* Cancel, unsigned long dwFlags, LPCTSTR bstrUrlContext, LPCTSTR bstrUrl)
- {
- // TODO: 在此处添加消息处理程序代码
- * Cancel = TRUE;
- CString strUrl;
- strUrl = bstrUrl;
- // 新建对话框
- CNewDlg *pNewDlg = new CNewDlg;
- pNewDlg->Create(IDD_DIALOG_NEW, this);
- pNewDlg->ShowWindow(SW_SHOW);
- // 网页导航,新的对话框中的webbrowser控件!
- VARIANT vInfo;
- VariantInit(&vInfo);
- pNewDlg->m_newwebBrowser.Navigate(strUrl, &vInfo, &vInfo, &vInfo, &vInfo);
- }
要想全屏的话,重载CNewDlg对话框类的OnInitDialog()函数,具体做法:
六,重载OnInitDialog()函数
在类窗口里选择"CNewDlg",进入[属性],点击[重写], (位于[事件]、[消息]图标之后,还记得闪电图标吗?在那之后第二个...)
点击OnInitDialog,添加OnInitDialog函数即可,系统会自动生成代码,再在代码中添加最大化设置...
- BOOL CNewDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // TODO: 在此添加额外的初始化
- ShowWindow(SW_SHOWMAXIMIZED); //窗口最大化
- CRect rect;
- GetClientRect(&rect);
- // 设置WebBrowser控件位置
- m_newwebBrowser.MoveWindow(0, 0, rect.Width(), rect.Height());
- return TRUE; // return TRUE unless you set the focus to a control
- // 异常: OCX 属性页应返回 FALSE
- }
现在还有个问题,在新的窗口里又弹出新的窗口怎么办...???
可以试下在百度里搜索百度网址,进入打开,这时在新对话框窗口弹出百度页主页,
接着搜百度主页,进入打开,这时又在IE窗口打开,失去控制了,。。。
不要慌,在窗口里生成新窗口就行了...也是添加NewWindow3消息处理,步骤如下:
七,给新对话框CNewDlg的webbrowser控件添加NewWindow3消息处理
进入资源窗口,这次是新对话框IDD_DIALOG_NEW,再至webbrowser控件(IDC_EXPLORER_NEW)属性窗口,
点击控件事件(闪电状图标),找到NewWindow3,点击后右边有添加NewWindow3ExplorerNew,代码会自动生成
再NewWindow3ExplorerNew里添加代码,其实和第五步的NewWindow3Explorer1()一样...
- void CNewDlg::NewWindow3ExplorerNew(LPDISPATCH* ppDisp, BOOL* Cancel, unsigned long dwFlags, LPCTSTR bstrUrlContext, LPCTSTR bstrUrl)
- {
- // TODO: 在此处添加消息处理程序代码
- * Cancel = TRUE;
- CString strUrl;
- strUrl = bstrUrl;
- // 新建对话框
- CNewDlg *pNewDlg = new CNewDlg;
- pNewDlg->Create(IDD_DIALOG_NEW, this);
- pNewDlg->ShowWindow(SW_SHOW);
- // 网页导航,新的对话框中的webbrowser控件!
- VARIANT vInfo;
- VariantInit(&vInfo);
- pNewDlg->m_newwebBrowser.Navigate(strUrl, &vInfo, &vInfo, &vInfo, &vInfo);
- }
现在就可以从前有座山,山里有个庙,庙里...一直下去了,,,有兴趣可以试试...
可以缩小窗口看下诸多排列窗口的效果...
至此结束...
八,还有个非常严重的问题,内存泄漏...
C++里就很清楚,new的就得delete...
当然如果你能直接delete pNewDlg,那最好不过,实际中pNewDlg已消失无踪了...
我们重载CNewDlg对话框的OnCancel(),OnOK() 和WM_NCDESTROY消息事件
- void CNewDlg::OnCancel()
- {
- // TODO: 在此添加专用代码和/或调用基类
- //CDialog::OnCancel();
- DestroyWindow();
- }
- void CNewDlg::OnOK()
- {
- // TODO: 在此添加专用代码和/或调用基类
- //CDialog::OnOK();
- DestroyWindow();
- }
- void CNewDlg::OnNcDestroy()
- {
- CDialog::OnNcDestroy();
- // TODO: 在此处添加消息处理程序代码
- delete this;
- }
九,打开网页,关闭网页后还是会发现内存增得多,减的少
这个微软的IE内核就是烂,你用IE打开网页,在任务管理器里查看内存,也是增得多,减的少,
google浏览器chrome也好不到哪去...
据说opera控制的是最好的(我没试过)
若想用代码控制这些,可参看http://support.microsoft.com/kb/262110/zh-cn
是VB写的,我VB忘得差不多了,有空再去转换为VC!
也难怪是Visual Basic写的,比尔盖茨当年豪气冲天,说:"我敢以BASIC挑战任何人,也欢迎任何人以BASIC来挑战我!"