动态添加的ActiveX控件如何响应事件

OnCmdMsg标准处理流程 最近看了MFC 的Src,总结了下OnCmdMsg的实现方法。 阅读详情

http://blog.youkuaiyun.com/xiaoqiqixiao/article/details/574542

今天在csdn上看到一朋友问如何响应动态添加的控件的事件,搜索资料,发现对于一般的应用来说,使用ON_EVENT_RANGE就足以满足需要了,不过,还是希望能够更灵活的实现动态的响应,所以又经过对MFC源码一番探查,发现还是可以的,而且应该也不是很复杂的,下面分别来说说这两种方法

例程为Tdax,对话框程序,使用了Microsoft UpDown Control 6.0控件作为控件,添加了MouseDown事件

第一种方法挺简单的:
1.
缺省的映射定义为
BEGIN_EVENTSINK_MAP(CTdaxDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CTdaxDlg)
    ON_EVENT(CTdaxDlg, IDC_UPDOWN1, -605 /* MouseDown */, OnMouseDownUpdown1, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
    //}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

现改为

BEGIN_EVENTSINK_MAP(CTdaxDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CTdaxDlg)
    //}}AFX_EVENTSINK_MAP
    ON_EVENT_RANGE(CTdaxDlg, IDC_UPDOWN1, IDC_UPDOWN1+10, -605 /* MouseDown */, OnMouseDownUpdown1, VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4)
END_EVENTSINK_MAP()
就是说,可以映射至少11个控件(请注意,这里用了至少,也就是说可以少于11个,甚至于1个也无所谓)

a.这里建议把ON_EVENT_RANGE从
    //{{AFX_EVENTSINK_MAP(CTdaxDlg)
    ON_EVENT_RANGE(CTdaxDlg, IDC_UPDOWN1, IDC_UPDOWN1+10, -605 /* MouseDown */, OnMouseDownUpdown1, VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4)
    //}}AFX_EVENTSINK_MAP
对中拖出来,见上面例子,不拖出来不会对程序产生影响,但可能会影响后续的IDE操作,试试便知。
b.最后的参数类型中要在前面加上VTS_I4,即从VTS_I2 VTS_I2 VTS_I4 VTS_I4变为VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4,当然事件处理函数也将做相应调整,下面马上讲到。

2.
修改框架建立的事件处理函数
    void OnMouseDownUpdown1(short Button, short Shift, long x, long y);
改为
    BOOL OnMouseDownUpdown1(UINT nID, short Button, short Shift, long x, long y);
返回类型为void,应该也无所谓的,不过msdn上说是BOOL,咱就BOOL吧,但UINT nID这个参数是一定要加上的

3.做一些于本案无关的工作
a.在对话框编辑器中删掉原来的ID为IDC_UPDOWN1的控件
b.加一个成员变量CObList m_oaUpdowns;
c.在OnInitDialog中,加上
    UINT nID = IDC_UPDOWN1;
    CRect rect(10, 10, 20, 30);
    for(int i=0; i<11; i++){
        CUpDown* pupdown = new CUpDown;
        rect.OffsetRect(0, 20);
        pupdown->Create(NULL, WS_CHILD | WS_VISIBLE, rect, this, nID + i);
        m_oaUpdowns.Add(pupdown);
    }
d.在OnDestroy中,加上
    for(int i=0; i<m_oaUpdowns.GetSize(); i++){
        delete m_oaUpdowns[i];
    }
e.在OnMouseDownUpdown1中,加上
    CString str;
    str.Format("%d", nID);
    MessageBox(str);
用来指示是否收到事件

4.编译一下,可以发现,绝对OK

下面,我们来看更多灵活的方法:
观察MFC宏
BEGIN_EVENTSINK_MAP,END_EVENTSINK_MAP和ON_EVENT,可以发现MFC将控件ID,事件ID和事件处理函数等等信息都放在AFX_EVENTSINKMAP_ENTRY这个结构,每个映射一个这种结构,所有的结构组成一数组放在AFX_EVENTSINKMAP结构中,本来以为动态修改这两个结构信息,不就可以实现动态映射控件事件了,可惜发现MFC定义了
const AFX_EVENTSINKMAP_ENTRY theClass::_eventsinkEntries[] = 
{
...
}
可恶的const,只好另想它途了。
继续观察MFC源码,发现它中间会有一个
BOOL CCmdTarget::OnEvent(UINT idCtrl, AFX_EVENT* pEvent,
    AFX_CMDHANDLERINFO* pHandlerInfo)
{
...
}
函数中有如下代码
            VARIANT var;
            AfxVariantInit(&var);

            DISPPARAMS dispparams;
            dispparams.rgvarg = NULL;

            if (bRange)
            {
                memcpy(&dispparams, pEvent->m_pDispParams, sizeof(DISPPARAMS));
                dispparams.rgvarg = new VARIANT[++dispparams.cArgs];
                memcpy(dispparams.rgvarg, pEvent->m_pDispParams->rgvarg,
                    sizeof(VARIANT) * (dispparams.cArgs-1));
                VARIANT* pvarID = &dispparams.rgvarg[dispparams.cArgs-1];
                V_VT(pvarID) = VT_I4;
                V_I4(pvarID) = idCtrl;
            }

            hResult = CallMemberFunc(&pEntry->dispEntry, DISPATCH_METHOD, &var,
                (bRange ? &dispparams : pEvent->m_pDispParams), &uArgError);
            ASSERT(FAILED(hResult) || (V_VT(&var) == VT_BOOL));
            bHandled = V_BOOL(&var);

            if (bRange)
                delete [] dispparams.rgvarg;

            break;
好了,切入口找到了,就用这个CallMemberFunc了,唯一的问题就是重新组织这个函数所需的参数了。

开始:
1.为避免干扰,干脆注释掉OnInitDialog上一例中添加的代码,再加入如下代码:
    UINT nID = 10004;
    CRect rect(10, 10, 20, 30);
    for(int i=0; i<11; i++){
        CUpDown* pupdown = new CUpDown;
        rect.OffsetRect(0, 20);
        pupdown->Create(NULL, WS_CHILD | WS_VISIBLE, rect, this, nID + i);
        m_oaUpdowns.Add(pupdown);
    }
其实就改了一个nID,之所以改nID,是为了表示这个ID是可以你自己动态确定的,当然这里省事,将这些ID连在了一起,其实分开也是没问题的。

2.注释掉事件映射

BEGIN_EVENTSINK_MAP(CTdaxDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CTdaxDlg)
    //}}AFX_EVENTSINK_MAP
//    ON_EVENT_RANGE(CTdaxDlg, IDC_UPDOWN1, IDC_UPDOWN1+10, -605 /* MouseDown */, OnMouseDownUpdown1, VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4)
END_EVENTSINK_MAP()

3.重载对话框的OnCmdMsg,加入代码如下:
    if(nCode == CN_EVENT && nID >= 10004 && nID <= 10014){
        AFX_EVENT* pEvent = (AFX_EVENT*)pExtra;
        if(pEvent != NULL && pEvent->m_dispid == -605){//根据dispid来判断是否正确的事件
            AFX_DISPMAP_ENTRY e;
            e.lpszName = _T("");
            e.lDispID = -605;    //dispID,事件的dispID
            e.vt = VT_BOOL;        //返回类型
            e.pfn = (AFX_PMSG)OnMouseDownUpdown1;//事件处理函数
            e.pfnSet = (AFX_PMSG)0;
            e.nPropOffset = 0;
            e.flags = afxDispCustom;
            //下面是参数类型,如果事件处理函数不加控件ID的话,应该改为VTS_I2 VTS_I2 VTS_I4 VTS_I4
            e.lpszParams = VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4;

            UINT uArgError = (UINT)-1;    // no error yet
            VARIANT var;
            AfxVariantInit(&var);

            //如果需要每个控件的ID信息,应该为框架生成的事件处理函数的参数最前面加上1个UINT nID参数,代码如下:
            DISPPARAMS dispparams;
            dispparams.rgvarg = NULL;
            memcpy(&dispparams, pEvent->m_pDispParams, sizeof(DISPPARAMS));
            dispparams.rgvarg = new VARIANT[++dispparams.cArgs];
            memcpy(dispparams.rgvarg, pEvent->m_pDispParams->rgvarg,
                sizeof(VARIANT) * (dispparams.cArgs-1));
            VARIANT* pvarID = &dispparams.rgvarg[dispparams.cArgs-1];
            pvarID->vt = VT_I4;
            pvarID->intVal = nID;
            CallMemberFunc(&e, DISPATCH_METHOD, &var,
                    &dispparams, &uArgError);
            delete []dispparams.rgvarg;
            //如果不需要控件的ID信息,代码如下,不过函数就不用加上第1个参数(控件ID)了:
/*            CallMemberFunc(&e, DISPATCH_METHOD, &var,
                    (pEvent->m_pDispParams), &uArgError);*/
        }
        return TRUE;
    }
    return CDialog::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);

