CPPWebBrowser的几个简单应用

以下应用应该包含<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部分进行操作,而保留了其他部分的内容。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值