Windows Embedded Compact 7中的 COM编程(下)



13.4 建立ActiveX控件c++

13.4.1 ActiveX概述编程

ActiveX是Microsoft提出的一组使用COM技术来使软件部件在网络环境中进行交互的技术集,它与具体的编程语言无关。做为针对Internet应用开发的技术,ActiveX被普遍应用于WEB服务器以及客户端应用程序各个方面。服务器

vC++一般提供MFC和ATL(ActiveX Template Library)两个途径来开发ActiveX控件。使MFC开发ActiveX控件,能够没必要理会控件接口的细节,而把注意力集中在控件自己的功能上,可是生成的控件将比较大。并且,客户端若是要运行此ActiveX控件,必须拥有相应版本MFC类库的DLL,不然则必须同时下载这些巨大的类库;使用ATL开发ActiveX控件时,因为不涉及MFC的标准类库,于是生成的控件相对较小,但开发者必需要了解COM和OLE技术的细节。在这里,将主要介绍使用MFC开发ActiveX控制的方法,由于这种方法相对会比较容易。网络

若是使用MFC开发ActiveX控件,则能够用MFC ActiveX Control Wizard生成工程框架,vc++会自动产生三个类:(假设MyName是控件的名字)框架

·  CMyNameApp:从类COleControlModule派生,而类COleControlModule则派生自CwinApp。编程语言

·  CMyNameCtrl:从类COleControl派生,而类COleControl则派生自CWnd。编辑器

·  CMyNamePropPage:从类COlePropertyPage派生,而类COlePropPage则派生自CDial09。ide

能够看出,这个框架与通常的MFC应用程序有些相似。开发人员的大部分工做是在CMyNameCtrl中,经过为此类添加属性、方法来完成相应的功能。函数

在下面的一节中,就来介绍使用MFC向导建立一个简单的ActiveX控件的方法。组件化

13.4.使用MFC向导建立一个简单的ActiveX控件

本节所要建立的ActiveX控件并无什么实际的用处,它只是演示了使用MFC建立

ActiveX控件的方法过程,具体包括属性建立、方法建立以及事件建立等。在建立了ActiveX控件后,将使用VC++编写一个客户端程序,来演示如何在Windows CE下访问ActiveX控件。

1.使用MFC向导建立ActiveX

 (1)使用VS2008句导建立一个“MFC智能设备ActiveX控件”工程,将项目名称设为MyCEActiveX,而后按照默认设置完成向导。将编译环境设置yinchengos

 (2)为CMyCEActiveXCtrl类添加属性和方法。在类视图中,选中DMyCEActiveX接口,经过右键快捷菜单“添加”,来为ActiveX控件添加属性和方法,如图13-20所示。

 

    图13-20 ActiveX控件添加属性和方法

MFC ClassWizard对话框单击“添加属性”菜单,添加一个MsgContext属性,其类型为BSTR,如图13-21所示。

 

13-21  “添加属性向导对话框

单击“添加方法”,添加一个ShowMessage方法,该方法没有返回值。

 

13-22 “添加方法向导对话框

(3)实现属性和方法。

1)在CMyCEActiveXCtrl类里添加~个私有变量m_MsgContext,代码以下:

private

  CString m_MsgContext

2)修改属性实现代码,代码如程序清单。

BSTR CMyCEActiveXCtrl::GetMsgContext(void)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState());

 

// TODO: 在此添加调度处理程序代码

    return m_MsgContext.AllocSysString();

}

 

//设置MsgContext属性

void CMyCEActiveXCtrl::SetMsgContext(LPCTSTR newVal)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState());

 

// TODO: 在此添加属性处理程序代码

if (m_MsgContext.Compare(newVal) != 0 )

{

m_MsgContext = newVal;

//出发OnChange事件

OnMsgChange();

SetModifiedFlag();

}

}

   3)添加ShowMessage方法实现代码.    、

    void CMyCEActiveXCtrl::ShowMessage(void)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState());

 

    AfxMessageBox(m_MsgContext);

}

(4)编辑属性编辑框。

1)在资源编辑器中编辑属性对话框,设计界面如图13-23所示,将消息输入框标识为IDC EDT MSG。

 

l3-23编辑属性对话框

    2)为输入框控件添加关联变量m_Msg,类型为CString。这里还须要修改CmyCE ActiveX PropPage::DoData Exchange函数,实现消息输入框与控件的MsgContext属性关联。CmyCE ActiveX PropPage::DoData Exchange函数的实现以下:

    //cMycEActivexPropPage::DoDataExchange一在页和属性问移动数据

    void CMyCEActiveXPropPage::DoDataExchange(CdataExchange*pDX)

    {    

    DDP_Text(pDXIDC_EDT_MSGm_MsgL”MsgContext”)

    DDX_Text(pDXIDC_EDT_MSGm_Msg)

    DDP_PostProcesSing(pDX)

    }

    3)在CMyCEActiveXCtrl类的DoPropExchange方法里添加以下代码,用于关联属性,并初始化MsgContext属性值。PX—String(pPX,L”MsgContext”,m MsgContext,L”欢迎使用此Acitvex,呵呵”);至此,除事件之外,其余的功能都基本获得了实现。

 (5)添加事件。

在该示例中,将添加一个MsgContext属性被改变时的通知事件。该事件的实现也很简单,具体实现以下:

  1)在类视图中选择CMyCEActiveXCtrl类,经过右键快捷菜单“添加事件”来添加OnMsgChange事件该事件在属性MsgContext值发生变化时被触发。如图13-24

  2)修改SetMsgContext方法。在CMyCEActiveXCtrl类的SetMsgContext方法里,因MsgContext的值发生变化而触发OnMsgChange事件,其代码如下。

  void CMyCEActiveXCtrl::SetMsgContext(LPCTSTR newVal)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState());

 

