动态网站制作指南
[  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息

本月文章推荐
.UDP编程.
.给MSN Messager装个钩子.
.C/C++中数组和指针类型的关系的入.
.新手必看.
.C/C++作用域引申出的编码规范.
.深度探索C++对象模型(6).
.用键盘移动光标的简单介绍.
.API之文本和字体函数.
.完整的读写函数.
.控制台窗口界面的编程控制(四).
.vb.net中windows服务的创建.
.在16色模式下显示256色及全彩色.
.C语言循环控制语句.
.c/c++中的字符指针数组,指向指针.
.局部类和嵌套类.
.乌托邦式的接口和实现分离技术.
.Asp组件高级入门与精通系列之二.
.TCPIP完整的一套基础介绍.
.容易理解魔方阵源程序.
.水滴石穿C语言之编译器引出的问题.

VC编程技巧:IE控件的高级用法

文章类别:C/C++教程 | 发表日期:2008-3-8 |


  一、如何显示内存中的 Html 网页

   或者因为网页保密的考虑;或者因为软件分发的考虑,有的时候就需要让 IE 或 IE 浏览器控件显示内存或资源中的 HTML 网页。在 MFC 中,CHtmlView::LoadFromResource() 可以显示程序资源中的 HTML 内容。我们都知道MFC的 CHtmlView 其实是对 IWebBrowser2 的一个包装,但是在 IWebBrowser2 中却没有类似的方法。那么它是如何实现的那?步骤如下:

   1、首先通过 IWebBrowser2::Navigate2() 显示一个网页,其目的是产生有效的对象,从而得到 IHTMLDocument2 接口;

   2、IWebBrowser2::get_Document() 得到 IHTMLDocument2 接口指针;

   3、IHTMLDocument2::QueryInterface() 得到 IPersistStreamInit 接口指针;

   4、IPersistStreamInit::InitNew() 初始化接口对象;

   5、IPersistStreamInit::Load() 装载内存中的 HTML 数据流(IStream *);

   内存指针转换为流的方法是:

   I、 GlobalAlloc() 申请内存;

   II、 复制 HTML 字符串内容到上述的内存中;

   III、 CreateStreamFromHGlobal() 转换内存为 IStream 指针;

   原理性代码如下:

// 显示一个空白网页
m_ie.Navigate2( &CComVariant(_T("about:blank")),NULL,NULL,NULL,NULL);
// 得到 IHTMLDocument2 指针
CComPtr< IDispatch >spDoc(m_ie.GetDocument());
// 得到 IPersistStreamInit 指针
CComQIPtr< IPersistStreamInit, &IID_IPersistStreamInit >spPSI( spDoc );
// 申请内存,复制 HTML 字符串
LPTSTR lpMem = (LPTSTR)::GlobalAlloc( GPTR, ::lstrlen( lpHtml )+1 );
lstrcpy( lpMem, "xxx xxx" );
// 转换内存为流对象指针
CComPtr< IStream >spStream;
CreateStreamOnHGlobal( lpMem, TRUE, &spStream );
// 初始化后,装载显示
spPSI->InitNew();
spPSI->Load( spStream );

VC编程技巧:IE控件的高级用法
图一、IE控件显示内存中的 HTML 文件

VC编程技巧:IE控件的高级用法
图二、HTML对话窗
   IE 所能支持的数据传输协议,除了大家所熟悉的 http、FTP、file......还有一个协议是 res ,它表示浏览显示文件中的 HTML 资源。你可以在 IE 的地址栏上直接输入这样格式的 URL:"res://文件名/资源名"。

   把 HTML 文件加入到程序资源的方法比较简单,在资源卡片中,鼠标右键弹出菜单,执行 Import...(引入),选择指定的 HTML 文件,然后给一个资源名称即可。(在这里,最方便的资源名称用字符串比较好,假如使用整数ID,那么将来在使用的时候是这样的格式:res://文件名/#101,这里假设 101 是资源的ID号。真麻烦!我不太喜欢这样的方式。)对于图片文件等其它的附件,则需要手工编辑资源 RC 文件(用 IDE 环境引入,它会试图用文本方式打开一个2进制文件,多数情况下会“死机”)。下图是事例程序引入资源后的样式:


(图片较大,请拉动滚动条观看)

图三、HTML 资源的引入
   手工编辑 RC 文件的部分是:

......
/////////////////////////////////////////////////////////////////////////////
//
// HTML
//

HTML_TOWord       HTML  DISCARDABLE   "res\\ToWord.htm" // 这两个是HTML文件,可以引入
HTML_DLG        HTML  DISCARDABLE   "res\\html_dlg.htm"
~SEND_R1_C1.GIF     HTML  DISCARDABLE   "res\\~Send_r1_c1.gif" // 下面的是GIF文件,需要手工加入
~SEND_R1_C2.GIF     HTML  DISCARDABLE   "res\\~Send_r1_c2.gif"
LOGO.GIF        HTML  DISCARDABLE   "res\\Logo.gif"
SEND_R1_C1.GIF     HTML  DISCARDABLE   "res\\Send_r1_c1.gif"
SEND_R1_C2.GIF     HTML  DISCARDABLE   "res\\Send_r1_c2.gif"
SPACER.GIF       HTML  DISCARDABLE   "res\\spacer.gif"
#endif  // Chinese (P.R.C.) resources
/////////////////////////////////////////////////////////////////////////////
......

   二、屏蔽 IE 控件的上下文菜单

   屏蔽或自定义 IE 控件的上下文菜单,其实就是需要实现 IDocHostUIHandler 接口中的 ShowContextMenu 方法。假如使用 ATL 编写程序,我认为实现是比较简单的(也许是我使用 ATL 写 COM 比 MFC 熟悉一些的因素吧)。事例程序由于用 MFC 书写,真是搞的我头晕眼花,翻箱倒柜终于找到了微软书写的演示代码,于是我就直接复制过来使用了。(换句话说,读者在阅读这部分代码的时候,假如有问题可不要问我。你直接打电话去咨询 Microsoft 哈。)

   三、扩展 HTML 脚本中的 external 对象

   从 CCmdTarget 派生一个自动化对象(新建C++类的时候,注重别忘了选择 Automation)。在这个类里,你可以使用 ClassWizard 的 Automation 卡片,添加自定义的方法和属性。而在 HTML 的脚本程序中,就可以使用 window.external 进行调用了。用这个方法,实现了对 HTML 脚本功能的扩充。在 HTML 脚本和自动化对象之间要建立起关系,则需要实现 IDocHostUIHandler::GetExternal() 方法。

   四、显示 HTML 样式的对话窗

   这节内容是本文的重点。

   用户的界面设计经历了若干个发展阶段。最早的程序设计,可以说没有用户界面;然后发展出一些简单的与用户交互的界面(控制台界面,全屏文本界面);再然后发展出了图形界面。其实我们现在的商业程序设计中,界面的处理代码占用了很大的篇幅。为了使界面的处理变得简单、通用、易修改维护,人们制作了很多的界面程序库。说实在话,大多数的界面程序库由于封装的不好,一是不灵活,二是经常需要修改它内部的 BUG,重用的效果并不理想。通用的换肤软件也只能实现对标准的窗口类进行皮肤美化,对自定义的窗口类还是需要自己写钩子。

   现在,我们已经有一个非常好的方法进行界面设计了,那就是使用 HTML(使用 Visual Studio.net 的程序员,一定对 .net 的界面很喜欢吧?!.net 开发环境,无处不在使用 HTML 方式的界面)。即使是一个完全地道的本地软件(非B/S软件),也可以使用本地 ASP 方式,HTA 方式进行程序设计。软件用户非常喜欢这样的程序,因为他早就熟悉并把握了浏览器的操作,另外,对于程序员来说,也非常喜欢这种方式,因为不会再为换肤,不同用户不同的界面特化而伤脑筋了。

   微软将要在下一代的程序设计中使用 XML 来描述用户界面。这种设计方式将会解放你、我这样的程序员,把咱们的工作量全部都转化到美工师那里去了:) 借 vckbase 的平台,现在呼吁大家,尽快学习和把握 HTML、XML 的设计和脚本编程,并能熟练地对它们与 C++ 对象的交互进行编程。可以预计在未来的两三年内,拥有这样水平的程序员,一定会开始吃香饽饽了,嘿嘿......

   下面,就如何显示一个 HTML 对话窗,开始我们未来软件方式的编程吧。

   我们要调用 MSHTML.DLL 中的一个函数 ShowHTMLDialog(Ex) 来完成 HTML 对话窗的显示和数据交互。这个函数的声明是:

HRESULT ShowHTMLDialogEx(     HWND hwndParent,
   IMoniker *pMk,
   DWORD dwDialogFlags,
   VARIANT *pvarArgIn,
   WCHAR *pchOptions,
   VARIANT *pvarArgOut
);

   hwndParent 对话窗的父窗口句柄 这个太简单了,不多罗嗦。

   pMk URL的命名接口指针 表示在对话窗中显示哪个URL的页面。但它不是以简单的URL字符串方式提供的。它使用了moniker(命名)接口指针。 根据URL得到IMoniker *很简单,调用CreateURLMoniker()。唯一要注重的是,这个函数需要连接 Urlmon.lib 库。

dwDialogFlags 对话窗类型 可以组合 HTMLDLG_NOUI、HTMLDLG_MODAL、HTMLDLG_MODELESS、HTMLDLG_PRINT_TEMPLATE、HTMLDLG_VERIFY。
示例程序使用的是模式对话窗。HTMLDLG_NOUI 在下一节中介绍。

   pvarArgIn 对话窗的输入参数 一个传入对话窗的VARIANT变量,对话窗脚本中使用 window.dialogArguments 可以取得。

   pchOptions 对话窗样式 用字符串表示的对话窗样式。参考 IHTMLWindow2::showModalDialog()函数。

   比如:"dialogHeight:100px dialogWidth:200px"表示200点宽,100点高。假如你不想在程序中指定,也可以在HTML中描述。

   pvarArgOut 对话窗输出参数 对话窗的VARIANT返回值,对话窗脚本中使用 window.returnValue 可以赋值。

   这个函数在 vc.net 的头文件上有完整的声明,假如你使用 vc 6.0 的话,那么函数声明、函数指针定义和一些常量,你需要手工添加。还好,本文的示例程序是在 VC6 下编写和调试的,下载代码后,请仔细阅读源文件和注释就可以了。

   五、执行 HTML 脚本

   关于调用脚本的方法,我在 vckbase 发表了好几篇文章(鬼知道我为什么对脚本这么有爱好)。ShowHTMLDialogEx()函数中,假如类型参数给出 HTMLDLG_NOUI,则表示并不真正显示一个对话窗,而是加载指定的 HTML 并执行其中的脚本。示例程序的该脚本中,执行一连串的动作,完成了把上一个 HTML 对话窗中用户输入的文本,发送到 MS WORD 中去。以此上下串联起来,演示了本文章中所讨论的所有功能。下面我把脚本和注释给朋友们展现一下:

On Error Resume Next
Set wordapp=CreateObject("Word.Application") ''''运行 MS WORD
if err<>0 then
MsgBox("没有安装 MS WORD")
else
wordapp.visible = true ''''显示WORD界面
wordapp.Documents.Add "",false, 0 ''''新增一个空文档
wordapp.Selection.TypeText window.dialogArguments ''''键入传递进来的文本
end if
window.close '''' 关闭
更多文章 更多内容请看浏览器使用技巧专题,或

上一篇:C++ 类的静态成员(static) 人气:213
下一篇:C++箴言:声明为非成员函数的时机 人气:162
点击此处浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-5-16 乘风多用户PHP统计系统 v3.4
2008-5-16 轩溪下载系统 v3.78 build 0515
2008-5-16 普沙B2B 浙江省商贸网 v2.0
2008-5-16 asp抓蜘蛛的小程序 v1.0
2008-5-16 齐齐乐网私服发布站 仿haosf新版
2008-5-16 IssTech信息反馈系统 v1.0
2008-5-16 自由领域大头贴(js接口版) 修正版
2008-5-16 医院网站系统
2008-5-16 智拓-分类信息管理系统 v5.0
2008-5-7 Windows XP SP3 官方英文版
2008-5-7 Windows XP SP3 官方香港中文版
2008-5-7 Windows XP SP3 官方繁体中文版
2008-5-7 Windows XP SP3 官方简体中文版
2008-4-30 Multiple Unzip Wizard 1.02
2008-4-30 Multiple Unrar Wizard 1.0.0
2008-4-30 WinZip Install/Try/Uninstall a
2008-4-30 ZIP压缩文件修复器WzipFix 2.0
2008-4-30 Pentazip 6.01 Build 189 For Wi
  发表评论
姓 名: 验证码: [ 全部贴吧 ] [ 浏览评论 ]
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報