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,一经查实,立即删除!

相关文章

查看NTFS文件系统版本号

fsutil fsinfo ntfsinfo c:转载于:https://blog.51cto.com/liushen/269304

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

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

[react] react的虚拟DOM和vue的虚拟DOM有什么区别?

[react] react的虚拟DOM和vue的虚拟DOM有什么区别&#xff1f; React 是数据先生成 vdom&#xff0c;然后对比 vdom&#xff08;实现上并非先后顺序&#xff0c;两棵树边遍历边生成新的树&#xff09;&#xff0c;最后通过新的 DOM 树渲染。 Vue 是数据先进性对比&#xff0c;先…

( 设计高效算法 ) 年龄排序 Age Sort Uva 11462

( 设计高效算法 ) 年龄排序 Age Sort Uva 11462 可以使用整数排序法, 内存太小无法堆排序. #include <cstdio> #include <cstring> using namespace std;int main(){unsigned int age[101];int n,temp;while (scanf("%d", &n) 1 && n){mems…

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);

如何在string.Format方法中输出大括号({})

C#(a.cs) using System;public class Test {public void Middle(string start, string end){string pat1 string.Format("(?<{0}).*(?{1})", start, end);Console.WriteLine(pat1);string pat2 string.Format("(?<{{0}}).*(?{{1}})", start, e…

Linux source用法(转)

source命令用法&#xff1a; source FileName作用:在当前bash环境下读取并执行FileName中的命令。注&#xff1a;该命令通常用命令“.”来替代。如&#xff1a;source .bash_rc 与 . .bash_rc 是等效的。source命令(从 C Shell 而来)是bash shell的内置命令。点命令&#xff0c…

[react] 解释下react中component和pureComponent两者的区别是什么?

[react] 解释下react中component和pureComponent两者的区别是什么&#xff1f; 组件的state或者props更新都会触发render(),同时也会导致子组件render()重新渲染&#xff1b; 当我们不想子组件更新时&#xff0c;需要手动在shouldUpdateComponent当中返回false; pureComponent帮…

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

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

Linux 重命名文件和文件夹

linux下重命名文件或文件夹的命令mv既可以重命名&#xff0c;又可以移动文件或文件夹. 例子&#xff1a;将目录A重命名为B mv A B 例子&#xff1a;将/a目录移动到/b下&#xff0c;并重命名为c mv /a /b/c转载于:https://www.cnblogs.com/sallet/p/4268858.html

将HTMLDOM对象转换成字符串

将HTMLDOM对象转换成字符串 js实现文字播放

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…

电脑表格日期怎么修改原有日期_为何电脑系统时间常出错或无法修改?怎么解决?...

简介电脑系统出现的问题可谓层出不穷&#xff0c;千奇百怪。这不&#xff0c;有朋友就遇到电脑系统时间无法修改或者修改后很快就出错的问题&#xff0c;而且有时候在修改时会出现“没有权限&#xff0c;无法更改”的类似信息。这是怎么回事呢&#xff1f;首先我们得知道问题产…

JS实现数组、对象去重的几种常用方式

JS实现数组、对象去重的几种常用方式

DOM--5 动态修改样式和层叠样式表

W3C DOM2 样式规范 CSSStyleSheet对象 表示所有css样式表&#xff0c;包括外部link和嵌入style的;通过document.styleSheets属性可以获得文档中CSSStyleSheet对象的列表&#xff1b;其中每个CSSStyleSheet都具有以下属性&#xff1a; type: 值始终是text/css;disabled: 布尔值&…

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

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

×××常见问题原因与解决

服务器什么地方可能出现故障当客户端与某个ISP建立连接时&#xff08;这种连接使用连接中的点对点协议--PPP--部分&#xff09;&#xff0c;ISP将为客户端分配一个IP地址、一个DNS服务器地址以及一个缺省网关。当客户端发起一个PPTP连接时&#xff0c;这项操作将创建第二个TCP/…

报错解析 [Vue warn]: You may have an infinite update loop in a component render function.

报错解析 [Vue warn]: You may have an infinite update loop in a component render function.