4.编译运行,OK了。


例程为Tdax,对话框程序,使用了Microsoft UpDown Control 6.0控件作为控件,添加了MouseDown事件

第一种方法挺简单的:
1.
缺省的映射定义为
BEGIN_EVENTSINK_MAP(CTdaxDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CTdaxDlg)
    ON_EVENT(CTdaxDlg, IDC_UPDOWN1, -605 /* MouseDown */, OnMouseDownUpdown1, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
    //}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

现改为

BEGIN_EVENTSINK_MAP(CTdaxDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CTdaxDlg)
    //}}AFX_EVENTSINK_MAP
    ON_EVENT_RANGE(CTdaxDlg, IDC_UPDOWN1, IDC_UPDOWN1+10, -605 /* MouseDown */, OnMouseDownUpdown1, VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4)
END_EVENTSINK_MAP()
就是说,可以映射至少11个控件(请注意,这里用了至少,也就是说可以少于11个,甚至于1个也无所谓)

a.这里建议把ON_EVENT_RANGE从
    //{{AFX_EVENTSINK_MAP(CTdaxDlg)
    ON_EVENT_RANGE(CTdaxDlg, IDC_UPDOWN1, IDC_UPDOWN1+10, -605 /* MouseDown */, OnMouseDownUpdown1, VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4)
    //}}AFX_EVENTSINK_MAP
对中拖出来,见上面例子,不拖出来不会对程序产生影响,但可能会影响后续的IDE操作,试试便知。
b.最后的参数类型中要在前面加上VTS_I4,即从VTS_I2 VTS_I2 VTS_I4 VTS_I4变为VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4,当然事件处理函数也将做相应调整,下面马上讲到。

2.
修改框架建立的事件处理函数
    void OnMouseDownUpdown1(short Button, short Shift, long x, long y);
改为
    BOOL OnMouseDownUpdown1(UINT nID, short Button, short Shift, long x, long y);
返回类型为void,应该也无所谓的,不过msdn上说是BOOL,咱就BOOL吧,但UINT nID这个参数是一定要加上的

3.做一些于本案无关的工作
a.在对话框编辑器中删掉原来的ID为IDC_UPDOWN1的控件
b.加一个成员变量CObList m_oaUpdowns;
c.在OnInitDialog中,加上
    UINT nID = IDC_UPDOWN1;
    CRect rect(10, 10, 20, 30);
    for(int i=0; i<11; i++){
        CUpDown* pupdown = new CUpDown;
        rect.OffsetRect(0, 20);
        pupdown->Create(NULL, WS_CHILD | WS_VISIBLE, rect, this, nID + i);
        m_oaUpdowns.Add(pupdown);
    }
d.在OnDestroy中,加上
    for(int i=0; i<m_oaUpdowns.GetSize(); i++){
        delete m_oaUpdowns[i];
    }
e.在OnMouseDownUpdown1中,加上
    CString str;
    str.Format("%d", nID);
    MessageBox(str);
用来指示是否收到事件

4.编译一下,可以发现,绝对OK

下面,我们来看更多灵活的方法:
观察MFC宏
BEGIN_EVENTSINK_MAP,END_EVENTSINK_MAP和ON_EVENT,可以发现MFC将控件ID,事件ID和事件处理函数等等信息都放在AFX_EVENTSINKMAP_ENTRY这个结构,每个映射一个这种结构,所有的结构组成一数组放在AFX_EVENTSINKMAP结构中,本来以为动态修改这两个结构信息,不就可以实现动态映射控件事件了,可惜发现MFC定义了
const AFX_EVENTSINKMAP_ENTRY theClass::_eventsinkEntries[] = 
{
...
}
可恶的const,只好另想它途了。
继续观察MFC源码,发现它中间会有一个
BOOL CCmdTarget::OnEvent(UINT idCtrl, AFX_EVENT* pEvent,
    AFX_CMDHANDLERINFO* pHandlerInfo)
{
...
}
函数中有如下代码
            VARIANT var;
            AfxVariantInit(&var);

            DISPPARAMS dispparams;
            dispparams.rgvarg = NULL;

            if (bRange)
            {
                memcpy(&dispparams, pEvent->m_pDispParams, sizeof(DISPPARAMS));
                dispparams.rgvarg = new VARIANT[++dispparams.cArgs];
                memcpy(dispparams.rgvarg, pEvent->m_pDispParams->rgvarg,
                    sizeof(VARIANT) * (dispparams.cArgs-1));
                VARIANT* pvarID = &dispparams.rgvarg[dispparams.cArgs-1];
                V_VT(pvarID) = VT_I4;
                V_I4(pvarID) = idCtrl;
            }

            hResult = CallMemberFunc(&pEntry->dispEntry, DISPATCH_METHOD, &var,
                (bRange ? &dispparams : pEvent->m_pDispParams), &uArgError);
            ASSERT(FAILED(hResult) || (V_VT(&var) == VT_BOOL));
            bHandled = V_BOOL(&var);

            if (bRange)
                delete [] dispparams.rgvarg;

            break;
好了,切入口找到了,就用这个CallMemberFunc了,唯一的问题就是重新组织这个函数所需的参数了。

开始:
1.为避免干扰,干脆注释掉OnInitDialog上一例中添加的代码,再加入如下代码:
    UINT nID = 10004;
    CRect rect(10, 10, 20, 30);
    for(int i=0; i<11; i++){
        CUpDown* pupdown = new CUpDown;
        rect.OffsetRect(0, 20);
        pupdown->Create(NULL, WS_CHILD | WS_VISIBLE, rect, this, nID + i);
        m_oaUpdowns.Add(pupdown);
    }
其实就改了一个nID,之所以改nID,是为了表示这个ID是可以你自己动态确定的,当然这里省事,将这些ID连在了一起,其实分开也是没问题的。

2.注释掉事件映射

BEGIN_EVENTSINK_MAP(CTdaxDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CTdaxDlg)
    //}}AFX_EVENTSINK_MAP
//    ON_EVENT_RANGE(CTdaxDlg, IDC_UPDOWN1, IDC_UPDOWN1+10, -605 /* MouseDown */, OnMouseDownUpdown1, VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4)
END_EVENTSINK_MAP()

3.重载对话框的OnCmdMsg,加入代码如下:
    if(nCode == CN_EVENT && nID >= 10004 && nID <= 10014){
        AFX_EVENT* pEvent = (AFX_EVENT*)pExtra;
        if(pEvent != NULL && pEvent->m_dispid == -605){//根据dispid来判断是否正确的事件
            AFX_DISPMAP_ENTRY e;
            e.lpszName = _T("");
            e.lDispID = -605;    //dispID,事件的dispID
            e.vt = VT_BOOL;        //返回类型
            e.pfn = (AFX_PMSG)OnMouseDownUpdown1;//事件处理函数
            e.pfnSet = (AFX_PMSG)0;
            e.nPropOffset = 0;
            e.flags = afxDispCustom;
            //下面是参数类型,如果事件处理函数不加控件ID的话,应该改为VTS_I2 VTS_I2 VTS_I4 VTS_I4
            e.lpszParams = VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4;

            UINT uArgError = (UINT)-1;    // no error yet
            VARIANT var;
            AfxVariantInit(&var);

            //如果需要每个控件的ID信息,应该为框架生成的事件处理函数的参数最前面加上1个UINT nID参数,代码如下:
            DISPPARAMS dispparams;
            dispparams.rgvarg = NULL;
            memcpy(&dispparams, pEvent->m_pDispParams, sizeof(DISPPARAMS));
            dispparams.rgvarg = new VARIANT[++dispparams.cArgs];
            memcpy(dispparams.rgvarg, pEvent->m_pDispParams->rgvarg,
                sizeof(VARIANT) * (dispparams.cArgs-1));
            VARIANT* pvarID = &dispparams.rgvarg[dispparams.cArgs-1];
            pvarID->vt = VT_I4;
            pvarID->intVal = nID;
            CallMemberFunc(&e, DISPATCH_METHOD, &var,
                    &dispparams, &uArgError);
            delete []dispparams.rgvarg;
            //如果不需要控件的ID信息,代码如下,不过函数就不用加上第1个参数(控件ID)了:
/*            CallMemberFunc(&e, DISPATCH_METHOD, &var,
                    (pEvent->m_pDispParams), &uArgError);*/
        }
        return TRUE;
    }
    return CDialog::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);

4.编译运行,OK了。
【VS开发】动态添加的ActiveX控件如何响应事件 http://blog.youkuaiyun.com/xiaoqiqixiao/article/details/574542 今天在csdn上看到一朋友问如何响应动态添加的控件的事件,搜索资料,发现对于一般的应用来说,使用ON_EVENT_RANGE就足以满足需要了,不过,还是希望能够更灵活的实现动态的响应,所以又经过对MFC源码一番探查,发现还是可以的,而且应该也不是很复杂的,下面分别来说说这两种方法 阅读详情

相关推荐

LabVIEW中的ActiveX控件应用指南

在现代自动化系统开发中,LabVIEW作为一种广泛使用的图形化编程语言,提供了强大的互操作性。而ActiveX技术作为Windows平台的一个重要组成部分,使得LabVIEW能够轻松地与各种ActiveX兼容的应用程序交互。本章将介绍ActiveX控件在LabVIEW中的应用,以及如何通过这些控件扩展LabVIEW的功能。ActiveX是由微软公司提出的一种技术,它允许软件组件通过网络进行交互,这包括了诸如COM(组件对象模型)组件,自动化服务器等。

weixin_34620658的博客 1457

OnCmdMsg 处理程序

为完成命令传送过程,序列中的每一个命令目标依次调用下一个命令目标的 OnCmdMsg 成员函数。命令目标使用 OnCmdMsg 确定是否能处理某一命令,如不能处理,则将命令传送到下一个命令目标。 每一个命令目标类可以重写 OnCmdMsg 成员函数。通过重写,每一类将命令传送到下一个特定目标。例如,框架窗口总是将命令传送到其当前子窗口或视图,如表标准命令路由所示。 OnCmdMsg 的默认

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 1358

Matlab2018a崩溃解决的办法No sandbox or build area path

Matlab 2018a (No sandbox or build area path)出现崩溃后需要使用terminal进行如下操作: cd /home/david/MySoft/MATLAB/R2018a/bin/glnxa64 (你的matlab路径) mkdir exclude mv libfreetype* exclude/ 执行后图片如下: 如果你用的Windows系统,请手动按照上面步骤剔除了dll。 Matlab 2018a (No sandbox or build are

David Xiao 1万+

OnCmdMsg

virtual BOOL OnCmdMsg(       UINT nID,       int nCode,       void* pExtra,       AFX_CMDHANDLERINFO* pHandlerInfo      ); 返回值:如果消息被处理了,则返回非零值;否则为0。 参数: nID 命令的ID。 nCod

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 3899

OKCC呼叫中心部署实战指南:从零搭建高效外呼系统

本文提供OKCC呼叫中心系统的完整部署实战指南,从服务器选型、操作系统准备到详细安装步骤和性能优化,帮助企业从零搭建高效外呼系统。重点介绍FreeSWITCH核心组件的安装配置技巧,以及常见问题排查方法,助力企业提升客户服务效率。

weixin_29275257的博客 163

Windows下用RKDevTool解包update.img的完整流程(含常见错误排查)

本文详细介绍了在Windows系统下使用RKDevTool工具解包update.img固件的完整流程。从工具准备、环境搭建到逐步解包操作,重点解析了输出文件结构,并提供了修改分区后重新打包的实战方法。文章还针对解包失败、打包错误等常见问题提供了详细的排查与解决方案,旨在帮助嵌入式开发者和爱好者高效完成固件分析与定制工作。

aa123的博客 716

动态添加的ActiveX控件如何响应事件 .

今天在csdn上看到一朋友问如何响应动态添加的控件的事件,搜索资料,发现对于一般的应用来说,使用ON_EVENT_RANGE就足以满足需要了,不过,还是希望能够更灵活的实现动态的响应,所以又经过对MFC源码一番探查,发现还是可以的,而且应该也不是很复杂的,下面分别来说说这两种方法

http://www.softwareace.cn 王牌软件 644

卷积神经网络-猫狗识别(附源码)

利用python实现一个卷积神经网络,训练猫狗数据集,实现对猫狗图片的预测识别

m0_63223213的博客 2万+

对话框容器环境响应Active控件事件 动态创建ActiveX

1 在对话框面板上静态添加ActiveX控件 在对话框面板上 右键->Insert ActiveX control 在控件的属性中 添加对控件的事件响应(要求编写ActiveX控件的时候已经添加了事件) 2 动态添加Active控件 以及响应事件 首先添加ActiveX控件类 在Dlg.h中 #include "CDMy0705B.h"

mfmfmmf1的专栏 811

SPI 总线信号完整性与时序一致性测试

SPI总线测试的核心目标是验证其电气与时序行为是否满足芯片规格要求,确保通信可靠性

硬核科技 328

PCL 法向量夹角剔除错误匹配点对【2026最新版】

实现了一种简单的基于对应点法线角度的对应关系去除方法。博客长期更新,本文最新更新时间为:2026年5月24日。

点云侠的博客 41万+

mfc编程 孙鑫_MFC(ActiveX编程,孙鑫C++第十八讲笔记整理)

一:在VB中调用X控件,添加方法project->Add components。另外可以用Object Browser来查看控件二:在VC中创建X控件1.新建一个X工程名为Clock,注意一个文件中可以包含多个控件。2.保持缺省设置,完成。注意它生成的三个类,以及相关的接口。3.运行它。选择TSTCON32.exe作为容器。4.选择Insert Control,此时我们可以看到,它画了一个椭...

weixin_42298881的博客 611

实例详解C++程序的五大内存分区

本文详细讲述C++程序在运行时的5大内存分区。 下面使用日常开发中的编程实例,详细介绍一下这5个分区,以便大家能更深刻的理解这5大内存分区。 1、栈内存区 栈内存区是我们用的最多的分区,只要有函数的地方都会使用到这个分区。栈分区是用来存放函数参数及函数局部变量值的内存区,是由编译器在编译时自动分配和释放的。 函数中的参数与函数中的局部变量占用的内存是代码执行到函数(进入函数)是分配的,在............

dvlinker的技术专栏 1万+

如何用ATL创建ActiveX控件

演示截图: 代码简介或代码解析:         如何用ATL创建ActiveX控件 实现了一个ActiveX控件,它在一个圆内部有个正多边形,当用户在多变形内部单击将会使多边形的边数在当前的基础上+1,在多变形外部单击将会使多边形的边数在当前的基础上-1,并能改变多边形的颜色.最后举了两个例子说明了如何使用这个刚刚生产得控件.一个是把该控件应用到网页中,一个则是用于一个

Augusdi的专栏 3885

【STK】手把手教你利用STK进行覆盖分析02-生成详细分析报告和图表

这篇文章主要针对上一篇文章中最后的案例1进行进一步的说明,详细介绍我们可以生成哪些结论性的成果。STK的Coverage模块的生成结果包括分析报告和图表两种样式,每种样式还分为动态和静态两种,也就是说,我们做完一个STK覆盖场景的仿真后,一般可以生成静态分析报告、动态分析报告、静态分析图表和动态分析图表这4种形式的分析成果,下面进行详细介绍。我们在选择了想要分析的区域或者点后,就可以利用CovDef生成分析报告了,覆盖定义的分析报告分为静态报告和动态报告两种,下面分析进行介绍: 首先我们先在左侧目标浏览器C

weixin_44184852的博客 3441

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

WTL for MFC Programmers, Part VI - Hosting ActiveX Controls

原作 :Michael Dunn [英文原文] 翻译 :Orbit(桔皮干了) [http://www.winmsg.com/cn/orbit.htm] 下载演示程序代码 本章内容 介绍 从使用向导开始 建立工程 自动生成的代码 使用资源编辑器添加控件 ATL中使用控件的类 CAxDialogImpl AtlAxWin和CAxWindow 调用控件的方法

学习,思考,记录 586

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

如何向VS2010中插入ActiveX控件并且附带相应的类

上两篇文章中我们已经讲述了ActiveX控件的一些相关知识,本文中,简单说明一下如何在我们自己的程序中使用ActiveX控件。(仍以我们上节课的例子为例)   我们打开VS2010编辑器,新建一个基于对话框的MFC应用程序,名字取为“ActivexTest” 在这里介绍两种在我们自己程序中插入ActiveX的方法 (1)      我们可以在对话框面板上“右键”->“插入ActiveX控件

追尋ゝ 7589

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VB动态加载ActiveX控件并响应事件

熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控件极大地方便了编程,但唯一的缺陷是不能动态加载控件,必须在设计时通过引用,将控件放置在窗体上。VB6.0已能够解决该问题,只是帮助中没有明确说明,并且没有描述到一些关键功能,由于以前的版本中可以动态创建进程外服务:如果对象是外部可创建的,可在 Set 语句中用 New 关键字、CreateObject 或 GetObject 从部件外面将对

Derry的专栏 4852

在ATL无窗口ACTIVEX控件中响应timer消息

  最近,在尝试着写一个能够显示静态和动态图片的ACTIVEX控件,就像QQ的一样,能插入到RICHEDIT控件中。由于只是在尝试,很多功能都没有实现,只实现显示。如果单单显示静态图片,是很简单的。但要是显示动态GIF图片,就有一定的难度,首先要分析图片的帧数,还要控件图片按顺序显示。如果写成控件,还要保证插入到RICHEDIT控件中还能动起来,就更有难度了,因为ATL在响应TIMER事件的时候有

水妖的专栏 9602

在DHTML中响应ActiveX控件的事件

ActiveX控件可以用连接点创建事件,此事件可以在DHTML网页中被javascript函数处理,在js中响应ActiveX控件事件的方法如下:1. 静态创建方法      function  OnEvent1() { }                    codeBase="myControl.cab"                                  classi

ConeZXY的专栏 2709
上一篇: ON_EVENT_RANGE的使用方法
下一篇: 正被停用的激活上下文不是最近激活的
embededvc
博客等级 码龄21年 176粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值