本文将介绍ocx的含义,以及如何利用MFC创建ocx控件。

1、ocx控件的含义

OCX 是对象类别扩充组件(Object Linking and Embedding (OLE) Control Extension);是可执行的文件的一种,但不可直接被执行; 是 ocx 控件的扩展名,与 .exe、.dll 同属于PE文件。(来源于百度百科)
简单来说,在界面开发时,需要用到许多控件,比如按钮、Edit等。若编辑器中没有我们需要的控件,这时就需要我们自己设计开发,比如水下机器人的姿态显示控件。

2、MFC新建.ocx工程(利用VC++6.0)

本文利用VC++6.0新建.ocx工程,并实现一个简单的控件(VS2005等,建立和实现过程都类似)。
步骤如下:

step 1:


根据上图步骤1,2,3,4,完成后,点击“确定”。

step 2:


这一步根据自己的需要选择。

step 3:


上图中的“可用于“插入对象”对话框”,默认不选择。一般都得需要选择吧。。。。。。选择此选项,并在系统中注册后(稍后会讲怎么注册),在其他界面程序中,可以在“插入对象”对话框中插入此控件。

step 4:

根据上述步骤,最终可得到如下的工程界面:

注意,上图中圈红的两个文件(“xxxxCtl.cpp”和“xxxxCtl.h”),绘制时主要修改这两个文件。

3、绘制.ocx控件

绘制.ocx控件时,通过修改“xxxxCtl.cpp”文件中的“OnDrew()”函数,可以绘制出自己想要的各种样式的控件。在OnDrew()函数中,MFC默认绘制了一个椭圆。如果不需要,可以将其删除,写自己的绘制语句。比如,下面的程序中绘制了一个可以绕中心旋转seta角度的矩形。

//坐标转换函数,initial为变换之前的坐标,center为旋转中心坐标,seta为旋转角度(度)
CPoint rotatePoint(CPoint initial,CPoint center,double seta)
{seta=seta*3.1415926/180;     //转化为“弧度”CPoint result;result.x=(initial.x-center.x)*cos(seta)-(initial.y-center.y)*sin(seta)+center.x;result.y=(initial.x-center.x)*sin(seta)+(initial.y-center.y)*cos(seta)+center.y;return result;
}
void CMy1111Ctrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{// TODO: Replace the following code with your own drawing code.//定义画笔和画刷CPen myPen;myPen.CreatePen(PS_SOLID,2,RGB(0,0,255));CBrush myBrush;myBrush.CreateSolidBrush(RGB(0,0,255));pdc->SelectObject(myPen);pdc->SelectObject(myBrush);//绘制背景,宽为width,高为heightdouble width=200,height=100;pdc->Rectangle(0,0,width,height);//旋转中心坐标p0double x0=width/2,y0=height/2;CPoint p0(x0,y0);//旋转角度double rangle=10;//绘制可旋转矩形/*矩形初始形态(旋转角度为0)如下,矩形中心(旋转中心)坐标为p0:p1---------------p2|                ||                |p3---------------p4*/double rec_width=width/2,rec_height=height/2;   //矩形的宽和高//矩形旋转之前坐标double x1=x0-rec_width/2,y1=y0-rec_height/2;double x2=x0+rec_width/2,y2=y0-rec_height/2;double x3=x0-rec_width/2,y3=y0+rec_height/2;double x4=x0+rec_width/2,y4=y0+rec_height/2;CPoint p1(x1,y1),p2(x2,y2),p3(x3,y3),p4(x4,y4);//矩形旋转之后坐标CPoint rp1=rotatePoint(p1,p0,rangle);CPoint rp2=rotatePoint(p2,p0,rangle);CPoint rp3=rotatePoint(p3,p0,rangle);CPoint rp4=rotatePoint(p4,p0,rangle);//绘制旋转后的矩形pdc->BeginPath();   //与pdc->EndPath()相对,为所围区域上色pdc->MoveTo(rp1);pdc->LineTo(rp2);pdc->LineTo(rp4);pdc->LineTo(rp3);pdc->LineTo(rp1);pdc->EndPath();//上色CBrush myBrush1;myBrush1.CreateSolidBrush(RGB(0,255,0));CRgn rgn;rgn.CreateFromPath(pdc);pdc->InvertRgn(&rgn);pdc->FillRgn(&rgn,&myBrush1);
}

