CDHtmlDialog 与 网页交互技巧

From: http://blog.csdn.net/catxl313/article/details/2204541


CDHtmlDialog可以方便的将网页嵌入对话框,使得在程序设计中人机界面(DHTML网页)与控制逻辑(CDialog)可以很好的分离,下面是一些实用技术与技巧。

1.将数据验证任务完全交给JavaScript,Dialog只做有意义的事。

<input type="button" id="button1" onclick="if(validate()); window.event.cancelBubble=true;" /> 

这样,事件由IE处理之后,就不会将该事件传给其他事件句柄处理了,因为IE先于CDHtmlDialog处理该事件。

2.从CDHtmlDialog调用网页中JavaScript函数的方法。

其中pDoc指针参数可通过CDHtmlDialog::GetDHtmlDocument(&pDoc)函数获得;
strFunctionName指示函数名;
dispParams为传给函数的参数列表,其使用方法请查阅MSDN相关文档;
varResult为函数返回值;
exceptInfo为JavaScript函数执行时抛出的异常;
nArgErr返回第一个出错的参数的下标,由于参数列表中参数的逻辑顺序为JavaScript函数定义的参数的顺序的逆序,所以应特别注意该返回值所指示的具体位置。

HRESULT CallJSFunction(IHTMLDocument2* pDoc2,
                                 CString strFunctionName,
                                 DISPPARAMS dispParams,
                                 VARIANT* varResult,
                                 EXCEPINFO* exceptInfo,
                                 UINT* nArgErr )
{
    IDispatch 
*pDispScript = NULL;   
    HRESULT hResult;
    hResult 
= pDoc2->get_Script(&pDispScript);
    
if(FAILED(hResult))
   
{
        
return S_FALSE;
    }

    DISPID   dispid;   
    CComBSTR objbstrValue 
= strFunctionName;
    BSTR bstrValue 
=  objbstrValue.Copy();
    OLECHAR   
*pszFunct   =  bstrValue ; 
    hResult   
=   pDispScript->GetIDsOfNames(IID_NULL, 
                                                             
&pszFunct, 
                                                             
1,
                                                             LOCALE_SYSTEM_DEFAULT, 
                                                             
&dispid);   
    
if   (S_OK   !=   hResult)   
   

        pDispScript
->Release();   
        
return   hResult;   
    }
  

    varResult
->vt = VT_VARIANT;
    hResult   
=   pDispScript->Invoke(dispid,
                                              IID_NULL, 
LOCALE_USER_DEFAULT,
                                              DISPATCH_METHOD,
                                             
&dispParams,
                                              varResult,
                                              exceptInfo,
                                              nArgErr);  
    pDispScript
->Release();
    
return hResult;
}


3.CDHtmlDialog中JavaScript通过external调用C++方法。

<1>让CDHtmlDialog对象自身支持自动化

EnableAutomation();  //只要是从CCmdTarget派生下来的类都可以支持
                             
//可以放在CMyDHTMLDialog::CMyDHTMLDialog()中调用

<2>将自身暴露给Script引擎:

SetExternalDispatch(GetIDispatch(TRUE));    //将浏览器控件的扩展接口设置为对话框自身的IDispatch
                                                            
//放在CMyDHTMLDialog::OnInitDialog中调用

<3>声明DISPATCH_MAP(MyDHTMLDialog.h)

DECLARE_DISPATCH_MAP()

<4>定义DISPATCH映射(MyDHTMLDialog.cpp)

BEGIN_DISPATCH_MAP(CMyDHtmlDialog, CDHtmlDialog)
    DISP_FUNCTION(CMyDHTMLDialog, 
"Func1", Func1, VT_EMPTY, VTS_NONE) 
    
// example:
    
// DISP_FUNCTION(CMyDHTMLDialog,"Func2",TestFunc,VT_BOOL,VTS_BSTR VTS_I4 VTS_I4)
    
//                                                                        ^return,        ^parameters type list
    
//每个方法都需要在这里添加映射
END_DISPATCH_MAP()

<5>函数实现

void CMyDHTMLDialog::Func1()
{
    AfxMessageBox(_T("Func1 called!"));
}

<6>调用示例

<INPUT id="Button1" type="button" value="Button1" name="Button1" onclick="external.Func1();">



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 盘符 系统_001-Java再回首开篇-入门基础

来我们一起了解下java背景突然想着&#xff0c; 整理一套从基础开始的文章吧&#xff0c;对自己来讲是回顾基础和复习&#xff0c;对他人来讲&#xff0c;能有一点点绵薄的帮助&#xff0c;我也是很欣慰了呢&#xff0c;希望能帮你少走点弯路。自己整理的&#xff0c;如有勘误&…

js 如何去除字符两端的引号

通过js 提供的substring()就可以直接去除引号。&#xff08;注意是小写&#xff0c;和java不同&#xff09; var str JSON.stringify("sasasa"); console.log(str); var str str.substring(1,str.length-1); console.log(str);

asic面试题目 英伟达_免笔试!不限量!全球可编程图形处理技术领袖英伟达2021校园招聘火热进行中!...

关注并标星大同学吧每周1次&#xff0c;打卡阅读快速获取行业最新资讯秋意浓&#xff0c;渐微凉校招逐渐收尾不少同学陆陆续续开始签约还在观望决意不定的同学英伟达还没结束&#xff01;筹谋已久的英伟达2021校园招聘终于来啦&#xff01;拥有全世界最酷的AI计算机发明主办最顶…

