1. 程式人生 > >MFC .ocx控制元件開發

MFC .ocx控制元件開發

本文將介紹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度。
這裡寫圖片描述

`