上述代码中的坐标变换函数解释如下:
设原来的(角度为0时)点坐标为(x1,y1),旋转之后的坐标为(x,y),旋转中心坐标为(x0,y0),旋转角度为seta(弧度值),则:

将上述代码运行编译通过之后(别忘了添加“#include

4、为ocx控件添加方法

在实际应用中,我们通常需要改变控件的某个属性,如在程序中利用获得的数据来改变ocx控件中矩形的旋转角度。这是,我们可以通过在创建控件时,为控件添加方法来实现。
找到“View->建立类向导->Automation”,在界面中找到“Add Method”。点击后,出现如下对话框,根据自己的需要填写。在这,可以注意到,“方法”其实就是定义了一个函数接口,外部程序可以通过该函数,改变控件的状态。
比如,本文添加的方法如下:

点击确定之后,在“xxxxCtl.cpp”的最后,会发现多了一个名为“void angle(double rotate_angle)”的函数。在这个函数中,可以将旋转角度“rotate_angle”赋给矩形的旋转角度“rangle”,同时将绘制矩形时设置的rangle去掉,并在“xxxxCtl.h”中设置为成员变量。
此时,在其他程序中,就可以调用到此“angle()函数”。

5、为ocx控件添加属性

我们再进行界面设计时,会发现每个控件都有许多属性,包括颜色、大小等。本文将为上述控件添加高度和宽度。
打开“view->建立类向导->Automation”,在界面中找到“Add Method”。点击后,出现如下对话框,根据自己的需要填写。比如,本文添加的属性如下:

高度属性“height”添加方法同上。
点击确定后,会发现,在“xxxxCtl.h”中多了一个成员变量 “double m_width;”。在“xxxxCtl.cpp”的最后,多了“void OnWidthChanged()”函数。这个函数的功能是,当width的值改变后,我们需要做的事情可以在此函数体中实现。比如,在这里,我们需要重新绘制控件。添加InvalidateControl();
更重要的一步是,我们需要在“xxxxCtl.cpp”中的void CMy1111Ctrl::DoPropExchange(CPropExchange* pPX)函数中,将属性值和属性绑定(专业术语叫“串行化”)。比如,对于刚才的width属性,添加如下语句:` PX_Double(pPX,_T(“width”),m_width,200);其中,PX_Double为参数类型,“width”为属性名,“m_width”为属性值,“200”为m_width的初值。
此后,让绘制矩形时的width和height等于“m_width”和“m_height”即可。

到此,一个ocx空间就制作完成了。

6、ocx控件的注册

ocx的注册,网上有好多文章有写,这里采用一种比较笨的方法,在cmd中注册。其他方法可百度。首先,以管理员身份运行cmd,从cmd中进入到项目的Debug文件夹,Debug文件夹中有项目生成的.ocx文件,如“1111.ocx”。在cmd中输入regsvr32 xxxx.ocx。显示注册成功即可。

7、ocx控件的使用

新建MFC工程,在Dialog中找到设计界面。在界面空白处,右击,选择“插入Active控件…”,选择刚才注册的控件。你自己设计的控件就显示出来了^-^。在VC++6.0中,右击属性,会显示之前设置的属性,改变属性值,控件也会发生相应的变化。在本例中,可改变控件的宽和高。
那么,空间中,矩形的旋转角度该如何改变呢?
右击控件,选择“建立类向导”(更高版本中,为“添加变量”)->”Member Variabvles”。双击控价名称,会提示建立“控件对应的类”。点击确定后,控件的接口类就会自动添加到程序中。之后显示“Add Member Variable”对话框,如下:

上图中显示了添加的变量名称(对应类的一个对象),类型为“control”表明可实现控件的方法。
点击确定后,在界面类的头文件“xxxxDlg.h”中,就会出现CMy1111类名为angle的对象。利用这个对象就可以设置矩形的旋转角度。在“xxxxDlg.cpp”中“BOOL CTest1Dlg::OnInitDialog()”函数中,添加angle.angle(15);。运行,会发现矩形旋转了15度。

本人开发的sane水下机器人姿态显示控件,可参考:https://gitee.com/git-lizhen/my-attitudeIndicators-of-vehicle

`

MFC .ocx控件开发相关推荐

  1. 海康威视视频ocx控件开发总结

    因工作需要,需要开发一个海康威视的视频ocx控件,嵌入到intouch,组态王一类的组态软件中使用. 之前从没做过ocx控件的开发,连MFC的开发也没做过,折腾了几天,终于基本完成.记录一下这个过程. ...

  2. OCX控件开发及WEB Javascript如何使用OCX控件

    一.OCX控件开发 1.使用IDE版本: VS2010 2..基于MFC技术 开发OCX控件. 3..基本OCX开发过程 3.1.打开VS 2010 新建项目,选择MFC模板,"MFC    ...

  3. VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程

    VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程 开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件.(此文章也是 ...

  4. DELPHI 开发的 OCX 控件在 MFC 程序中编辑框快捷键不好使的解决

    公司一个大型的项目中使用了 DELPHI 来开发 OCX 控件做数据库的管理,但是GIS图形系统使用 MFC 开发,最后将 OCX 嵌入到 MFC 程序中作为一个完整的系统交付用户使用,但是在使用过程 ...

  5. MFC中开发ocx控件,html容器收不到ocx的事件Event

    问题背景: MFC开发ocx控件,主窗口就是ctrl类,主窗口类中调度接口和事件映射添加,执行OK,外部html容器中接收事件成功,如下: ctrl.h中声明事件映射函数 void EVTPENSIG ...

  6. Visual Studio开发MFC项目OCX控件添加使用控件方法

    1.在Windows系统中注册OCX控件 在OCX控件目录,右键新建一个文本文档,将文件名和扩展名改为"双击注册.bat",添加如下注册脚本: cd /d %~dp0 RegSvr ...

  7. MFC ActiveX (ocx)控件的开发

    前言 ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM). ActiveX控件是一种实现了一系列特定接口而使其在使用和外观上更象一个 ...

  8. 在MFC中使用OCX控件遇到的一个问题

    [问题:] 在一个简单的MFC对话框中嵌入一个OCX控件(如浏览器控件),该控件采用动态方式创建,即调用CWnd::Create()接口生成窗口,在本机运行良好,但是在其它部分机器上运行则出现程序异常 ...

  9. CAD制图, 机械CAD, 建筑CAD, 电力CAD, CAD设计, 数控与CAM, DXF导入\导出, 打印, 软件开发, VC++源代码,OCX 控件源程序2018

    CAD制图, 机械CAD, 建筑CAD, 电力CAD, CAD设计, 数控与CAM, DXF导入\导出, 打印, 软件开发,VC++源代码,OCX 控件源程序2018 -- 100%源码开放企业级CA ...

最新文章

  1. CICS FILE OPEN
  2. 凤翅医话——小青龙加石膏汤
  3. MySQL新建匿名用户_初始化MySQL用户(删除匿名用户)
  4. Java黑皮书课后题第10章:*10.16(被2或3整除)找出所有被2或3整除的有50个十进制位数的前10个数字
  5. 用SAP BSP应用实现图片灰度效果
  6. Android基础知识(一)
  7. nssl1192-加密【字符串hash】
  8. SOA面向服务架构简述
  9. 前端技术—CSS常用代码大全
  10. python3.8使用aiml总结
  11. Mars3D开发基础学习:三维场景 Map
  12. 第四届高教杯计算机绘图教程,第十一届高教杯全国大学生先进成图技术与产品信息建模.PDF...
  13. DRF批量修改序列化器使用
  14. 自己做游戏(一)-PhotonServer配置
  15. 商务邮箱一般用什么?办公最常用的邮箱功能是?
  16. Day32 Web自动化进阶
  17. 倪健中在深圳全球元宇宙大会致辞:元宇宙充满巨大空间
  18. 数字签名与数字信封流程
  19. 特征选择方法之主成分分析
  20. spring integration 入门

热门文章

  1. iOS开发 代码重构心得
  2. php iconv 过滤特殊字体,关于iconv函数遇特殊字符的处理办法
  3. 仿映客直播APP开发实战项目IOS开发实战8天课程
  4. 以太坊变红,为什么 ETH 必须持有这个关键支持
  5. 安卓手机可成为天气预报工具?这项全球科学项目有意思
  6. Altium Designer输出gerber等生产文件
  7. java+springboot+vue高校学生医疗保险管理系统
  8. SAP BW/4HANA学习笔记2
  9. 云计算创新展望-精耕细作的超级云计算平台
  10. mac如何添加学校买的outlook邮箱