转自:http://blog.csdn.net/sky04/article/details/7587406

因为我的部门只有我一个人(无奈之极,只有我一个做C++的,其他的都在做C#),所以我去跟技术顾问讨论我们客户端到底该怎么呈现。他说按照以往(上一套系统)的经验,升级很频繁,建议还是使用内嵌 HTML的方式来显示界面,这样以后只要升级HTML就可以了。我听了之后,牙掉了一半,我拖了半个月的对话框就这么给否了,心里着实不是滋味。

然后就开始寻找MFC显示HTML页面的方法,找了一些自定义的HTML类,找了Webbrowser Control(我到现在还没找到这控件到底在哪里),最终锁定了CDHtmlDialog类。

这个类算是最近才开始大放异彩的吧,在vc6.0时代,用这玩意儿做出来的东西很难看,都是win2k风格。现在就可以使用什么win7风格呀之类的,说不定在vs11里还能使用Metro风格呢。。简单试验了一下,发现还是可以一用的,就决定下来要用这个了。

建立一个新的MFC Application工程,在这一步把HTML Dialog给勾上

可以看到如此一来,对话框就是从CDHtmlDialog类派生了。

建立完成后,观察一下代码跟以前的不同之处。发现了四点(可能还有更多):

  1. class CTestHtmlDialogDlg : public CDHtmlDialog

表明此对话框类的确是继承了CDHtmlDialog。

  1. // Dialog Data
  2. enum { IDD = IDD_TESTHTMLDIALOG_DIALOG, IDH = IDR_HTML_TESTHTMLDIALOG_DIALOG };

这儿的枚举变成了两个,也就是有一个普通对话框,还有一个HTML对话框。

  1. CTestHtmlDialogDlg::CTestHtmlDialogDlg(CWnd* pParent /*=NULL*/)
  2. : CDHtmlDialog(CTestHtmlDialogDlg::IDD, CTestHtmlDialogDlg::IDH, pParent)

在CTestHtmlDialogDlg的构造函数中,CDHtmlDialog的成员初始化列表中多了一个CTestHtmlDialogDlg::IDH。

  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. // HTML
  4. //
  5. IDR_HTML_TESTHTMLDIALOG_DIALOG    HTML         "TestHtmlDialog.htm"

在resource文件中,多了这么一行,用来指定HTML对话框的HTML文件资源,可以修改成自己喜欢的名字,比如index.html,当然在工程中的html文件也要修改成相应的名字。

我们来做个试验。修改一下TestHtmlDialog.htm。

  1. <HTML>
  2. <HEAD>
  3. </HEAD>
  4. <BODY ID=CTestHtmlDialogDlg style="font-family:MS Shell Dlg;font-size:8">
  5. <h1>This is a test.</h1>
  6. <h2>I told you this is a test.</h2>
  7. <h3>Didn't hear me? This is a test!</h3>
  8. <img src="C:\\test.jpg">
  9. </BODY>
  10. </HTML>

显示结果如下:

怎么样?比拖对话框、拖控件、加载资源、修改ID号、关联变量、各种Load各种Show要简单多了吧?

我这儿出了个问题,截止发文时尚未解决,如有大虾指教烦请回复一下。我只能使用绝对路径c:\test.jpg,而不能使用相对路径,无论是test.jpg、..//test.jpg、..//Debug//test.jpg等等都不行,而且我把test.jpg在工程目录里放得到处都是,也不能加载,总是显示一个小红叉。。

-------------------------------我是华丽的分割线--------------------------------------

继续我们的实验。页面不能光是显示啊,总得有点什么互动吧?那么很高兴这东西也支持JavaScript

利用VS2010自带的HTML编辑器对TestHtmlDialog.htm进行编辑。这儿得赞一下VS2010的HTML编辑器,非常人性化,基本可以跟Dreamweaver媲美了,双击按钮呀啥的都可以直接进入 onclick事件的编写,默认Javascript。

我们拖一个按钮在上面,改个名字,然后保存并双击按钮编写onclick事件

  1. function Button1_onclick() {
  2. alert("哈喽,击这么狠干啥");
  3. }

就弹出了刚才的alert信息。

-------------------------------我是华丽的分割线--------------------------------------

接下来我萌生了一个念头,Javascript是不是可以调用本地对话框内的函数呢?去百度上Google了一会,发现当然是可以的。方法也比较简单。

  1. // 1. 让CTestHtmlDialog支持自动化
  2. // 在OnInitDialog()中添加
  3. EnableAutomation();
  4. // 2. 将自身暴露给Javascript
  5. // 在OnInitDialog()中添加
  6. SetExternalDispatch(GetIDispatch(TRUE));    //将浏览器控件的扩展接口设置为对话框自身的IDispatch
  7. // 3. 声明DISPATCH_MAP
  8. // 在TestHtmlDialog.h中
  9. DECLARE_DISPATCH_MAP()
  10. // 4. 定义DISPATCH_MAP
  11. // 在TestHtmlDialog.cpp中
  12. BEGIN_DISPATCH_MAP(CMyDHtmlDialog, CDHtmlDialog)
  13. DISP_FUNCTION(CMyDHTMLDialog, "SayHello", func, VT_EMPTY, VTS_NONE)
  14. END_DISPATCH_MAP()

应该看出来了,有点像MFC的消息映射机制。

接下来随便写个函数:

  1. MessageBox(_T("SayHello Func"), _T("Hello~~"));

修改一下刚才的按钮单击事件:

  1. function Button1_onclick() {
  2. //alert("哈喽,击这么狠干啥");
  3. external.SayHello();
  4. }

好,编译运行。点击按钮,弹出个东西来:

因为要将程序内部暴露出来,Windows认为这可能是不安全的。点击“是”之后,就看到了刚才写的函数的效果。

但是我觉得很安全,我不想再看见刚才的这个东西。。该怎么办呢?一番寻找,便找到了解决方案。

在CTestHtmlDialog中,重载CanAccessExternal()函数。

  1. BOOL CWebbrowserDlg::CanAccessExternal()
  2. {
  3. return TRUE;
  4. }

这下,讨厌的安全提示便不见啦~

-------------------------------我是华丽的分割线--------------------------------------

对话框可否访问Javascript的函数呢?当然也可以,这样就可以仅由Javascipt来判断数据的合法性,让C++来专心作逻辑运算了。

这个资料就相对少一些了,找了一个,还未吃透。仔细想一下,这方面的需要是比较少,所以资料也不太多。在codeproject上倒是找到了一个这方面的东西,感兴趣的朋友就去观望一下吧~ 时空穿梭传送门

CDHtmlDialog的基本使用的更多相关文章

  1. CDHtmlDialog加壳HTML5页面跳转错误解决(原)

    HTML5+Native方式开发应用程序,遇到的一个问题:HTML5实现的阅读器在打开文档时,CDHtmldialog类的跳转函数报错,忽略错误程序可以正确执行. 错误代码:OnNavigateCom ...

  2. 在CDHtmlDialog中处理WindowClosing

    要截获window.close(),就得截获CDHtmlDialog的WindowClosing.以下是示例代码: // header DECLARE_EVENTSINK_MAP() void Win ...

  3. Dialog with HTML skin using CDHtmlDialog and SetWindowRgn

    Introduction This program demonstrates how to use CDHtmlDialog and SetWindowRgn functions to give a ...

  4. 用MFC实现WebGUI--(CDHtmlDialog)

    自从去年年底一次棘手的界面,开始研究用web做界面到现在大约1年,这一年间不是局限在实现层面,也并非一直研究这一个问题,有很多问题其实不是问题,只是自己没有想清楚或者思想没放开.对于一个界面开发人员, ...

  5. CDHtmlDialog探索----WebBrowser扩展和网页Javascript错误处理

    当WebBrowser控件(CDHtmlDialog自动创建了WebBrowser控件)加载的网页中含有错误Javascript代码时默认情况下控件会弹出错误信息提示对话框,相对于用户体验来说这样的提 ...

  6. CDHtmlDialog探索----Javascript与窗体交互

    CDHtmlDialog提供了C++与网页的双向交互,通此一系统简单的宏调用可以把网页中各元素的事件直接映射到C++程序中,而在网页中调用C++功能代码就显的不那么直观了.归根结底交互的基理就是实现相 ...

  7. MFC CDHtmlDialog 加载本地资源

    步骤:1.资源视图 项目右击选择资源添加,自定义添加新类型 如:JS(会增加JS文件夹)2. 选择1新建的文件夹右击 添加资源 导入 选择js文件引入3. 在资源文件Resource.h文件夹能找到资 ...

  8. CDHtmlDialog 基本使用

    跳转 Navigate("res://tt.exe/#138"); 138是html的资源号 输入框的Get,set HRESULT CTTDlg::OnButtonCancel( ...

  9. 今天逛VC驿站 的收获

    1.C++ 如何定义一个定长字符串, 若不足位数,就补字符串"0"? eg: CString str1 = “123”;不足20位,前面补“0”,实现效果为“00000000000 ...

随机推荐

  1. Meta标签用法大全

    meta是html文档在head标签里定义的一个对文档进行描述的功能性标签 meta标签有下面的作用: 1.搜索引擎优化(SEO) 2.定义页面使用语言 3.自动刷新并指向新的页面 4.实现网页转换时 ...

  2. Markdown学习和插件介绍

    markdown能干啥 亲们github上的项目首页的 内容+样式,都是项目中README.md文件控制的.将md风格的代码,转化成html. 而且markdown语法非常简单,5-10分钟即可学会! ...

  3. language model —— basic model 语言模型之基础模型

    一.发展 起源:统计语言模型起源于 Ponte 和 Croft 在 1998年的 SIGIR上发表的论文 应用:语言模型的应用很多: corsslingual retrieval distribute ...

  4. 你的指纹还安全吗? - BlackHat 2015 黑帽大会总结 day 2

    你的指纹还安全吗?  0x03 FINGERPRINTS ON MOBILE DEVICES: ABUSING AND LEAKING speaker是来自FireEye的Wei Tao和Zhang ...

  5. web开发字符乱码问题

    java动态网页后台乱码问题总结 乱码可能出现的几块地方: 首先是浏览器和html之间采用的编码不一致 解决办法: 修改浏览器的编码格式 修改html页面的编码格式: <meta http-eq ...

  6. C# 文件类型

    C# 中一些常用文件类型: designer.cs 是窗体设计器生成的代码文件,作用是对窗体上的控件做初始化工作(在函数InitializeComponent()中).VS2003以前都把这部分代码放 ...

  7. scss/css 中添加ie hack

    @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { /* IE10+ specific styles ...

  8. 启动受管服务器出现:unable to get file lock, will retry...

    启动受管服务器出现:unable to get file lock, will retry... 解决方法:一.删掉Domain下的*.lok文件1. 删除edit.lok进入到domain_home ...

  9. 浅谈 原生javaScript&&react 实现全局触摸按钮(附带对addeventlistener的了解)

    1.采用原生javaACript 实现全局触摸按钮 首先在控制台输出,观察事件有哪些关于触摸的字段可以使用,然后拿这些字段的数据开始来写方法. 因为要做的是全局触摸按钮,我需要拿到的是按钮时时的坐标位 ...

  10. 利用Spring中同名Bean相互覆盖的特性,定制平台的类内容。

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...