// TODO: 在此添加属性处理程序代码

if (m_MsgContext.Compare(newVal) != 0 )

{

m_MsgContext = newVal;

//出发OnChange事件

OnMsgChange();

SetModifiedFlag();

}

}

 

 

图13-24事件向导

最后编译部署该项目,系统将自动远程注册此0CX。同时到这里MyCEActiveX控件也编写完成了,下面就介绍如何来使用该ActiveX控件。

2.应用ActiveX控件

在该节中,将编写Windows CE中的ActiveX测试程序,编写步骤以下所示。

 (1)使用vs2008智能设备IMFC智能设备应用程序向导建立一个基于对话框的应用程序MyCEActiveX ,编译环境设置为yinchengos.

注意:在向导对话框中,必定要选中“ActiveX控件复选框,表示应用程序支持ActiveX组件。

 (2)选择VS2008主菜单“项目添加类MFCActiveX控件中的MFC类,来添加MyCEActiveX控件的定义。

在“从如下来源添加类”项中选择“文件”单选框,而后指OCX的位置,将接口_DMyCEActiveX和_DMyCEActiveXEvents添加到“生成的类”列表中,单击“完成”按钮,就添加了MyCEActiveX控件的定义。如图13-25

 

图13-25类向导

 

打_DMyCEActiveX接口定义文件CDMyCEActiveX.h,因为经过向导建立的MyCEActiveX控件缺乏了访问MsgContext的属性方法,所以在CDMyCEActiveX.h中还须要添加GetMsgContext和SetMsgContext两个公有方法,以便访问属性。

CString GetMsgContext()

{

CString result;

GetProperty(0x1, VT_BSTR, (void*)&result);

return result;

}

 

void SetMsgContext(LPCTSTR propVal)

{

SetProperty(0x1, VT_BSTR, propVal);

}

 (3)为CMyCEActiveX_TestDlg类添加私有成员m_myCEActiveX,存储MyCEActiveX控件对象。

    private

    //定义MyCEActiveX控件对象

CDMyCEActiveX  m_myCEActiveX

CMyCEActiveXTestDlg::0nInitDialog()中建立MyCEActiveX对象,代码以下:

//建立MyCEActiveX控件对象

CRect rc(0,0,100,100);

m_myCEActiveX.CreateControl(m_myCEActiveX.GetClsid(), L" ", 

WS_VISIBLE,rc,this,5678,NULL,FALSE,NULL); 

 (4)在主对话框上添加一个按钮(IDC—BTN—TEST),在该按钮的单击事件中设置Activex

属性和调用ActiveX控件方法,代码以下:

    

//测试MyCEActiveX控件使用

void CMyCEActiveX_TestDlg::OnBnClickedBtnTest()

{

   m_myCEActiveX.SetMsgContext(L"欢迎使用Eric制做的ACTIVEX控件");

   m_myCEActiveX.ShowMessage();

}

 (5)实现MyCEActiveX控件的OnMsgChange事件。

首先在MyCEActiveX_TestDlg.h文件中添加OnMsgChangeMyceactivexctrl事件函数以及OLE COM事件映射宏。定义以下:

    //MycEActivex控件0nMsgChange事件

    afx_msg void onMsgChangeMyceactiVexctrl()

    //定义0LE COM事件映射

    DECLARE_EVENTS INK_MAP()

接着在MyCEActiveXTestDlg.cpp文件中添加OLE事件宏,用于关联ActiveX事件函数,具体实现以下:

    

BEGIN_MESSAGE_MAP(CMyCEActiveX_TestDlg, CDialog)

 

//}}AFX_MSG_MAP

ON_BN_CLICKED(IDC_BTN_TEST, &CMyCEActiveX_TestDlg::OnBnClickedBtnTest)

END_MESSAGE_MAP()

 

 

BEGIN_EVENTSINK_MAP(CMyCEActiveX_TestDlg, CDialog)

ON_EVENT(CMyCEActiveX_TestDlg, 5678, 1 /* OnMsgChange */, OnMsgChangeMyceactivexctrl, VTS_NONE)

END_EVENTSINK_MAP()

最后再来实现0nMsgChangeMyceactivexctrl函数,代码以下:

    //MyCEActiveX控件MsgContext属性被改变事件

void CMyCEActiveX_TestDlg::OnMsgChangeMyceactivexctrl() 

{

AfxMessageBox(L"MsgContext属性已被改变");

}

至此,就实现了MyCEActiveX控件的OnMsgChange事件,这其中主要包括3部份内容,经过逐层学习,就会很快理解ActiveX事件函数的实现机制了。

通过以上5个步骤,客户应用程序就编写完成了。把它下载到模拟器上运行以查看其运行效果。当单击按钮时,系统将会前后弹出“欢迎使用Eric制做的ACTIVEX控件”和MsgContext属性已被改变”提示框。

本示例只是粗略地介绍了使用MFC建立简单的ActiveX的方法,若是读者想要更深刻地了解ActiveX,则能够参考其余一些ActiveX书籍,来建立更加复杂和实用的ActiveX控件。

 

13.5小结

COM是由Microsoft提出的组件标准,它不只定义了组件程序之间交互的标准,并且还提供了组件程序运行所须要的环境。COM体现了组件化程序设计的思想,复杂的应用程序被设计成一些小的、功能单一的组件模型,这些组件模块能够在同一台计算机或者不一样的计算机上运行。本章的范例基本实现了Windows Embedded Compact 7用到的COM开发框架与简单实例,但愿读者认真编程实践。

相关文章
相关标签/搜索