- 浏览: 2031444 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
IE 控件一些高级使用方法
作者:杨老师
下载源代码
本文介绍如下内容
1、如何显示内存中的 HTML 网页;
2、如何屏蔽掉鼠标右键的上下文菜单;
3、如何扩展 HTML 中的脚本(external)对象;
4、如何显示 HTML 样式的对话窗;
5、如何执行 HTML 脚本;
一、如何显示内存中的 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 );
图一、IE控件显示内存中的 HTML 文件 图二、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中<html style=....>描述。 |
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 '''' 关闭
六、结束语
好好学习、天天向上。做合格的社会主义计算机软件事业接班人。嘿嘿......
发表评论
-
__declspec(novtable) 的用法
2010-11-27 14:37 1578__declspec(novtable) 的用法 __d ... -
解决URLDownloadToFile缓存问题的两种方法
2010-09-09 15:18 2906解决URLDownloadToFile缓存问题的两种方法 ... -
修改richedit背景
2010-07-19 22:52 1647RichEditCtrl::SetBackgroundCo ... -
使用ADO封装类的数据库程序开发实例(下)
2010-07-12 15:30 1474使用ADO封装类的数据库 ... -
使用ADO封装类的数据库程序开发实例(上)
2010-07-12 15:28 1215使用ADO封装类的数据库 ... -
VC防止窗口和控件闪烁的方法
2010-07-09 21:16 20221、将Invalidate()替换为Invalidate ... -
防止窗口闪烁地办法
2010-07-09 21:13 1512防止窗口闪烁地办法 也许我们都碰到过这种情况,当你 ... -
使用ADO _ConnectionPtr
2010-07-06 16:04 5265// GetUser.cpp : Defines the ... -
VC用ADO访问数据库全攻略
2010-07-06 15:29 1799VC用ADO访问数据库全 ... -
深入GetMessage和PeekMessage (引自-MSDN技术组)
2010-06-10 16:59 3726深入GetMessage和PeekMessage (引自 ... -
界面编程总结(1)
2010-06-02 13:32 4011原文地址:http://blog.csdn.net/byx ... -
获取信息的有关Windows API
2010-05-27 10:01 3146获取信息的有关Windows API 1.窗口信息 ... -
VC中如何实现窗口的隐藏
2010-05-13 10:08 7862VC中如何实现窗口的隐藏 用MFC做的Dialog ... -
SetConsoleCtrlHandler 处理控制台消息
2010-05-07 17:32 18144SetConsoleCtrlHandler 处理控制台消 ... -
解决决错误: error C2850: 'PCH header file'
2010-04-27 19:45 1953解决决错误: error C2850: 'PCH hea ... -
VC++ GDI+编程的字体和文本绘制
2010-04-13 13:12 7979字体是文字显示和打印的外观形式,它包括了文字的字样、风格和尺寸 ... -
VC利用GDI+显示透明的PNG图片
2010-04-12 16:59 115391.在你将要使用GDI+的工程中,完成初始化 ... -
GDI+编程基础(一)GDI+ Vs GDI
2010-04-12 15:59 2336下载源代码一、GDI GDI是位于应用程序与不同硬件之间 ... -
VC画图
2010-04-12 15:50 1539BOOL DrawPic(HDC hdc, TCHAR* ... -
对话框的数据交换--MFC深入浅出
2010-04-12 10:43 2458对话框数据交换指以下两种动作,或者是把内存数据写入对应的控 ...
相关推荐
本篇将详细探讨IE控件的一些高级使用方法,这些方法主要来源于VC++的实践应用。 一、创建和初始化IE控件 在VC++中,IE控件通常通过ActiveX技术实现,使用`COleControl`或`CWnd`派生类。首先,你需要在资源编辑器中...
这个压缩包"IE 控件一些高级使用方法htmldlg.rar"显然是针对IE控件的一个教程,特别关注了`HtmlDlg`的使用。`HtmlDlg`是IE控件中的一个特性,用于创建和管理HTML对话框。接下来,我们将深入探讨IE控件以及`HtmlDlg`...
1、如何显示内存中的 HTML 网页;2、如何屏蔽掉鼠标右键的上下文菜单;3、如何扩展 HTML 中的脚本(external)对象;... 关键字:ie,control,iwebbrowser2,ihtmldocument2,ipersiststreaminit,istream,控件
【纯SDK封装IE控件源码】是一种技术实践,它涉及到使用Windows SDK(Software Development Kit)来编写代码,而不是依赖于Microsoft Foundation Classes (MFC) 或 Active Template Library (ATL) 这样的高级库来封装...
3、如以上两种情况均以排除,仍不能正常使用,很可能由于未能正常下载安全控件所致,请将IE浏览器设置恢复为默认值后再进行安全控件下载及登录。 a) 点击浏览器菜单栏上的工具→Internet选项→安全,选择Internet...
在开发Windows应用程序时,有时我们需要在程序内部集成网页浏览功能,这时可以使用WebBrowser控件。这个控件允许开发者在应用程序中嵌入一个Internet Explorer浏览器引擎,让用户可以在应用内部浏览网页。本文将详细...
6. **使用Visual Studio附加到进程**:如果以上方法无效,可以尝试在VC中使用“调试”菜单的“附加到进程”功能,手动连接到运行IE的进程(通常是`iexplore.exe`),然后尝试设置断点。 7. **事件处理和线程问题**...
4. 使用方法: 集成My97日期控件到项目中通常涉及以下几个步骤:下载控件文件,将JavaScript和CSS文件引入到HTML页面中,然后通过JavaScript代码初始化控件,最后可以通过配置项进行定制,例如设置默认日期、禁用...
在本文中,我们将探讨如何使用VB6.0来创建一个具有Internet Explorer (IE) 风格的按钮控件。这个控件将模仿IE浏览器中的按钮样式,并实现相关的交互效果,如鼠标悬停、按下等状态的变化。此外,我们还将介绍如何利用...
- IE:Internet Explorer,是微软出品的曾经广泛使用的网络浏览器,支持插件和控件。 - 图片:在此场景中指的是在网页上显示的图像资源。 - 控件:在网页开发中,控件通常指可以被用户操作的元素,如按钮、文本框等...
总的来说,IE打印控件smsx.cab是一个方便开发者在Web环境中实现高级打印功能的工具,尽管它受限于特定的浏览器和操作系统,但在过去的一段时间里,尤其是在企业级应用中,它发挥了重要的作用。随着技术的发展,现在...
【标题】"dvr旧录像机ie控件"涉及到的核心技术是基于Internet Explorer(IE)浏览器的控件,主要用于在老式计算机上访问和操作思朗品牌的模拟硬盘录像机(DVR)。这些控件允许用户通过网页界面远程监控、回放录像...
IE11 使用 ActiveX 控件是指在 Internet Explorer 11(IE11)浏览器中使用 ActiveX 控件的方法和设置。ActiveX 控件是一些小应用程序,网站可以使用这些小应用程序提供视频和游戏等内容。在浏览 Web 时,你也可以...
3. **触发打印**:使用控件提供的打印方法,如`print()`,启动打印操作,并将网页内容按照预设参数打印出来。 4. **测试和调试**:在实际环境中测试控件的功能和性能,确保在不同版本的IE浏览器上都能正常工作。 ...
它可能包含了预设的配置和函数,使得开发者能更方便地在自己的应用中使用IE控件。 3. **mshtml**: 这是IE浏览器控件的核心组件,它是Internet Explorer的一部分,提供了HTML文档的解析和显示功能。在编程中,开发者...
在本文中,我们将深入探讨My97DatePicker的使用方法,以及如何在项目中集成和定制这个控件。 1. **安装与引入** My97DatePicker通常以JavaScript文件的形式提供,如在提供的压缩包中`My97DatePicker4.7.2`可能包含...
ActiveX 控件在 IE 浏览器中的调用设置方法 在 IE 浏览器中调用未签名 ActiveX 控件是一件需要注意的任务。ActiveX 控件作为 IE 浏览器的一种插件程序,在我们使用 IE 过程中会经常遇到。例如,当我们使用网银或...
如果控件更新或升级以后,需要删除旧版本重新安装新版本,删除控件的方法和删除其他文件一样,找到控件安装文件,点击删除即可。控件的安装目录为C:\WINDOWS\Downloaded Program Files,找到PowerEnterPSBC.inf和...
2. **版本兼容性**:不同版本的IE可能在操作界面上有所不同,上述步骤主要基于IE较新版本编写,如果使用的是旧版IE,则操作界面可能会略有差异。 3. **长期解决方案**:从长远来看,最佳做法是要求控件提供商为其...
- **渐进增强**:确保基本功能在所有浏览器中都可用,然后为支持更高级特性的浏览器添加额外的功能和样式。 - **响应式设计**:确保日历控件在不同屏幕尺寸和设备上都能良好显示,适应移动设备和桌面电脑。 在"Demo...