vs 2005/2008中ActiveX控件的使用

转载自:一片云雾(博客园)

2004年以前,自己曾经大量使用过ActiveX控件。由于当时使用的VC6对ActiveX的支持很好,使用起来很方便,而且ActiveX控件本身就是一个MFC的窗口,有自己的消息循环。而当年自己的技术水平还不够成熟,不知道有回调函数的存在。因此能够对外触发事件通知的ActiveX控件一度是我的最爱。而后来,随着自己水平的提升,对功能的分解不再依赖于动态库、ActiveX控件等客观因素,而是通过主动的功能接口规划来进行。而且为了追求产品的部署简易性,一度爱不释手的ActiveX被我打入冷宫多年。

直到有一天,我的一个产品需要改造为在Web中能够使用,我于是又想起尘封已久的ActiveX,而多年过去手中的编译环境已经是进化到了VS2005了(而今更是用上了VS2008、VS2010)。一番尝试之下,发现在VS2005之后,ActiveX的使用方法已经和VC6很不一样了。由于过程还不是那么简单,于是我整理了一份文档,记录下一些使用方法。昨天新开了blog,我想起把这篇文章放到blog上来,比放在电脑上某个角落,然后需要的时候再翻箱倒柜地寻找要强。我写这篇文档时,用的是VS2005,刚才我特意测试了一下VS2008,操作过程基本一样。

无论ActiveX控件有多少缺点或不便,而要在web网页中随意使用MFC来做自己的事情,ActiveX控件依旧是唯一的选择。

不说废话了,VS2005中ActiveX的使用基本使用过程如下:

1 建立ActiveX工程

使用MFC的工程建立向导,建立一个ActiveX工程,此处我建立的工程名为“testX”。如果需要,可以自己修改向导过程中的一些属性。工程建立后,类视图如下。

2 为控件添加接口函数

如上图所示,可以通过右键点击“_DtestX”来添加对ActiveX控制的函数。ActiveX控件的使用者可以通过这些函数来控制和访问ActiveX控件。

(如果把ActiveX控件当作一个黑盒子,通过这些接口函数,你可以向其发消息。)

3 为控件添加触发事件

如上图所示,可以通过右键点击“_DtestXEvents”来添加ActiveX事件。ActiveX控件可以通过这些事件,向使用者反馈信息。

(黑盒子通过这个接口,来对外反馈消息。)

这儿我添加一个ActiveX事件,函数形如“LONG TestEvent(LONG nValue, BSTR strValue);”。

4 在ActiveX控件中触发事件

可以通过以下形式在ActiveX控件中触发事件:

(下面讲的是在控件类如何通过接口对外反馈消息。)

FireEvent(dispidTestEvent, EVENT_PARAM(VTS_I4 VTS_BSTR), nValue, strValue);

上面的EVENT_PARAM的参数,可以参考“DISP_FUNCTION_ID(CtestXCtrl, "TestEvent", dispidTestEvent, TestEvent, VT_I4, VTS_I4 VTS_BSTR)”的最后一个参数,这句代码是向导自动生成的。

5 ActiveX使用者添加更新控件类

在一个普通工程中,可以通过在工程中添加类的方式,弹出如下对话框:

然后添加类到工程,如下:

如果在使用过程中,ActiveX控件接口发生了变化,可以通过删除该类的文件,然后重新添加该类以便达到目的。

6 ActiveX使用者使用ActiveX控件

在VS2005里面,对ActiveX控件的使用就和普通控件一样了,添加变量和添加事件都是一样。这些操作同VC6.0中也是类似的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要在项目引用VSFlexGrid件的类型库。打开项目,在“解决方案资源管理器”右键单击“引用”,选择“添加引用”选项,然后在“COM”选项卡找到VSFlexGrid件的类型库并添加。 接下来,创建一个包装器类来封装VSFlexGrid件。可以使用C++/CLI编写此类。以下是一个简单的示例: ```cpp using namespace System::Windows::Forms; using namespace AxVSFlexGridLib; public ref class VSFlexGridWrapper { private: AxVSFlexGrid^ m_vsFlexGrid; public: VSFlexGridWrapper(Control^ parent) { m_vsFlexGrid = gcnew AxVSFlexGrid(); parent->Controls->Add(m_vsFlexGrid); // 设置件属性 m_vsFlexGrid->Dock = DockStyle::Fill; m_vsFlexGrid->AllowUserResizing = flexResizeBoth; } // 封装一些VSFlexGrid件的方法 void SetTextMatrix(int row, int col, String^ text) { m_vsFlexGrid->SetTextMatrix(row, col, text); } // 封装一些VSFlexGrid件的属性 property int Rows { int get() { return m_vsFlexGrid->Rows; } void set(int value) { m_vsFlexGrid->Rows = value; } } property int Cols { int get() { return m_vsFlexGrid->Cols; } void set(int value) { m_vsFlexGrid->Cols = value; } } property bool Visible { bool get() { return m_vsFlexGrid->Visible; } void set(bool value) { m_vsFlexGrid->Visible = value; } } }; ``` 在上面的代码,我们创建了一个名为“VSFlexGridWrapper”的类,并在构造函数创建了一个AxVSFlexGrid件的实例。我们还封装了一些VSFlexGrid件的属性和方法,以便在外部使用时更方便。 假设我们已经在窗体上放置了一个Panel件,并将其命名为“panel1”,可以使用以下代码将VSFlexGrid件添加到该Panel: ```cpp VSFlexGridWrapper^ vsFlexGridWrapper = gcnew VSFlexGridWrapper(panel1); vsFlexGridWrapper->Visible = true; vsFlexGridWrapper->Rows = 5; vsFlexGridWrapper->Cols = 3; vsFlexGridWrapper->SetTextMatrix(1, 1, "Hello, world!"); ``` 在这个例子,我们首先创建了一个VSFlexGridWrapper对象,并将其添加到panel1。然后我们设置了一些VSFlexGrid件的属性,最后使用SetTextMatrix方法设置了第二行第二列的单元格的文本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值