在这里,我们将给大家分享关于c/c++/MFC调用js函数代码的知识,让您更了解c++调用js方法的本质,同时也会涉及到如何更有效地c–在MFC中的OnInitDialog函数之后是否有任何函数调用?
在这里,我们将给大家分享关于c/c++/MFC 调用 js 函数代码的知识,让您更了解c++调用js方法的本质,同时也会涉及到如何更有效地c – 在MFC中的OnInitDialog函数之后是否有任何函数调用?、c#调用mfc dll、C++中的mfc学习之MFC中全局变量的定义及使用(转)、C++做四则运算的MFC计算器(一)MFC界面创建的内容。
本文目录一览:- c/c++/MFC 调用 js 函数代码(c++调用js方法)
- c – 在MFC中的OnInitDialog函数之后是否有任何函数调用?
- c#调用mfc dll
- C++中的mfc学习之MFC中全局变量的定义及使用(转)
- C++做四则运算的MFC计算器(一)MFC界面创建
c/c++/MFC 调用 js 函数代码(c++调用js方法)
1 首先 .h 文件中定义:
2
3 CComPtr<IHTMLWindow2> m_sphtmlWnd;
4 CComPtr<IHTMLDocument2> m_spHtmlDoc;
5
6
7
8 //方法1 可以取得返回值。。。。。
9
10 //调用方法示例:stringArray为传入参数列表,getSum为js函数,pVarResult 为返回值
11
12 /* CStringArray stringArray;
13 stringArray.RemoveAll();
14 stringArray.SetSize(5);
15 stringArray[0].Format(L"%d",m_poiStart.x);
16 stringArray[1].Format(L"%d",m_poiStart.y);
17 stringArray[2].Format(L"%d",m_poiEnd.x);
18 stringArray[3].Format(L"%d",m_poiEnd.y);
19 stringArray[4].Format(L"%d",a + 1);
20 CComVariant pVarResult = CallJScript(L"getSum",stringArray);*/
21
22 bool Cems_MysqL_appView::GetJScript(CComPtr<Idispatch>& spdisp)
23 {
24 m_spHtmlDoc = (IHTMLDocument2*)(GetHtmlDocument());
25 if(m_spHtmlDoc == NULL)
26 {
27 return false;
28 }
29 HRESULT hr = m_spHtmlDoc->get_Script(&spdisp);
30 ATLASSERT(SUCCEEDED(hr));
31 return SUCCEEDED(hr);
32 }
33
34 CComVariant Cems_MysqL_appView::CallJScript(const CString strFunc,const CStringArray& paramArray)
35 {
36 //Getting Idispatch for Java Script objects
37 CComPtr<Idispatch> spScript;
38 if(!GetJScript(spScript))
39 {
40 return false;
41 }
42 //Find dispid for given function in the object
43 CComBSTR bstrMember(strFunc);
44 disPID dispid = NULL;
45 HRESULT hr = spScript->GetIDsOfNames(IID_NULL,&bstrMember,1,46 LOCALE_SYstem_DEFAULT,&dispid);
47 if(Failed(hr))
48 {
49 return false;
50 }
51
52 const int arraySize = paramArray.GetSize();
53 //Putting parameters
54 disPParaMS dispparams;
55 memset(&dispparams,sizeof dispparams);
56 dispparams.cArgs = arraySize;
57 dispparams.rgvarg = new VARIANT[dispparams.cArgs];
58 dispparams.cNamedArgs = 0;
59
60 for( int i = 0; i < arraySize; i++)
61 {
62 CComBSTR bstr = paramArray.GetAt(arraySize - 1 - i);
63 // back reading
64 bstr.copyTo(&dispparams.rgvarg[i].bstrVal);
65 dispparams.rgvarg[i].vt = VT_BSTR;
66 }
67 EXCEPINFO excepInfo;
68 memset(&excepInfo,sizeof excepInfo);
69 CComVariant vaResult;
70 UINT nArgErr = (UINT)-1; // initialize to invalid arg
71 //Call JavaScript function
72 hr = spScript->Invoke(dispid,IID_NULL,disPATCH_METHOD,&dispparams,&vaResult,&excepInfo,&nArgErr);
73 delete [] dispparams.rgvarg;
74 if(Failed(hr))
75 {
76 return false;
77 }
78 return vaResult;
79 }
80
81
82
83 //方法2
84
85 /*调用方法,不必多说。
86
87 CString str;
88 str.Format(L"getSum(%d,%d,%d)",m_poiStart.x,m_poiStart.y,m_poiEnd.x,m_poiEnd.y,a+1);
89 ExecScript(str);
90
91 */
92 HRESULT Cems_MysqL_appView::ExecScript(CString strjs)
93 {
94 HRESULT hr;
95 m_spHtmlDoc = (IHTMLDocument2*)(GetHtmlDocument());
96 if(m_sphtmlWnd == NULL)
97 {
98 hr = m_spHtmlDoc->get_parentwindow(&m_sphtmlWnd);//获取脚本指针
99 }
100 CComBSTR bstrjs = strjs.AllocSysstring();
101 CComBSTR bstrlan = SysAllocString(L"javascript");
102 VARIANT varRet;
103 hr = m_sphtmlWnd->execScript(bstrjs,bstrlan,&varRet);
104 //m_sphtmlWnd = NULL;
105 return 1;
106 }
107
c – 在MFC中的OnInitDialog函数之后是否有任何函数调用?
解决方法
如果要在创建线程之前在屏幕上显示对话框,可以使用ShowWindow
function手动显示它.例如:
ShowWindow(SW_SHOW); RedrawWindow();
另请参阅Raymond Chen的这篇文章:Waiting until the dialog box is displayed before doing something
c#调用mfc dll
mfc dll能不能被c#调用? 如果能的话,dll中的窗口注册函数AfxRegisterWndClass会出现断言错误。求解决方法。C++中的mfc学习之MFC中全局变量的定义及使用(转)
MFC中全局变量的定义及使用
用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。实际上有多种方法可以实现,这里只介绍两种方法。
一、在应用程序类中定义
用MFC生成的工程中都有一个名为CxxxApp的类,它派生于CWinApp类。这个类主要进行程序的初始化,生成文档、视图对象等工作。我们可以把需要全局访问的变量和函数定义为这个类的成员变量和成员函数,就可以实现全局访问了。
从严格意义上讲,这种变量和函数并不是全局的,因为它仍然只是类中的成员,只是由于我们很容易获得CxxxApp类的指针,所以我们可以在文档、视图、对话框以及各种自定义类中访问到它们,达到与全局变量类似的效果。访问时用函数“AfxGetApp()”获得CxxxApp类的指针,用“AfxGetApp()->成员”访问变量或函数。
例:
Test.h:(应用程序类头文件)
class CTestApp : public CWinApp
{
public:
int x; //全局变量
int f(int y); //全局函数
…………
};
Test.cpp:(应用程序类程序文件)
int CTestApp::f(int y) //全局函数定义
{
y++;
return y;
}
定义在CTestApp类中的变量和函数可以在其它类中被访问。比如在视图的某函数中要访问变量x和函数f():
void CTestView::xyz()
{
CTestApp *app = (CTestApp *)AfxGetApp(); //生成指向应用程序类的指针
app->x = 0; //访问变量x
int z = app->f(1); //访问函数f()
…………
}
这样,变量x和函数f()可以视作为全局的。
用这种方法实现的全局变量和全局函数虽比较简单,但也有缺点,一是访问不太方便,每次都需要获取应用程序类的指针;再就是把一些与应用程序类本身无关的变量和函数放在里面,使这个类看上去怪怪的,破坏了类的封装。
二、用静态变量和静态函数实现
很喜欢API函数的那种调用方法,不论在哪个类中只要用“::API函数”就可以调用了。合理利用静态类型(static)可以实现与此相似的全局变量和全局函数。
静态变量和静态函数有如下性质:
若在一个类中用关键字static声明数据成员,则这个数据成员就只存在一个拷贝,无论该类创建了多少个实例,它始终只存在一个,即使该类的实例一个也没创建,它也存在。
若在一个类中用关键字static声明函数,该函数可以用“类名::函数名”方式访问,无需引用该类的实例,甚至这个类的实例可以不存在。
利用这个性质实现的全局变量和函数使用起来很方便。
值得注意的是,全局变量和全局函数最好集中封装,不要在文档、视图等类内部定义,这样用起来才有全局的感觉。
例:
1、添加一个没有基类的新类,设类名起为CPublic,姑且称之为公用类
单击“Insert”菜单下的“New Class”命令,选择“Class type”为“Generic Class”,在“Name”栏中填入类名“CPublic”,单击“OK”,则新类建立完毕。
2、包含公用类的头文件,使各个类都能访问它
CPublic的头文件应包含在应用程序类的头文件中,这样在其它类中引用CPublic类时就不需要再包含了。
Test.h:(应用程序类头文件)
#include "Public.h" //包含公用类头文件
class CTestApp : public CWinApp
{
…………
};
3、在公用类中定义全局变量和全局函数,均使用static修饰,静态变量还必须在类外定义和初始化
Public.h:(公用类头文件)
class CPublic
{
public:
CPublic();
virtual ~CPublic();
public:
static int x; //全局变量
static int time; //全局变量
static int f(int y); //全局函数
…………
}
在公用类中对静态变量进行初始化和定义函数体:
Public.cpp:(公用类程序文件)
int CPublic::x = 0; //初始化全局变量
int CPublic::time; //定义全局变量
CPublic::CPublic()
{
}
CPublic::~CPublic()
{
}
int CPublic::f(int y) //全局函数,这里不要再加static
{
y++;
return y;
}
4、全局量的使用
使用变量:CPublic::变量名
使用函数:CPublic::函数()
如在视图的某函数中访问变量x和函数f():
void CTestView::xyz()
{
CPublic::x = 0; //访问变量x
CPublic::time = CPublic::f(1); //访问函数f()
…………
}
在其它类中访问x、time和f()的方法与此相同。
5、几点注意:
① 由于静态量可独立于类存在,不需要生成CPublic类的实例。
② 静态数据成员的定义和初始化必须在类外进行,如例中x的初始化;变量time虽然没有初始化,但也必须在类外进行定义。由于没有生成CPublic类的实例,所以它的构造函数和析构函数都不会被执行,在里面做什么工作都没有什么意义。
③ 如果静态函数需要访问CPublic类内的变量,这些变量也必须为静态的。因为非静态量在不生成实例时都不会存在。 如:
class CPublic
{
public:
int x; //内部变量
static int f(int y) //全局函数
{
x++;
return x;
};
…………
};
这里x虽为类内成员,但如果不生成CPublic类的实例,就会出现函数f()存在,而变量x不存在的问题。
总之,用没有实例的类管理全局量是一个不错的选择,它具有集中管理,使用方便的好处。当然,除非特别必要,全局量还是少用为好,一个好的编程者决不会随意滥用全局量的,一个封装做得不好的程序,在修改维护时会让你吃足苦头
C++做四则运算的MFC计算器(一)MFC界面创建
学习最有效的方法就是实战,这两篇文章写了做MFC加减乘除计算器的过程。
第一写前台MFC界面搭建,第二写后台计算原理及代码。
MFC编程参考教程:http://www.jizhuomi.com/school/c/149.html
第二篇文章链接:C++做四则运算的MFC计算器(二)栈转换和计算后缀表达式
搭建MFC项目
以VS2017为例,新建项目->MFC项目,写名字,设路径
应用程序类型,选择基于对话框的,其他默认即可,直到最后一步
生成的类选择Dlg
完成后,项目里会有很多自动添加的资源
.ico是图标,随便玩。
.rc和.rc2:rc2文件包含项目使用的附加资源的脚本文件。可以在项目的 .rc 文件的顶部包括 .rc2 文件。 .rc2 文件用于存放由多个不同项目使用的资源。不必为不同的项目多次创建相同的资源,而是可以将它们放在一个 .rc2 文件中,然后将该 .rc2 文件包括在主 .rc 文件中。双击都会调到资源视图,在这编辑界面。
Dialog就是主要编辑的地方,ABOUTBOX是帮主窗口,MFCCALCULATION_DIALOG是主要窗口
那怎么加东西呢?在工具箱里,工具箱一般在侧面的一个犄角格拉里,竖着的,里面有各种组件,感兴趣的玩玩看。
此处用button按钮、Edit Control编辑框和static text静态文本就够了。
把button拖到界面上,再按Ctrl拖能复制,数字0-9、+、-、*、/、(、)、删除、清空和 =,19个按钮。用参考线(格式->参考线设置)布局更方便。
右键按钮->属性,显示控件的各种属性,其中Caption属性是按钮的内容,写“1”按钮就显示“1”,窗口的Caption就是窗口的标题。每个控件的ID属性是独立的,用默认生成的就行,也可以自己编写。
按钮事件
“删除”按钮点一次删除一个字符,“清空”按钮就是清空,其他按钮每点一次,表达式编辑框就加一个字符
先为编辑框创建“值”变量、“控件”变量来控制内容,简单地理解:“值”给“控件”就会显示。右键表达式编辑器->添加变量
“值”类别是编辑框要现实的内容,名称为editv。再以同方法建“控件”类别的变量editc。
计算结果框也要有“值”变量和“控件”变量,分别是resultv、resultc。
接下来为每个按钮单击时显示到编辑框中。
双击按钮,自动添加单击事件的函数,并跳转到MFCcalculationDlg.cpp,
使用UpdateData(false)将变量值给控件,要反过来把false改成true,这个后面会用到。为每个按钮添加对应的函数。
实现删除使用editv = editv.Left(editv.GetLength() - 1),Left(n)取左边n个字符,editv.GetLength()取editv的长度,长度-1就删掉最后一个。
实现清空使用editv = "";
“=”的功能是将控件的值传给变量,再调用其他计算函数计算,把计算结果传给另一个编辑框中。在这里先实现显示计算表达式。
调试结果是这个样子的:
第二篇文章:C++做四则运算的MFC计算器(二)栈转换和计算后缀表达式
关于c/c++/MFC 调用 js 函数代码和c++调用js方法的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于c – 在MFC中的OnInitDialog函数之后是否有任何函数调用?、c#调用mfc dll、C++中的mfc学习之MFC中全局变量的定义及使用(转)、C++做四则运算的MFC计算器(一)MFC界面创建等相关内容,可以在本站寻找。
本文标签: