已阅读5页,还剩61页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
控件开发调试说明文档 2015 5 8 目录目录 1 创建控件项目 1 2 生成并测试控件 6 3 事件 10 3 1 常用事件 10 3 2 自定义事件 13 4 方法 18 4 1 常用方法 18 4 2 自定义方法 25 5 属性 30 5 1 常用属性 30 5 2 自定义属性 33 5 3 成员变量属性 33 5 4 GET SET方法型属性 37 6 属性页 39 6 1 使用默认属性页 40 6 2 添加其他自定义属性页 43 6 3 常用属性页 45 7 如何注册 OCX 控件 47 2 66 7 1 32 位系统 47 7 2 64 位系统注册 32 位文件 48 8 带窗体的 OCX 控件 48 8 1 建立带窗体的 OCX 控件 48 8 2 完成程序与窗体控件的信息交互 52 9 VS2008 控件程序调试工具路径选择 54 10 程序遇到的问题和解决办法 54 1 66 基于 MFC 的 ActiveX 控件开发 ActiveX 控件是基于组件对象模型 COM 的可重用软件组件 广泛应用于桌面及 Web 应用中 在 VC 下 ActiveX 控件的开发可以 分为三种 一种是直接用 COM 的 API 来开发 这样做显然非常的 麻烦 对程序员要求也非常高 因此一般是不予考虑的 一种是基 于传统的 MFC 采用面向对象的方式将 COM 的基本功能封装在若 干 MFC 的 C 类中 开发者通过继承这些类得到 COM 支持功能 MFC 为广大 VC 程序员所熟悉 易于上手学习 但缺点是 MFC 封 装的东西比较多 因此用 MFC 开发出来的控件相对会比较大 因此 比较适于开发桌面 ActivexX 控件 尤其是有 GUI 界面的控件 第 三种就是基于 ATL 的 ATL 可以说是专门面向 COM 开发的一套框 架 使用了 C 的模板技术 在运行时不需要依赖于类似 MFC 程序 所需要的庞大的代码模块 更适合于 Web 应用开发 本文介绍的是采用第二种方式 即应用 MFC 进行桌面可视控件 开发的方法步骤 开发环境则是基于 VC2005 1 创建控件项目创建控件项目 打开 VC2005 后 我们要先创建一个项目 在新建项目页的左 侧选择 Visual C MFC 在右侧选择 MFC ActiveX 控件 填上解决 方案和项目名称 比如在这里我的项目名称是 activexdemo1 解决 方案名称是 activexdemo 2 66 然后进入控件向导页 在向导的第二页有个运行时许可证 选 中这个的话会在生成控件的同时生成一个许可证文件 其他用户在 使用这个控件的时候必须同时附有这个许可证 在此我们保持默认 状态 不选 3 66 下一页是关于项目中各部分的命名问题 可以根据需要自定义 这里就按默认的情况不做修改了 下一页是选择控件基于哪种控件的扩展以及控件的一些基本特 性 如果新建的控件是基于某种特定控件的话 就在创建的控件基 于下选择所要继承的控件名 否则就保持 none 下方的附加功能根 据实际需要进行选择 并且可以将鼠标放置于选项上方 功能的说 明会自动显示在动态出现的小提示信息窗口中 选择完毕点击完成 向导就根据你的选择生成新项目 4 66 进入开发环境 我们可以先看一下类视图 5 66 其中的 Cactivexdemo1 cpp 是我们这个控件的主程序模块 定义 了控件的注册 DllRegisterServer 删除 DllUnregisterServer 等 功能 一般不用动 如有需要我们可以在其中的 InitInstance 和 ExitInstance 中定义我们自己的初始化和终止操作代码 一般也就是 一些资源的初始化和销毁工作 Caxtivexdemo1Ctrl 是控件类 我们要做的控件功能基本上就是 要在这个类中实现 需要提一下的是在这个类中重写了父类的 OnDraw 函数 有如 下两句代码 pdc FillRect rcBounds CBrush FromHandle HBRUSH GetStockObject WHITE BRUSH pdc Ellipse rcBounds 也就是在控件上画了一个椭圆 实际控件开发中可以根据功能 需要修改重写这个函数来绘制控件界面 Caxtivexdemo1PropPage 是属性页类 这个类实现了一个在开发 时设定控件属性的对话框 activexdemo1Lib 是为客户程序提供本控件的属性 方法以及可 能响应的事件的接口的库节点 在添加控件的这些功能的时候会用 得到 设置项目属性将配置类型设置成静态库 lib 6 66 2 生成并测试控件生成并测试控件 好 现在我们就可以先来生成一下这个项目 当然到目前我们 只是用系统自动生成的一个控件项目 什么功能都没有 只是一个 空框架 几秒钟后 项目应该是顺利生成 控件也被自动注册到系统中 去 那怎么才能测试一下这个控件呢 当然你可以再建个新项目 比如一个对话框程序 在对话框资源编辑窗口中右边的工具箱里鼠 标右键菜单里点选择项 7 66 从弹出窗口中的 COM 组件下找到我们刚刚生成的这个控件 打勾选中 然后在工具箱里就会出现这个控件 8 66 然后用鼠标拖到对话框里就能用这个控件了 除了这种方法 VS 还提供了一种简便的控件测试工具 在 VisualStudio 中菜单的工具下有个 ActiveX 控件测试容器 在工具栏里点新控件按钮 9 66 在插入控件对话框中找到并选择我们的这个控件 然后就能在这个容器中测试控件的各种功能了 10 66 3 事件事件 ActiveX 控件使用事件通知容器控件上发生了某些事情 事件 的常见示例包括单击控件 使用键盘输入数据和控件状态更改 当 发生这些操作时 控件将引发事件以提醒容器 MFC 支持两种事件 常用和自定义 常用事件是 COleControl 类自动处理的事件 自定义事件使控件得以在该控件特定的操作发 生时通知容器 控件内部状态发生更改或收到某个窗口消息即属于 此类事件 3 1 常用事件常用事件 常用事件由 COleControl 类自动引发 COleControl 包含预定 义成员函数 它们引发常见操作所导致的事件 一些由 COleControl 实现的常见操作包括单击和双击控件 键盘事件和鼠 标按钮状态发生更改 11 66 添加常用事件的操作是在类视图中右击 ActiveX 控件类 比如 在此例中就是 Caxtivexdemo1Ctrl 在菜单中选择添加事件 打开添 加事件向导 在添加事件向导中的事件名称中选择 Click 也就是鼠标点击事 件 添加到控件中 然后再选中类视图中库节点下的第三个节点 也就是 Dactivexdemo1Events 在下面就能看到我们刚刚添加的这个 事件 然后生成新的控件程序 我们来看看测试一下这个新事件 打开上面提到的 ActiveX 控件测试容器 把这个控件添加进来 用鼠标点击控件 就会在程序下方的消息栏中看到 activexdemo1 Control Click 这样的消息 这就是我们添加进去的鼠标相应事件 12 66 那在开发环境中使用控件的时候是什么样子的呢 好 像上面 提到过的那样新建一个对话框项目 把控件放到对话框上 选中这 个控件 在属性窗口中的控件事件中就有这个 Click 事件了 如果 在使用控件中需要相应鼠标点击事件 就点添加 ClickActivexdemo1ctrl1 事件响应函数中添加你需要的功能了 比如像这样 13 66 void CtestMFCDlg ClickActivexdemo1ctrl1 TODO 在此处添加消息处理程序代码 MessageBox T Hi 编译运行这个测试程序 点击控件位置就会弹出带有 Hi 字样的 MessageBox 3 2 自定义事件自定义事件 自定义事件与常用事件的区别在于 自定义事件不由 COleControl 类自动引发 自定义事件将控件开发人员确定的某一 操作识别为事件 添加常用事件的操作是在类视图中右击 ActiveX 控件类 比如 在此例中就是 Caxtivexdemo1Ctrl 在菜单中选择添加事件 打开添 加事件向导 定义一个叫做 MyEvent 的事件 事件可以带参数 比 如我们加个 BSTR 的参数 msg 14 66 然后 回到类视图 这次选中库节点下的第三个节点 也就是 Dactivexdemo1Events 在下面就会看到新添加的这个事件 15 66 再选中类视图中的控件类 即 Cactivexdemo1Ctrl 下面也会出 现一个 MyEvent 函数 双击这个 MyEvent 可以看到定义代码如下 void MyEvent BSTR msg FireEvent eventidMyEvent EVENT PARAM VTS PI1 msg 16 66 这里的这个 MyEvent BSTR msg 函数就是用于触发 MyEvent 事 件用的 什么意思呢 就是说当在控件中需要出发自定义的这个 MyEvent 的时候调用这个 MyEvent BSTR msg 就可以了 下面结合 例子看看是怎么回事 比如说我们希望用户鼠标双击左键的时候触发这个事件 就这 么来作 选中类视图中的控件类 即 Cactivexdemo1Ctrl 然后在消 息窗口中找到 WM LBUTTONDBCLK 添加这个消息的处理函数 在消息处理函数中如下修改 void Cactivexdemo1Ctrl OnLButtonDblClk UINT nFlags CPoint point TODO 在此添加消息处理程序代码和 或调用默认值 MyEvent T HI MyEvent COleControl OnLButtonDblClk nFlags point 这样每次用户在双击控件的时候就会触发我们自定义的 MyEvent 事件了 然后看一下测试效果 打开 ActiveX 控件测试容器 添加这个控件 然后双击控件 看消息框里出现什么了 17 66 由于双击自然也就是两次单击 所以会同时出现两种事件 activexdemo1 Control MyEvent msg 72 activexdemo1 Control Click 打开测试项目 控件的控件事件里就多了一个 MyEvent 事件 添加一个针对此事件的处理函数 MyEventActivexdemo1ctrl1 LPCTSTR msg msg 就是我们定义事件时的那个 msg 参数 在上 18 66 面的定义中我们是传递了一个 HI MyEvent 字符串消息 现在看看 是不是这个样子 在 MyEventActivexdemo1ctrl1 函数中我们显示一 个 MessageBox 把 msg 参数打印出来 void CtestMFCDlg MyEventActivexdemo1ctrl1 LPCTSTR msg TODO 在此处添加消息处理程序代码 MessageBox msg 同时注意要把上面常用事件中定义的 Click 事件的处理函数 ClickActivexdemo1ctrl1 注释掉 然后编译运行程序后双击控件就会 弹出 HI MyEvent 对话框 也就是说 由于双击操作触发了我们定 义的 MyEvent 事件 进而调用 MyEvent 的处理函数 4 方法方法 方法就是控件开放给用户使用的一些功能函数 类似于 C 的 类函数 控件方法分两类 一类是常用方法 其实现由父类 COleControl 提供 自定义方法由开发人员定义 由此向用户提供 自定义的功能实现 4 1 常用方法常用方法 COleControl 支持两个常用方法 DoClick 和 Refresh Refresh 由控件的用户调用 用以立即更新控件的外观 而调用 DoClick 是 用于引发控件的 Click 事件 19 66 添加常用方法的操作是在类视图中打开库节点 在本例中就是 activexdemo1Lib 节点 选中第二个节点 也就是本例中的 Dactivexdemo1 在右键菜单中选择添加方法 打开添加方法向导 在方法名中选择需要添加的常用方法 比如 DoClick 20 66 然后在类视图中选中 Dactivexdemo1 就会在下面看到我们刚 才添加的那个常用方法 同时 你也可以在这里看到有一个 AboutBox 方法 这是系统自动给我们添加进去的 功能是显示一个 About 窗口 这个窗口可以在项目的资源视图中的 Dialog 下找到并 编辑 21 66 同样也要验证一下这个新添加的方法 还是打开 ActiveX 控件 测试容器 添加此控件 然后点击工具栏上的这个红色方框 也就 是调用方法 22 66 在调用方法对窗口的方法名中选中我们刚添加的这个 DoClick 方法 然后点击调用 还记得这个 DoClick 是干什么的来着吗 对了 它是要引发 Click 事件的 上面介绍事件的时候我们已经添 加了 Click 这个常用事件了 那么现在调用 DoClick 也就是要引发我 们在上面添加的这个 Click 事件了 于是在测试容器主窗口的消息 框中出现了 activexdemo1 Control Click 那么在开发环境中是什么效果呢 好 再回到刚才那个测试项目里 我们先在窗体上添加一个按 钮 就叫 DoClick 等会用点击它的方式来调用 DoClick 方法 然后为了方便操作 我们先给刚才添加到对话框中的那个控件 添加一个绑定的对象变量 鼠标右击控件选择添加变量 23 66 在添加成员变量向导中添加与此控件绑定的控件变量 比如叫 做 m activexdemo 24 66 然后 双击刚才新加到窗体上的那个按钮 即添加这个按钮的 鼠标点击事件函数中 如下添加一行代码 即调用控件的 DoClick 方法 void CtestMFCDlg OnBnClickedButton1 TODO 在此添加控件通知处理程序代码 m activexdemo DoClick 最后 编译运行测试程序 点击 DoClick 按钮 结果弹出 Hi 对 话框 这就是说 我们通过执行控件对象的 DoClick 方法引发了控 件的鼠标点击事件 因此上文常用事件一节中我们添加的事件处理 函数 ClickActivexdemo1ctrl1 被执行了 25 66 4 2 自定义方法自定义方法 自定义方法与常用方法的区别在于 自定义方法未由 COleControl 实现 必须为添加到控件的每个自定义方法提供实现 添加自定义方法的操作是在类视图中打开库节点 在本例中就 是 activexdemo1Lib 节点 选中第二个节点 也就是本例中的 Dactivexdemo1 在右键菜单中选择添加方法 打开添加方法向导 26 66 在添加方法向导里添加需要自定义的方法的名称 返回值和参 数 27 66 注意这里有个内部名称 默认情况是与上面的方法名一样 但 是也可以修改为其他名 这个内部名称是方法在控件类内的函数名 称 比如这里我们的方法名为 MyThod 则选中类视图中的库接口 下的第二个节点 下面会出现刚定义的 MyMethod 方法 28 66 而选中控件类 Cactivexdemo1Ctrl 下面会看到在这个类中定义 的方法名称就是我们上面指定内部名称 MyMethodInner 而方法的具体功能也就是在这个内部函数中实现 比如我们如 下定义 MyMethodInner void Cactivexdemo1Ctrl MyMethodInner LPCTSTR msg AFX MANAGE STATE AfxGetStaticModuleState TODO 在此添加调度处理程序代码 MessageBox msg 29 66 也就是说要弹出一个消息对话框 消息内容就是参数中传递的 字符串 然后来测试一下效果 首先还是 ActiveX 控件测试容器 打开 调用方法窗口 在方法名中会看到我们定一个 MyMethod 选择之 然悔会在参数区看到我们定义的 msg 参数 选中 然后在下面参数 值中填入你想传递给参数的值 比如 hello 然后点击设置值 最后 点击调用 MyMethodInner 就会被执行 也就是弹出 hello 消息窗口 然后再看一下使用控件开发的时候的效果 回到测试项目 还记得那个 DoClick 按钮吧 还是用这个 不 过有点小问题 因为上面我们为这个控件绑定控件变量的时候还没 有这个自定义方法 所以在绑定的时候生成的控件类定义中没有这 个方法 就无法测试了 为了省事 我们就干脆新建一个项目 像 30 66 前文提到的那样添加控件 绑定控件变量 在 DoClick 的单击事件 中写入如下代码 void Ct1Dlg OnBnClickedButton1 TODO 在此添加控件通知处理程序代码 m activexdemo MyMethod T This is mymethod 编译执行 点击 DoClick 按钮 就会看到那个 This is mymethod 消息框了 5 属性属性 属性是 ActiveX 控件中向所有容器公开的数据成员 与事件和 方法类似 也分为常用属性和自定义属性 5 1 常用属性常用属性 常用属性已由 COleControl 类实现 COleControl 类包含支持 控件的通用属性的预定义成员函数 某些通用属性包括控件的标题 以及前景色和背景色 添加常用属性的操作是在类视图中打开库节点 在本例中就是 activexdemo1Lib 节点 选中第二个节点 也就是本例中的 Dactivexdemo1 在右键菜单中选择添加属性 打开添加属性向导 选中实现类型下的常用 在属性名下选择要添加的属性 比如在此 我们选择的是 Caption 31 66 然后在类视图中就能看到新添加的这个属性 这个 Caption 也就是我们在使用控件进行开发的时候 控件属 性窗口中的那个 Caption 属性 32 66 在开发环境中我们可以用控件变量的 GetCaption 和 SetCaption 来获取和设定控件的这个属性 比如在测试项目中的 DoClick 按钮的点击事件函数中如下修改 void Ct1Dlg OnBnClickedButton1 TODO 在此添加控件通知处理程序代码 MessageBox m activexdemo GetCaption m activexdemo SetCaption T change MessageBox m activexdemo GetCaption 这样在点击 DoClick 按钮的时候会显示控件的 Caption 名称对话 框 然后修改名称 再把修改后的名称显示在弹出的对话框中 如果是在 ActiveX 控件测试容器中的话 我们还是打开调用方 法窗口 在方法名中会看到 Caption ProPut 和 Caption ProGet 的方 33 66 法 也就是对应上面的 SetCaption 和 GetCaption 同样在这里也可 以试着给 Caption 修改内容并获取修改后的值 5 2 自定义属性自定义属性 自定义属性与常用属性的区别在于 自定义属性未由 COleControl 类实现 自定义属性用于将 ActiveX 控件的某个状态 或外观向使用该控件的程序员公开 添加自定义属性的操作是在类视图中打开库节点 在本例中就 是 activexdemo1Lib 节点 选中第二个节点 也就是本例中的 Dactivexdemo1 在右键菜单中选择添加属性 打开添加属性向导 这里自定义属性有成员变量和 Get Set 方法两种 5 3 成员变量属性成员变量属性 34 66 我们先看一下成员变量这种属性 根据需要选择属性的类型 并填入属性名 同时变量名和通知函数会被自动填入 如不满意默 认的名称也可以手动修改这两个名称 其中这个变量名是作为控件类的一个成员变量来存储控件属性 的 比如选中类视图中的的控件类 也就是 Cactivexdemo1Ctrl 就 会在下面看到这个 m MyProp1 成员变量 35 66 这种自定义属性的使用与常用属性类似 在 ActiveX 控件测试 容器中也是有着 MyProp1 ProPut 和 MyProp1 ProGet 这样的方法以 供测试时调用 在开发时也会有属性出现在控件的属性窗口中 在 程序中也是可以通过 GetMyProp1 和 SetMyProp1 来获取和设置属性 值 而通知函数是当这个属性被修改是所触发的一个函数 被定义为控 件类中的一个成员函数 36 66 举个例子 假如我们在这个函数中写入如下代码 void Cactivexdemo1Ctrl OnMyProp1Changed void AFX MANAGE STATE AfxGetStaticModuleState TODO 在此添加属性处理程序代码 MessageBox T MyProp1 Changed SetModifiedFlag 然后在 ActiveX 控件测试容器中调用 MyProp1 PropPut 来修改 这个属性值 则会弹出这个对话框 同样的 在开发时如果在属性 37 66 窗口中修改此属性值或在代码里修改此属性值都会触发这个通知函 数 进而弹出我们代码中的对话框 5 4 Get Set 方法型属性方法型属性 添加 Get Set 方法型属性则是在添加属性向导窗口中的实现类型 中选中 Get Set 方法 指定属性类型和属性名 向导会自动填入 Get 和 Set 函数 同时可以指定自定义的参数 38 66 然后在控件类的定义中就会出现 GetMyProp2 void 和 SetMyProp2 LPCTSTR newVal 两个函数 分别用于获取和设置属性 值 但要注意的是 如果看一下这两个函数的代码的话 这两个自 动生成的函数实际上并没有真正起到获取和设置属性值的功能 这 只是两个框架 基本上什么也没做 如果放在 ActiveX 控件测试容 器中调用这两个函数的话会看不到什么反应 于是就还需要我们来 手动定义函数的具体功能 比如说我们可以为控件类添加一个成员变量用来存储我们的属 性值 由于我们这个属性定义的是 BSTR 类型 我们可以把添加的 这个成员变量声明为 CString m MyProp2 然后分别修改 GetMyProp2 void 和 SetMyProp2 LPCTSTR newVal 为如下 BSTR Cactivexdemo1Ctrl GetMyProp2 void 39 66 AFX MANAGE STATE AfxGetStaticModuleState CString strResult m MyProp2 TODO 在此添加调度处理程序代码 return strResult AllocSysString void Cactivexdemo1Ctrl SetMyProp2 LPCTSTR newVal AFX MANAGE STATE AfxGetStaticModuleState TODO 在此添加属性处理程序代码 m MyProp2 newVal SetModifiedFlag 然后在 ActiveX 控件测试容器中先调用 SetMyProp2 给属性赋值 然后用 GetMyProp2 就能返回刚才新赋的属性值了 另外要注意的是 刚才定义这个属性的时候 参数列表是留空 的 默认得到的就是上面 SetMyProp2 和 GetMyProp2 两个函数 如 果在参数列表里添加了其他参数的话 那么新加的参数就会被添加 到这两个函数的参数列表中去 比如我们添加个 BSTR 型属性 MyProp3 在参数列表里加上一个 LONG arg 参数 那么得到的两 个函数将是 GetMyProp3 LONG arg 和 SetMyProp3 LONG arg BSTR newVal 6 属性页属性页 40 66 属性页使 ActiveX 控件用户得以查看和更改 ActiveX 控件属 性 可通过调用控件属性对话框访问这些属性 该对话框包含一个 或多个属性页 这些属性页提供自定义的图形界面用于查看和编辑 控件属性 6 1 使用默认属性页使用默认属性页 创建 ActiveX 控件项目后 系统就自动为我们添加了一个属性 页类 这里就是 Cactivexdemo1PropPage 同时在对话框资源里也会 有一个属性页对话框资源 这里就是 IDD PROPPAGE ACTIVEXDEMO1 在 ActiveX 控件测试容器中点击工具栏上的属性按钮 就会看 到这个属性页对话框 比如就像下图这样 当然这个上面什么还没有 41 66 如果是在使用控件开发时 则在选中控件后 在属性窗口中点 击属性页按钮可以打开这个属性页 开发人员可以在这个弹出的属 性页窗口中设定控件的属性 如果要通过属性页修改控件属性 那么就要通过在属性页上放 置一些控件给用户来修改属性值 比如我们上面添加了一个 Caption 属性 我们要在属性页上提供修改这个属性的功能一般就是要用一 个文本输入框 这样我们在属性页的对话框上放置一个 Edit 控件 设 id 为 IDC EDIT CAPTION 然后为这个 Edit 控件绑定一个变量 用右键点这个 Edit 控件 学则添加变量 打开 42 66 在添加成员变量向导中添加一个新变量 设为 m caption 这里 注意要把类型设为 Value 由于属性是个字符串 所以这个地方变量 类型也使用 CString 然后我们来看一下属性页类中的一个 DoDataExchange 函数 这 个函数是由系统自动调用的 用来将控件与成员变量进行数据交换 由于我们刚把 Edit 控件绑定了 m caption 变量 在 DoDataExchange 已经给我们写入了这么一句 DDX Text pDX IDC EDIT CAPTION 43 66 m caption 就是这一句实现了 m caption 与 Edit 控件之间的数据 交换 但此时控件 Caption 属性还不能自动从 Edit 控件中填写的值 获得 还需要一个操作 即 DDP Text pDX IDC EDIT CAPTION m caption T Caption 这样就把 Caption 属性与与属性页中的 m caption 变量绑定 这样每当我们在修改了属性页窗口中的 Edit 控 件内容后 就能修改控件的 Caption 那么完整的 DoDataExchange 函数就应该像下面这样 void Cactivexdemo1PropPage DoDataExchange CDataExchange pDX DDX Text pDX IDC EDIT CAPTION m caption DDP Text pDX IDC EDIT CAPTION m caption T Caption DDP PostProcessing pDX 另外注意这个地方 DDP PostProcessing 是系统自动生成的代码 这句话一定要放在 DDX Text 和 DDP Text 的后面 否则不能实现 控件属性与属性页上控件的绑定 至此 我们就可以在设计时通过 这个属性页来修改 Caption 属性 而不必通过程序代码来修改了 6 2 添加其他自定义属性页添加其他自定义属性页 默认情况下只有一个属性页 如果需要设置的属性太多就需要 另外添加自定义属性页 新添加属性页的方法是这样的 打开 VS 的资源视图 添加一 个新的 Dialog 资源 44 66 在这里我们选择 IDD OLE PROPPAGE SMALL 当然也可以 选和 Large 给这个新资源 ID 指定为 IDD OLE PROPPAGE SMALL 然后需要给这个资源新建一个关联类 这个关联类应当是 MFC 类 设类名为 CPropPage1 基类应当是 COlePropertyPage 对话框 ID 选 择我们新添加的这个对话框资源 ID 45 66 然后 打开控件类 Cactivexdemo1Ctrl 的 cpp 文件 找到属性页 的宏声明部分 BEGIN PROPPAGEIDS Cactivexdemo1Ctrl 1 PROPPAGEID Cactivexdemo1PropPage guid END PROPPAGEIDS Cactivexdemo1Ctrl 把我们新建的这个属性页添加进去 并将属性页计数加一 TODO 按需要添加更多属性页 请记住增加计数 BEGIN PROPPAGEIDS Cactivexdemo1Ctrl 2 PROPPAGEID Cactivexdemo1PropPage guid PROPPAGEID CPropPage1 guid END PROPPAGEIDS Cactivexdemo1Ctrl 这样就把新添加的这个属性页附加到控件中去了 再打开控件 的属性页就会看到多了一个属性页了 6 3 常用属性页常用属性页 除了可以根据需要自定义属性页外 系统还提供给开发人员一 些预制的常用属性页 如颜色 字体等属性页 MFC 提供了三个与 ActiveX 控件一起使用的常用属性页 CLSID CColorPropPage CLSID CFontPropPage 和 CLSID CPicturePropPage 这些页分别显示常用颜色 字体和图片 属性的用户界面 要将这些属性页合并到控件中 只需要请将它们的 ID 添加到 初始化控件的属性页 ID 数组的代码 也就是在类控件 46 66 Cactivexdemo1Ctrl 的 cpp 文件中的 PROPPAGEIDS 声明处修改成如 下形式 与自定义属性页中相同 也需要增加属性页计数 TODO 按需要添加更多属性页 请记住增加计数 BEGIN PROPPAGEIDS Cactivexdemo1Ctrl 3 PROPPAGEID Cactivexdemo1PropPage guid PROPPAGEID CPropPage1 guid PROPPAGEID CLSID CColorPropPage END PROPPAGEIDS Cactivexdemo1Ctrl 这样就在属性页里添加了一个颜色属性页 但要想使用这个属 性页还需要添加几个常用属性 比如说我们希望能通过这个属性页 设定 BackColor 和 ForeColor 属性 就参照常用属性一节中的方法 添加一个 BackColor 和一个 ForeColor 属性 编译生成控件后在 ActiveX 控件测试容器中点击工具栏中的属性 在弹出的属性窗口中就能看到有关这两个属性的设定了 47 66 若要使用颜色属性 则需要调用 COleControl TranslateColor 成 员函数 此函数的参数为颜色属性值和可选的调色板句柄 返回值 为 COLORREF 值 可以将它传递给 GDI 函数 如 SetTextColor 和 CreateSolidBrush 下例说明如何在绘制控件时使用这两个颜色属 性 CBrush bkBrush TranslateColor GetBackColor COLORREF clrFore TranslateColor GetForeColor pdc FillRect rcBounds pdc SetTextColor clrFore pdc DrawText InternalGetText 1 rcBounds DT SINGLELINE DT CENTER DT VCENTER 7 7 如何注册如何注册 OCX 控件控件 7 1 32 位系统位系统 将文件放到 c windows system32 目录 注册 运行 Regsvr32 c windows system32 xxx ocx 48 66 取消注册运行 Regsvr32 u c windows system32 xxx ocx 7 2 64 位系统注册位系统注册 32 位文件位文件 将文件放到 c windows system64 目录 运行 Regsvr32 c windows system64 xxx ocx 取消注册运行 Regsvr32 u c windows system64 xxx ocx 8 带窗体的带窗体的 OCX 控件控件 8 1 建立带窗体的 OCX 控件 1 创建 MFC Activex 控件 类型的项目 项目名称 ocxtest3 在控件设置中 创建的控件基于 STATIC 勾选 无闪烁 激活 去掉勾选 有关于对话框 点击 完成 2 资源视图中 插入对话框资源 IDD DIALOG1 属性中设置 style child visible true Border None 另外可选属性 toolbar control 等等 可根据需要选择 3 类视图中创建 IDD DIALOG1 的 C 类 CDialog1 基类选择 CDialog 完成 49 66 4 Cocxtest3Ctrl h 文件中添加变量 m Dialog1 include Dialog1 h CAgentSDKExCtrl 有关实现的信息 请参阅 AgentSDKExCtrl cpp class Cocxtest3Ctrl public COleControl DECLARE DYNCREATE Cocxtest3Ctrl public CDialog1 m Dialog1 构造函数 5 类视图中 为 Cocxtest3Ctrl 添加消息函数 OnCreate 50 66 a 在 ocxtest3Ctrl cpp 文件中 注意给函数添加自定义的变量 Cocxtest3Ctrl 消息处理程序 51 66 int Cocxtest3Ctrl OnCreate LPCREATESTRUCT lpCreateStruct if COleControl OnCreate lpCreateStruct 1 return 1 TODO 在此添加您专用的创建代码 m Dialog1 Create IDD DIALOG1 this return 0 b 在 ocxtest3Ctrl h 文件中 注意给函数声明添加自定义的变量 int OnCreate LPCREATESTRUCT lpcreatestruct 6 ocxtest3Ctrl cpp 文件中 OnDraw 中添加如下代码 void Cocxtest3Ctrl OnDraw CDC pdc const CRect DoSuperclassPaint pdc rcBounds m Dialog1 MoveWindow rcBounds TRUE 7 修改 ocxtest3Ctrl cpp 文件中的消息映射 注意事项注意事项 消息映射 52 66 BEGIN MESSAGE MAP Cocxtest3Ctrl COleControl ON MESSAGE OCM COMMAND 声明窗体交互函数 protected virtual void DoDataExchange CDataExchange pDX DDX DDV support 3 Dialog1 cpp 文件中添加 DoDataExchange 函数的具体实现 53 66 void CDialog1 DoDataExchange CDataExchange pDX CDialog DoDataExchange pDX AFX DATA MAP CSdkMfcTestDlg DDX Control pDX IDC LIST1 State m info DDX Control pDX IDC STATIC RealPlay m RealPlay AFX DATA MAP 4 在 resource h 文件中修改宏定义 使得指针不冲突 define IDS OMTTEST3 1 define IDB OMTTEST3 2 define IDS OMTTEST3 PPG 3 define IDS OMTTEST3 PPG CAPTION 200 define IDD PROPPAGE OMTTEST3 201 define IDD DIALOG1 1000 define IDC STATIC RealPlay 1001 define IDC LIST1 State 1002 5 在ComtTEST3Ctrl cpp文件中的具体应用为 void ComtTEST3Ctrl StartRealPlay BSTR camID AFX MANAGE STATE AfxGetStaticModuleState TODO 在此添加调度处理程序代码 CStringstr m csCamID camID if m RealPlayID 0 str Format Please close error m dialog1 m info InsertString 0 str MessageBox Please close error return GetDlgItem IDC INPUT REALCAM GetWindowText str temp int playid1 playid omt Plat RealPlay str temp GetBuffer str temp GetLength long m playwin m hWnd OMT PLAT VIDEO STREAMTYPE D1 m RealPlayID omt Plat RealPlay m csCamID GetBuffer m csCamID GetLength long m RealPlay m hWnd OMT PLAT VIDEO STREAMTYPE D1 句柄为空时不解码回调数据 m RealPlayID omt Plat RealPlay m csCamID GetBuffer m csCamID GetLength long m dialog1 m RealPlay m hWnd OMT PLAT VIDEO STREAMTYPE D1 句柄为空时不解码回调数据 54 66 if m RealPlayID OMT PLAT FALSE str Format RealPlay s error camID m dialog1 m info InsertString 0 str MessageBox str return else str Format RealPlay s success camID m dialog1 m info InsertString 0 str strncpy camId str temp GetBuffer str temp GetLength 32 MessageBox str 9 VS2008 控件程序调试工具路径选择控件程序调试工具路径选择 C Program Files Microsoft Visual Studio COMMON Tools 10 程序遇到的问题和解决办法程序遇到的问题和解决办法 1 error PRJ0050 未能注册输出 请尝试启用 每个用户的重定 向 或者用提升的权限 的解决办法 55 66 解决方法一 看了半天 我是管理员权限 删除 debug 也不行 只好把 dll cpoy 到 output directory 目录就行了 所有第三方的 dll 放在一起 然后注册 在生成 ocx 的 debug 文件夹中 copy 用到的 dll 文件 56 66 主要原因还是没有连接依赖库 解决方法 2 关掉你的杀毒软件 我搞了好几个小时就是不知道为什么会出 错 直接命令行执行命令也没有错误提示 后来想了半天也想不出 来个所以然 突然间想到可能是杀毒软件在搞怪 一试还真是杀毒 软件的原因 这个问题后来明白了 是因为杀毒软件对这种重复注册的 dll 可 能误以为是病毒所以就给阻止了 解决方法 3 这个问题可能是因为没有连接生成对应的文件造成的打开 xxx 项目路径 Debug BuildLog htm 文件从中搜索以下文字 或上一个增量链接没有生成它 正在执行完全链接问题的解 决 如果出现这个文字说明你的 c 项目的生成方案是增量链接 具体原因 57 66 c sharp view plaincopyprint 1 因为普通的 生成项目 是增量编译形式的 例如原先有 A B C 三个单元编译后生成 a obj b obj c obj 而现在对 C 单元进行修改 此时执行 生成项目 就只编译 C 单后就直接 进行链接了 2 3 你所提到的现象是在这个增量编译的过程中 编译器出现了点问题 这种问题的解决方案有人提出过重启 VS 来解决 但是有的时候 会失效 现在讲一下我的解决方法 右击你要生成的项目 如下图 然后按下图修改把增量链接改一下 58 66 重新生成你的项目 然后再在 Debug BuildLog htm 中查看是否 还有 或上一个增量链接没有生成它 正在执行完全链接问题的 解决 问题 如果没有 那么恭喜你至少在链接这一步你成功了 另外要说 的是 对整个编译
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网球团建活动策划方案
- 精准智能营销方案
- 2025亚洲纤维材料技术革新供求剖析与风险控制建议方案
- 2025亚洲智能手表行业市场应用分析及市场拓展研究报告
- 楼板板施工方案
- 2025亚洲智能健康管理系统行业市场深度调研及发展趋势和前景预测研究报告
- 2025云计算服务产业链竞争态势与数字化转型机遇洞察报告
- 2025中国香水市场高端化趋势与品牌定位研究报告
- 2025中国食品添加剂生产精密过滤器验证体系构建报告
- 2025中国预制装配式建筑成本控制与效益评估报告
- GB/T 20346.1-2006施肥机械试验方法第1部分:全幅宽施肥机
- GB/T 20056-2015滚动轴承向心滚针和保持架组件外形尺寸和公差
- 农产品质量与安全知识讲座模板
- GA/T 1068-2015刑事案件命名规则
- 浙江省宁波市镇海蛟川书院2022-2023七年级上学期数学期中试卷+答案
- I-am-a-bunny优秀教学讲解课件
- 论文写作讲座课件
- 双减作业设计初中数学作业设计优秀案例
- Unit 2 Workbook Be a Good Tourist 课件-高中英语人教版(2019)必修第一册
- 食品加工企业应急预案
- 气密性试验方案
评论
0/150
提交评论