MFC .ocx控件开发

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38215395/article/details/79718353

本文将介绍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,高为height
    double width=200,height=100;
    pdc->Rectangle(0,0,width,height);

    //旋转中心坐标p0
    double 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

`

猜你喜欢

转载自blog.csdn.net/weixin_38215395/article/details/79718353