C++真的能够王者归来吗?

From: http://blog.csdn.net/adwu73/article/details/7230048 C真的能够王者归来吗&#xff1f; 吴穹Adam 我个人认为不太可能&#xff01;因为不能光看C改进了什么&#xff0c;有什么优点&#xff1f;而要看环境&#xff0c;看对手&#xff01; 这篇博客不想写太长&#xff0c…

JTA的含义及应用简介

2019独角兽企业重金招聘Python工程师标准>>> Java Transaction API&#xff08;Java事务API&#xff09; (JTA)Java Transaction API(Application Programming Interface) 什么是JTA Transaction&#xff1f;它有怎样的特点呢&#xff1f;JTA Transaction是指由J2EE…

VC++ 深入详解 学习笔记(5) -- 修改窗口样式续

From: http://elton.iteye.com/blog/301503 之前说过&#xff0c; 修改窗口大小&#xff0c;窗口样式的方法。 这里说明一下修改窗口的图标&#xff0c;光标和背景的方法。 修改窗口大小&#xff0c;样式是在创建窗口的时候进行的&#xff0c;而修改图标&#xff0c;光标和背…

为CEDIT添加有颜色的边框

From: http://hi.baidu.com/dqf8/blog/item/56258ed62c658b2707088bb5.html 1、从CEDIT派生CMyEdit 2、添加代码&#xff1a; void CMyEdit::OnPaint() { CPaintDC dc(this); CPaintDC dc(this); // device context for painting // TODO: Add yo…

java 在数组末尾添加元素_Java快问快答:用 ArrayList 还是 LinkedList?

问题&#xff1a;通常我会这么定义列表&#xff1a;List<String> names new ArrayList<>()names类型使用List接口&#xff0c;那么具体实现该如何选择。 什么时候应该用LinkedList替代ArrayList&#xff0c;反之亦然&#xff1f;这里大家可以关注一下我的个人专栏…

手把手教你用好LINQ to SQL(1)

From: http://developer.51cto.com/art/200904/120915.htm 作者写下这篇文章的主要目的不是“一口吃成个胖子”让大家一次就学会LINQ to SQL。而是从不同的方面帮助大家正确理解&#xff0c;所以这里提到的快速的含义是提高效率&#xff0c;而不是单纯为了学习的速度。 最近接连…

esxi管理端口_网工知识角|一分钟轻松了解华为端口安全机制

学网络&#xff0c;就在IE-LAB国内高端网络工程师培养基地为防止MAC地址洪泛攻击&#xff0c;防止未经允许的设备访问网络&#xff0c;并增强安全性。通过端口安全机制&#xff0c;录连接到交换机端口的以太网MAC地址&#xff0c;只允许某个或者某些合法设备通过相应的端口进行…

VC设置CEdit控件背景透明、文字背景也透明

开发环境&#xff1a;VC6&#xff0c; a dialog based MFC application. 主界面&#xff1a; 为对话框添加WM_CTLCOLOR消息响应函数&#xff1a; HBRUSH CDDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {HBRUSH hbr CDialog::OnCtlColor(pDC, pWnd, nCtlColor);…

Taro+react开发(71):Taro.nextTick

Taro.nextTick(callback) 延迟一部分操作到下一个时间片再执行。&#xff08;类似于 setTimeout&#xff09; 说明 因为自定义组件中的 setData 和 triggerEvent 等接口本身是同步的操作&#xff0c;当这几个接口被连续调用时&#xff0c;都是在一个同步流程中执行完的&#xf…

led拼接屏报价_LED拼接屏的装饰

LED拼接屏外装饰工程是利用结构连接件或者粘结剂将装饰材料固定到钢结构框架的外部&#xff0c;使之达到一个美观大方的外形&#xff0c;并且达到防水(针对户外)等防护目的。LED屏的常用装饰的材料如下。(1)不锈钢一般装饰使用的不锈钢主要有亚光拉丝不锈钢、镜面不锈钢&#x…

Taro+react开发(72):Taro.createSelectorQuery

Taro.createSelectorQuery() 返回一个 SelectorQuery 对象实例。可以在这个实例上使用 select 等方法选择节点&#xff0c;并使用 boundingClientRect 等方法选择需要查询的信息。

电感检测_三、电感线圈的识别与检测(二)

变压器变压器也是一种电感器。它是利用两个 电感线圈靠近时的互感现象工作的&#xff0c;是电子产品中十分常见的元件。变压器是将两组或两组以上线圈绕在同一骨架上&#xff0c;并在绕好的线圈中插入铁芯或磁芯等导磁材料而构成&#xff0c;它在电路中起电压变换和阻抗变换等作…

Taro+react开发(73):Taro.createSelectorQuery

Taro.nextTick(() > {// 使用 Taro.nextTick 模拟 setData 已结束&#xff0c;节点已完成渲染Taro.createSelectorQuery().in(isH5 ? this : this.$scope).select(".dynamic-detail-content-text").fields({ size: true }).exec(res > {if (!res[0]) return;c…

ls mac 显示最近修改日期_Find Any File for Mac(Mac本地文件搜索工具)

今天小编给大家带来的Find Any File mac是Mac平台上的一款本地文件搜索查找工具&#xff0c;可以让你在本地磁盘上快速搜索、查找你需要的文件。甚至是隐藏文件都逃不出Find Any File mac的查询&#xff0c;并且支持以文件名称&#xff0c;建立或修改日期&#xff0c;大小&…