#include <mshtml.h>
#include <atlbase.h>
#include <oleacc.h>
BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
{
TCHAR buf[100];
::GetClassName( hwnd, (LPTSTR)&buf, 100 );
if ( _tcscmp( buf, _T("Internet Explorer_Server") ) == 0 )
{
*(HWND*)lParam = hwnd;
return FALSE;
}
else
return TRUE;
};
//You can store the interface pointer in a member variable
//for easier access
void CDlg::OnGetDocInterface(HWND hWnd)
{
CoInitialize( NULL );
// Explicitly load MSAA so we know if it's installed
HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
if ( hInst != NULL )
{
if ( hWnd != NULL )
{
HWND hWndChild=NULL;
// Get 1st document window
::EnumChildWindows( hWnd, EnumChildProc, (LPARAM)&hWndChild );
if ( hWndChild )
{
CComPtr<IHTMLDocument2> spDoc;
LRESULT lRes;
UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
if ( pfObjectFromLresult != NULL )
{
HRESULT hr;
hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument, 0, (void**)&spDoc );
if ( SUCCEEDED(hr) )
{
CComPtr<IDispatch> spDisp;
CComQIPtr<IHTMLWindow2> spWin;
spDoc->get_Script( &spDisp );
spWin = spDisp;
spWin->get_document( &spDoc.p );
// Change background color to red
spDoc->put_bgColor( CComVariant("red") );
}
}
} // else document not ready
} // else Internet Explorer is not running
::FreeLibrary( hInst );
} // else Active Accessibility is not installed
CoUninitialize();
}
#include <atlbase.h>
#include <oleacc.h>
BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
{
TCHAR buf[100];
::GetClassName( hwnd, (LPTSTR)&buf, 100 );
if ( _tcscmp( buf, _T("Internet Explorer_Server") ) == 0 )
{
*(HWND*)lParam = hwnd;
return FALSE;
}
else
return TRUE;
};
//You can store the interface pointer in a member variable
//for easier access
void CDlg::OnGetDocInterface(HWND hWnd)
{
CoInitialize( NULL );
// Explicitly load MSAA so we know if it's installed
HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
if ( hInst != NULL )
{
if ( hWnd != NULL )
{
HWND hWndChild=NULL;
// Get 1st document window
::EnumChildWindows( hWnd, EnumChildProc, (LPARAM)&hWndChild );
if ( hWndChild )
{
CComPtr<IHTMLDocument2> spDoc;
LRESULT lRes;
UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
if ( pfObjectFromLresult != NULL )
{
HRESULT hr;
hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument, 0, (void**)&spDoc );
if ( SUCCEEDED(hr) )
{
CComPtr<IDispatch> spDisp;
CComQIPtr<IHTMLWindow2> spWin;
spDoc->get_Script( &spDisp );
spWin = spDisp;
spWin->get_document( &spDoc.p );
// Change background color to red
spDoc->put_bgColor( CComVariant("red") );
}
}
} // else document not ready
} // else Internet Explorer is not running
::FreeLibrary( hInst );
} // else Active Accessibility is not installed
CoUninitialize();
}
今天QQ上一朋友问我,如何才能得到网页上星号的内容.
我左想右想,对啊,以前的确是见过有人做出过这种星号查看器的!
朋友发来一网页,上面有VC实现的代码,以及原理分析.
我先是试着更改为一个DLL由VB调用,结果由于VC水平实在是......不提也罢..
后来看原理分析,说是先得到IHTMLDocument对象
然后对对象内控件内容进行判断,如果有password属性的,就是密码框
然后直接调用.Value属性就可以得到值了.
原文这样说:
在不同的进程中取得IE的Webbrowser控件的IHTMLDocument2接口,请参阅MSDN上的一篇文章,标题是:
HOWTO: Get IHTMLDocument2 from a HWND(根据HWND取得IHTMLDocument2接口)
( http://support.microsoft.com/default.aspx?scid=kb;EN-US;q249232).
它的实现机理是向Webbrowser控件(窗口类名是"Internet Explorer_Server")发一个WM_HTML_GETOBJECT
然后把返回值传给Microsoft Active Accessibility (MSAA) 函数ObjectFromLresult
这样你会取得一个已经编排(Marshaling)过的COM接口.
于是我搜索"VB6 ObjectFromLresult",一下子就搜到一个老外写的模块.
用这模块拿回来,就可以轻易得到IHTMLDocument对象
然后我就简单地写了一个判断过程,组合成了这个东东.
看来我还是太菜!!
继续努力!!
相关网址:
http://www.vckbase.net/document/viewdoc/?id=288
我左想右想,对啊,以前的确是见过有人做出过这种星号查看器的!
朋友发来一网页,上面有VC实现的代码,以及原理分析.
我先是试着更改为一个DLL由VB调用,结果由于VC水平实在是......不提也罢..
后来看原理分析,说是先得到IHTMLDocument对象
然后对对象内控件内容进行判断,如果有password属性的,就是密码框
然后直接调用.Value属性就可以得到值了.
原文这样说:
在不同的进程中取得IE的Webbrowser控件的IHTMLDocument2接口,请参阅MSDN上的一篇文章,标题是:
HOWTO: Get IHTMLDocument2 from a HWND(根据HWND取得IHTMLDocument2接口)
( http://support.microsoft.com/default.aspx?scid=kb;EN-US;q249232).
它的实现机理是向Webbrowser控件(窗口类名是"Internet Explorer_Server")发一个WM_HTML_GETOBJECT
然后把返回值传给Microsoft Active Accessibility (MSAA) 函数ObjectFromLresult
这样你会取得一个已经编排(Marshaling)过的COM接口.
于是我搜索"VB6 ObjectFromLresult",一下子就搜到一个老外写的模块.
用这模块拿回来,就可以轻易得到IHTMLDocument对象
然后我就简单地写了一个判断过程,组合成了这个东东.
看来我还是太菜!!
继续努力!!
![30.gif](http://www.m5home.com/blog2/p_w_picpaths/smilies/30.gif)
相关网址:
http://www.vckbase.net/document/viewdoc/?id=288
如何获取网页密码框中的密码
作者:Sjx
作者:Sjx
下载源代码
前言
本人是在家中上网,经常有一些BBS的密码懒得记了,就用IE的自动密码保存功能,这样一来是方便了,但却有一个麻烦,一旦机子不行了,想要重装操作系统了,这些密码却也取不出了,还得重新申请,好麻烦!因此我就写了一个工具,可以取得网页密码框的密码.
因为网页密码框不是一般的EDIT控件,因此不能取得网页密码框的句柄.要实现这个功能,只好通过WebBrowser控件的有关COM接口了.因此取得这些接口是整个程序的关键.有两种方法可以取得WebBrowser控件的接口,接下来我们会逐一介绍,并提供示例源代码供大家参考。
示例程序运行效果图
前言
本人是在家中上网,经常有一些BBS的密码懒得记了,就用IE的自动密码保存功能,这样一来是方便了,但却有一个麻烦,一旦机子不行了,想要重装操作系统了,这些密码却也取不出了,还得重新申请,好麻烦!因此我就写了一个工具,可以取得网页密码框的密码.
因为网页密码框不是一般的EDIT控件,因此不能取得网页密码框的句柄.要实现这个功能,只好通过WebBrowser控件的有关COM接口了.因此取得这些接口是整个程序的关键.有两种方法可以取得WebBrowser控件的接口,接下来我们会逐一介绍,并提供示例源代码供大家参考。
![GetIhtml.gif](http://www.vckbase.net/document/journal/vckbase12/p_w_picpaths/GetIhtml.gif)
示例程序运行效果图
第一种方法:使用脚本语言和IE右键菜单
我们可以使用注册表来控制IE右键菜单.当你装了FlashGet(网际快车)时,你会发现IE右键菜单多了两项:"使用网际快车下载"和"使用网际快车下载全部链接",而这时你打开注册表,在HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\下有这两个主键.这两个主键下都有两个值,一个是默认的串值,指定了选择了这个菜单命令要打开的URL,IE在一个隐藏的窗口打开它,并这个隐藏窗口的external.menuArguments值设为当前窗口对象,执行完URL对话网页包含的脚本程序该窗口自动关闭.另一个名称是contexts是DWORD值,指定了在什么情况下需要显示这个菜单项.具体的值见下.
我们可以使用注册表来控制IE右键菜单.当你装了FlashGet(网际快车)时,你会发现IE右键菜单多了两项:"使用网际快车下载"和"使用网际快车下载全部链接",而这时你打开注册表,在HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\下有这两个主键.这两个主键下都有两个值,一个是默认的串值,指定了选择了这个菜单命令要打开的URL,IE在一个隐藏的窗口打开它,并这个隐藏窗口的external.menuArguments值设为当前窗口对象,执行完URL对话网页包含的脚本程序该窗口自动关闭.另一个名称是contexts是DWORD值,指定了在什么情况下需要显示这个菜单项.具体的值见下.
(0x1 << CONTEXT_MENU_DEFAULT) (等于 0x1) //缺省时显示 (0x1 << CONTEXT_MENU_IMAGE) (等于 0x2) //右键点击图像时显示该项 (0x1 << CONTEXT_MENU_CONTROL) (等于 0x4) //右键点击表单元素时显示该项 (0x1 << CONTEXT_MENU_TABLE) (等于 0x8) //右键点击表格时显示该项 (0x1 << CONTEXT_MENU_TEXTSELECT) (等于 0x10) //右键点击高亮选择的文本时显示该项 (0x1 << CONTEXT_MENU_ANCHOR) (等于 0x20) //右键点击链接时显示该项 (0x1 << CONTEXT_MENU_UNKNOWN) (等于 0x40)//右键点击网页中除上以外的地方显示该项现在我们写一段 VBScript 脚本程序以获取密码框的值.
Sub GetPassword() set srcEvent = external.menuArguments.event Set doc=external.menuArguments.document set ele=doc.elementFromPoint( srcEvent.clientX, srcEvent.clientY ) if ele.type ="password" then if ele.value="" then Alert("密码为空") else Alert("密码为:"+ele.value) end if end if end sub call GetPassword()然后在注册表HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\下新建一下主键,键名为"取得密码",缺省值设为该htm文件的路径,在该主键下另增一个DWORD值,值为4,表示只在右击表单元素时显示该项.关闭注册表,重新启动IE窗口,点击一下密码框,就会出现该项,点击该项,弹出一个对话框,告诉你的密码 。
第二种方法:使用VC来实现
由于VC知识库是一个关于C++以及Visual C++的网站,与脚本语言没什么关系。所以我们要用另一种稍微复杂一点的方法来实现相同的事情,那就是用C++来做。在不同的进程中取得IE的Webbrowser控件的IHTMLDocument2接口,请参阅MSDN上的一篇文章,标题是:HOWTO: Get IHTMLDocument2 from a HWND(根据HWND取得IHTMLDocument2接口)(http://support.microsoft.com/default.aspx?scid=kb;EN-US;q249232).它的实现机理是向Webbrowser控件(窗口类名是"Internet Explorer_Server")发一个WM_HTML_GETOBJECT,然后把返回值传给Microsoft Active Accessibility (MSAA) 函数ObjectFromLresult,这样你会取得一个已经编排(Marshaling)过的COM接口.如下函数所示:
IHTMLDocument2* GetDocInterface(HWND hWnd) { // 我们需要显示地装载OLEACC.DLL,这样我们才知道有没有安装MSAA HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") ); IHTMLDocument2* pDoc2=NULL; if ( hInst != NULL ){ if ( hWnd != NULL ){ CComPtr spDoc=NULL; LRESULT lRes; /*由于WM_HTML_GETOBJECT非Windows标准消息,所以需要RegisterWindowMessage*/ UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") ); ::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes ); /*取得ObjectFromLresult函数的地址*/ LPFNOBJECTFROMLRESULT pfObjectFromLresult = \ (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") ); if ( pfObjectFromLresult != NULL ){ HRESULT hr; hr=pfObjectFromLresult(lRes, IID_IHTMLDocument, 0, (void**)&spDoc); if ( SUCCEEDED(hr) ){ CComPtr spDisp; CComQIPtr spWin; spDoc->get_Script( &spDisp ); spWin = spDisp; spWin->get_document( &pDoc2 ); } } } ::FreeLibrary(hInst); } else{//如果没有安装MSAA AfxMessageBox(_T("请您安装Microsoft Active Accessibility")); } return pDoc2; }这样,我们就取得了IHTMLDocument2*接口了,要取得密码框的密码还得一番周折,首先得构造一个基于对话框的MFC程序,增加一个按钮,在主对话框类增加一个成员变量m_bCapture,在构造函数中初始化为FALSE. 然后处理该按钮的Click事件:
void CXXXXDlg::OnGetHtmlClick() { SetCapture();//跟踪鼠标 m_bCapture=TRUE; }接着应该处理WM_LBUTTONUP消息:
void CXXXXDlg::OnLButtonUp(UINT nFlags, CPoint point) { if(m_bCapture){ m_bCapture=FALSE; ReleaseCapture();//释放鼠标 static TCHAR buf[100]; POINT pt; GetCursorPos(&pt); HWND hwnd=::WindowFromPoint(pt); if(hwnd!=NULL){ ::GetClassName( hwnd, (LPTSTR)&buf, 100 ); if ( _tcscmp( buf, _T("Internet Explorer_Server") ) == 0 ){ POINT iept=pt; ::ScreenToClient(hwnd,&iept); GetPassword(GetDocInterface(hwnd),iept); } } } CDialog::OnLButtonUp(nFlags, point); }GetPassword函数是这样实现的,基本可以模仿VBScript的调用,但要复杂一些:
void GetPassword(IHTMLDocument2* pDoc2,POINT pt) { if(pDoc2==NULL)return; CComPtr pElement; HRESULT hr=pDoc2->elementFromPoint(pt.x,pt.y,&pElement);//取得鼠标所在的元素 if(SUCCEEDED(hr)){ CComPtr pPwdElement; hr=pElement->QueryInterface(IID_IHTMLInputTextElement, (void**)&pPwdElement);//是否有表单输入元素 if(SUCCEEDED(hr)){ CComBSTR type; hr=pPwdElement->get_type(&type); if(SUCCEEDED(hr)){ if(type==_T("password")){//是密码框吗? CComBSTR pwd; hr=pPwdElement->get_value(&pwd); if(SUCCEEDED(hr)){ if(pwd.Length()!=0){//有密码则显示 CComBSTR msg=_T("密码是:"); msg+=pwd; CString str(msg); AfxMessageBox(str); } else{ AfxMessageBox(_T("密码为空!")); } } } } } } pDoc2->Release(); }使用这种方法要注意:
- 如果程序在Windows95,98和NT 4.0 Service With Pack 4 or 5下运行必须要把Microsoft Active Accessibility (MSAA)运行时组件(RDK)与程序一起发布(Windows2000及Windows NT 4.0 Service With Pack 6中已经有了,所以不用);
- 这种方法只适用用于Internet Explorer (Programming) versions 4.0, 4.01, 4.01 SP1, 4.01 SP2, 5;
- 使用这种方法前要调用CoInitialize(NULL);然后应该相应地调用CoUninitialize();
- Microsoft Active Accessibility (MSAA)可从 http://www.microsoft.com/enable/msaa/download.htm 下载 ;
附: 我们也可以使用Active Accessibility(MSAA)获取IHTMLDocument2*接口,见下程序:
/*
函数名:GetDocInterfaceByMSAA
参数:hwnd,WebBrowser控件的窗口句柄
功能:取得hwnd对应的Webbrowser控件的IHTMLDocument2*接口.
*/
/*
函数名:GetDocInterfaceByMSAA
参数:hwnd,WebBrowser控件的窗口句柄
功能:取得hwnd对应的Webbrowser控件的IHTMLDocument2*接口.
*/
IHTMLDocument2* GetDocInterfaceByMSAA(HWND hwnd) { HRESULT hr; HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") ); IHTMLDocument2* pDoc2=NULL; if ( hInst != NULL ){ if ( hwnd != NULL ){ //取得AccessibleObjectFromWindow函数 LPFNACCESSIBLEOBJECTFROMWINDOW pfAccessibleObjectFromWindow = (LPFNACCESSIBLEOBJECTFROMWINDOW)::GetProcAddress(hInst, _T("AccessibleObjectFromWindow")); if(pfAccessibleObjectFromWindow != NULL){ CComPtr spAccess; hr=pfAccessibleObjectFromWindow(hwnd,0, //取得Webbrowser控件的IAccessible接口 IID_IAccessible,(void**) &spAccess); if ( SUCCEEDED(hr) ){ CComPtr spServiceProv; hr=spAccess->QueryInterface(IID_IServiceProvider, (void**)&spServiceProv); if(hr==S_OK){ CComPtr spWin; hr=spServiceProv->QueryService(IID_IHTMLWindow2, IID_IHTMLWindow2, (void**)&spWin); /* 注意:并不是每次都能取得IHTMLWindow2接口,如果调用失败, 可以尝试取得IHTMLElement接口: CComPtr spElement; hr=spServiceProv->QueryService(IID_IHTMLElement, IID_IHTMLElement, (void**)&spElement); */ if(hr==S_OK) spWin->get_document(&pDoc2); } } } } ::FreeLibrary(hInst); } else{ AfxMessageBox(_T("请您安装Microsoft Active Accessibility")); } return pDoc2; }具体的例程可见本文提供的源代码(在WINDOWS ME,IE 5.5,VC6.0调试通过)
这里介绍如何用程序的方法获得WebBrowser控件中的HTML的源代码,并可以通过修改源代码内容来修改页面内容(注意:不是显示一个新的页面)。
首先要加入WebBrowser控件,加入控件的方面我就不说了。获得源代码方法有两种:
一、方法1(严格说,这个方法只不过是调用WebBrowser自己的菜单命令"查看源文件而已",并非我们所希望的)
关键代码:
#include "mshtmcid.h"
void CHtmlView::OnMethod1()
{
CWnd* pWnd = NULL;
CWnd* pWndShell = m_browser.GetWindow(GW_CHILD); // get the webbrowser window pointer
if (pWndShell)
{
pWnd = pWndShell->GetWindow(GW_CHILD); //get the child window pointer
}
if (pWnd != NULL)
{
WPARAM wParam = MAKEWPARAM(IDM_VIEWSOURCE, 1); //convert to unsigned 32 bit value and pass it to wparam
pWnd->SendMessage(WM_COMMAND, wParam, (LPARAM)this->m_hWnd); //cool send a message to retreive the source.
}
}
二、方法2
原理在于取得IPersistStreamInit接口指针,然后把网页写到IStream流中去。
关键代码:
#include "mshtml.h"
//在SourceView中填写HtmlView中网页的源程序
void CMainFrame::OnMethod2()
{
IHTMLDocument2 *pHTMLDocument=NULL;
IPersistStreamInit *pPSI=NULL;
IStream *pStream=NULL;
HGLOBAL hHTMLText;
if (!(pHTMLDocument = (IHTMLDocument2*)m_pHtmlView->m_browser.GetDocument()))
return;
if (FAILED(pHTMLDocument->QueryInterface(&pPSI)))
{
// pHTMLDocument->Release();
return;
}
hHTMLText = GlobalAlloc(GMEM_FIXED, MAX_SIZE);
CreateStreamOnHGlobal(hHTMLText, TRUE, &pStream);
pPSI->Save(pStream, FALSE);
// m_pSourceView->SetWindowText((char*)hHTMLText);
long nEditLength = m_pSourceView->GetEditCtrl().GetWindowTextLength();
m_pSourceView->GetEditCtrl().SetSel(0, nEditLength);
m_pSourceView->GetEditCtrl().ReplaceSel("");
char *pText = (char*)hHTMLText;
long lHtmlLength = strlen(pText);
CString str("");
long n = 0;
for (long i=0; i < lHtmlLength; i++)
{
if (*pText != 0x0d && *pText != 0x0a)
{
str += *pText;
pText++;
}
else
{
pText++;
if (*pText == 0x0a)
pText++;
str += "\r\n";
nEditLength = m_pSourceView->GetEditCtrl().GetWindowTextLength();
m_pSourceView->GetEditCtrl().SetSel(nEditLength, nEditLength);
m_pSourceView->GetEditCtrl().ReplaceSel(str);
str.Empty();
}
}
pStream->Release();
pPSI->Release();
// pHTMLDocument->Release();
}
三、修改HTML源代码以改变网页的显示
这部分比较有意思,可以当作是一个小的HTML编辑器,看看预演效果。特别的不是显示一个新文件,而是修改原来的HTML文件。
关键代码:
//根据SourceView里的HTML文本改变HtmlView里的显示
void CMainFrame::OnChangehtml()
{
IHTMLDocument2 *pHTMLDocument=NULL;
IPersistStreamInit *pPSI=NULL;
IStream *pStream=NULL;
HGLOBAL hHTMLText;
if (!(pHTMLDocument = (IHTMLDocument2*)m_pHtmlView->m_browser.GetDocument()))
return;
if (FAILED(pHTMLDocument->QueryInterface(&pPSI)))
{
// pHTMLDocument->Release();
return;
}
pHTMLDocument->clear();
pPSI->InitNew();
LPCTSTR strText = m_pSourceView->LockBuffer();
DWORD dwLength = strlen(strText);
hHTMLText = GlobalAlloc(GMEM_FIXED, dwLength);
memset(hHTMLText, 0, dwLength);
memcpy(hHTMLText, strText, dwLength);
m_pSourceView->UnlockBuffer();
CreateStreamOnHGlobal(hHTMLText, TRUE, &pStream);
ULARGE_INTEGER libNewSize;
libNewSize.QuadPart = dwLength;
pStream->SetSize(libNewSize);这一步必须要,否则显示时会有多余字符出现
pPSI->Load(pStream);
pStream->Release();
pPSI->Release();
// pHTMLDocument->Release();
}
有时侯不能显示出网页而显示的是源码文本,比如微软网站的首页就是这种情况。把源码中的这句话 < META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso8859-1" />去掉就可以了。
VC++ 对话框基础上加入 microsoft webbrower 时碰见奇怪的问题
悬赏分:0 -
解决时间:2008-5-4 15:02
![icn_point.gif](http://img.baidu.com/img/iknow/icn_point.gif)
想在自己的开发的基于对话框的词典软件上增加一个网络查询功能,网上看了点代码,如下: [ 利用WebBrowser控件创建自己的浏览器 (北京 邓磊) ---- 是不是很早就想拥有一个很有个性的浏览器?本文将介绍如何利用MicroSoft的WebBrowser控件在VC中创建一个属于自己的浏览器。过程如下: ---- ①新建一个基于对话框的工程,命名为test,然后在对话框上单击右键,选择Insert ActiveX Control…在弹出的对话框中选择MicroSoft Web浏览器,点击OK。此时对话框上已经出现了WebBrowser控件,调整它的大小以适合对话框的大小。 ---- ②选择WebBrowser控件,点击View/ClassWizard,选择Member Variables,单击Add Variable按钮,此时会弹出两个对话框,均点击确定即可。然后给该控件加入一个变量,我们把它命名为m_ctrlWeb。 ---- ③在ClassWizard中选择OnInitDialog()函数,在里面加入如下代码: ---- m_ctrlWeb.Navigate("d:\\temp\\html_doc\\index.html",NULL,NULL,NULL,NULL); ---- 第一个参数即你要浏览的URL地址,可以是一个文件,也可以是一个地址(http://dlgis.topcool.net)。 ] 按照他的方法我做了个基于对话框的浏览器,是没问题的。 问题是,当我想把上面的“东东”(技巧)用再我词典(也是基于对话框的)的主界面上,问题来了。 当我不给新增的“IDC_EXPLORER1”(是ACTIVE contrl中的microsoft webbrowser)添加变量时,我编译,运行,程序主界面能出来。当我给这 东西添加个变量m_ctrlWeb(变量类型:CWebBrowser2,Category:Control)时,我再编译运行,程序主界面就消失得无影无踪。而且,我按照上面 的步骤,添加代码完毕后,编译不出错,但点击运行就是好像一点反应也没有! 问题就出在,我给新增的“IDC_EXPLORER1”增加变量,程序就运行无反应,删掉增加的变量,程序主界面也正常显示。 渴求帮助!
转载于:https://blog.51cto.com/laokaddk/193825