以下应用应该包含<Mshtml.h>文件
1.去除边框和滚动条
一般你可以把这个函数放在CppWebBrowser的OnDocumentComplete事件中调用
void __fastcall TForm1::SetBrowserStyle()
{
_di_IDispatch disp = CppWebBrowser1->Document;
if(disp == NULL) return;
//这是什么样式的定义?!我也不知道,但是可以正常编译
//还有种C++样式的定义在例子2中,不过把_di_IDispatch类型直接赋给IHTMLDocument2类型
//就会有错误,可以在IHTMLDocument2变量强制转换为void *就可以了
//在这里不用:
System::DelphiInterface<IHTMLDocument2> htmldoc2;
System::DelphiInterface<IHTMLElement> htmlelem;
System::DelphiInterface<IHTMLBodyElement> htmlbody;
System::DelphiInterface<IHTMLStyle> htmlsty;
htmldoc2 = disp;
htmldoc2->get_body(&htmlelem);
htmlbody = htmlelem;
htmlbody->put_scroll(WideString("no")); //设置无滚动条
//htmlbody->put_background(L"C://bg.gif"); //设置背景
htmlelem->get_style(&htmlsty);
htmlsty->put_border(WideString("none")); //设置无边框
//以上几个都可以预先在网页中设置,这里只是演示效果
//对于一些样式的设定,新的 W3C XHTML 版本可能不适用,比如新版不支持<body scroll="no">
//这样的样式定义,看页面第一行是否有
//<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...>
//这样的版本定义,但是老版的又不支持一些CSS规则
//下面是释放内存,不知道为何很多人不用,如果打开CodeGuard,不释放就会有错误
htmldoc2->Release();
htmlelem->Release();
htmlbody->Release();
htmlsty->Release();
}
2.提取网页源码
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//C++的定义方式
IHTMLDocument2 *document;
IHTMLElement *body;
BSTR source;
//赋值前需要强制转换为void *类型
(void *)document=CppWebBrowser1->Document;
if (document == NULL) return;
document->get_body(&body);
body->get_outerHTML(&source) ;
ShowMessage(source);
document->Release();
body->Release();
}
3.屏蔽脚本错误提示
//这么简单?!我也没试过
CppWebBrowser1->Silent = true;
IHTMLElement中还有很多类似的方法可以调用,要坐下来研究研究!
4.改变TCPPWebBrowser的Html内容
方法一
转自 C++Builder 研究 - http://www.ccrun.com/article/go.asp?i=169&d=st0528
注:此函数把参数Html文本显示在WebBrowser中,Html是页面源码
void __fastcall TForm1::SetHtml( TCppWebBrowser *WebBrowser,AnsiString Html )
{
IStream *Stream;
HGLOBAL hHTMLText;
IPersistStreamInit *psi;
if( WebBrowser->Document == NULL ) return;
hHTMLText = GlobalAlloc( GPTR, Html.Length() + 1 );
if( 0 == hHTMLText )
{
ShowMessage( "GlobalAlloc Error" );
return;
}
CopyMemory( hHTMLText, Html.c_str(), Html.Length() );
OleCheck( CreateStreamOnHGlobal( hHTMLText, true, &Stream ) );
OleCheck( WebBrowser->Document->QueryInterface(__uuidof(IPersistStreamInit), (void **)&psi) );
OleCheck( psi->InitNew() );
OleCheck( psi->Load(Stream) );
//使用delete会出错
//delete psi;
//delete Stream;
psi->Release();
Stream->Release();
}
方法二
上面的方法似乎有些繁琐,这是我的SetHtml版本,同样需#include <Mshtml.h>
void __fastcall TForm1::SetHtml(TCppWebBrowser *WebBrowser,WideString Html)
{
IHTMLDocument2 *document;
IHTMLElement *body;
(void *)document=WebBrowser->Document;
if (document == NULL) return;
document->get_body(&body);
body->put_innerHTML(Html);
document->Release();
body->Release();
}
注:虽然这两个方法得到的结果是一样的,但是还是有本质区别,如果我以文本"<input value='Hello world!'>"作为这两个方法的第二个参数Html调用,在分别执行这两种方法后,如果你右键“查看源文件”,你会发现第一种方法的源码变成了参数Html的内容,而第二种方法还是原页面的内容,而且第一种方法如果不在"<input value='Hello world!'>"前后加上<html>和</html>网页标识,那么在WebBrowser中显示的不是一个文本框,而是文字"<input value='Hello world!'>",因为在第二种方法中,函数仅仅对页面Body部分进行操作,而保留了其他部分的内容。