本文將介紹ActiveX控件的應用與工做原理,讀者能夠把ActiveX控件當作一個極小服務器的應用程序,它不能獨立運行,必需要嵌入到容器程序中與容器一塊兒運行,就像電腦主機中的顯卡,它本身在電腦硬件系統中是不能發揮做用的必需要和嵌入到主板中,與主板一塊兒工做。c++
ActiveX控件與普通的Windows控件有共同之處也存在差別。首先ActiveX控件有本身的屬性和方法。對ActiveX控件的操做經過調用控件對外的方法便可。而Windows控件是Windows內部的對象,雖然它們也有本身的屬性和方法可是沒有暴露給調用者。在筆者看來通俗的說ActiveX控件更加開源,調用者使用更加靈活,你能夠根據本身的須要設計控件的類型,功能。控件的屬性,控件觸發容器程序的方式等均可以本身設定。這裏咱們把ActiveX控件理解成一種動態連接庫彷佛更容易理解些。服務器
下面將從已有控件的插入,和自定義插件的應用兩方面介紹ActiveX插件:函數
首先插入一個已經存在的插件,這裏筆者在vc6.0上以一個顯示日期的日曆插件爲例:學習
(1)建立一個名爲ShowTime1的基於對話框的應用程序,其餘都使用默認設置。(2)選擇project—>Add To project —>Components and controls進入以下界面:測試
(3)選擇Registered ActiveX Controls 雙擊而後進入如下界面選擇:spa
(4)選擇Insert 進入下一界面後默認選擇便可插件
如圖所示這時咱們能夠發如今原有控件欄中已經多出了一項咱們添加的日曆控件。直接拖拽就能夠對咱們添加的控件進行操做了。設計
切換到類視圖咱們能夠發如今原有對話框的三個類的基礎上又出現了兩個新類:3d
這兩個新類就是與咱們添加的ActiveX控件有個的類,類中有與控件有個的相關函數以及變量。下邊舉一個簡單的例子對新添加的日曆控件進行操做。code
首先咱們給新添加的控件關聯上一個變量:右鍵按鈕資源—>class Wizard—>Member Variables—>選擇在基礎類CShowTime1Dlg下—>Add Variable。這裏咱們把變量命名爲m_CCalendar1變量的類型是CCalendar.而後在原有對話框資源基礎上添加一個編輯框,還有一個按鈕。功能是把當前的時間顯示到編輯框中。首先先給按鈕添加一個響應函數具體是:右鍵按鈕資源—>class Wizard—>Message Maps—>選擇單擊(基礎類選擇CShowTime1Dlg)—>Add Function—>Edit Code而後再按鈕響應函數中添加代碼:
void CShowtime1Dlg::OnButton1() { // TODO: Add your control notification handler code here m_strTime1.Format("%d-%d-%d",m_CCalendar1.GetYear(),m_CCalendar1.GetMonth(),m_CCalendar1.GetDay()); UpdateData(FALSE); }
運行結果圖。
****************************************************************************************************************
(控件的建立)
經過日曆控件的學習咱們大概瞭解瞭如何插入一個控件,以及插入控件後如何對控件進行操做,新控件的引入,在資源引入的同時還有與控件相關的類,類中的變量以及函數或者說是控件的屬性以及方法。
有些時候咱們須要本身建立控件,本身建立控件而後供其餘容器程序引用。一個典型的ActiveX控件具備三個特徵:方法,屬性,事件。接下來筆者以一個時鐘控件的建立爲例介紹一下ActiveX控件建立以及容器程序調用控件的運行機制。
首先打開vc6.0選擇File\New菜單項在打開的對話框上選擇project選項卡,在列表中選擇MFC ActiveX ControlWizard 工程名爲Clock1單擊OK進入MFC ActiveX ControlWizard 嚮導第一步
該界面上共有四個選項:第一個選項是詢問用戶該工程中將要提供的控件數目。第二個是詢問用戶是否想要運行許可(咱們花費大量精力開發控件固然不但願其餘人無償使用這個控件這裏選擇生成一個運行時許可,這樣的話其餘人沒有許可將沒法使用該控件)。第三個是詢問是否生成源文件註釋。最後一個是問是否生成幫助文檔。這裏咱們第二個選擇YES其餘三項均默認系統設置便可。而後直接Finish進入工程界面:
經過工程界面咱們能夠發現工程自動生成了三個類,其中CClock1Ctrl類派生於CWnd類是一個窗口類至關於單文檔應用程序中的主窗口類在該類中提供了一個OnDraw函數,若是控件須要輸出圖形就在該函數中編寫代碼。另外除了三個類覺得還有_DClock1和_DClockEvents他們的前邊都有像平放的小勺同樣的圖標,該圖標對應的是接口項。接口是控件與外部程序進行通訊的協議。外部程序經過接口去訪問控件的屬性和方法。
這裏打開OnDraw函數咱們能夠發現:
void CClock1Ctrl::OnDraw( CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) { // TODO: Replace the following code with your own drawing code. pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))); pdc->Ellipse(rcBounds); }
在函數中已有兩個函數,分別是畫矩形和橢圓的。因爲ActiveX控件不能單獨運行必須嵌入到容器中去,vc6.0提供了一個ActiveX控件測試容器。咱們運行一下控件程序將彈出一個快捷菜單,選擇該菜單上一個向右箭頭的按鈕,而後在彈出的菜單中選擇ActiveX Control Test Container,也就是說咱們選擇ActiveX Control Test Container做爲Clock1控件的容器,打開ActiveX Control Test Container應用程序如圖:
經過Edit\Insert New Control將控件導入到容器程序中然以在該列表框中任意選中一個控件快速連續的按下C,L,O鍵(大寫的)能夠快速的鎖定到咱們建立的Clock1控件處。
點擊OK能夠看到咱們建立的Clock1控件顯示:
爲了讓控件顯示系統時間咱們在OnDraw函數中完成:
void CClock1Ctrl::OnDraw( CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) { // TODO: Replace the following code with your own drawing code. pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))); pdc->Ellipse(rcBounds); CTime time=CTime::GetCurrentTime(); CString str=time.Format("%H:%M:%S"); pdc->TextOut(10,10,str); }
爲了讓時鐘走起來,咱們須要定時函數每隔一秒讓系統時間刷新。根據窗口知識咱們應該是在窗口建立完成以後設置定時器這裏添加WM_CREATE消息響應函數:
int CClock1Ctrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here SetTimer(1,1000,NULL); return 0; } void CClock1Ctrl::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default Invalidate(); COleControl::OnTimer(nIDEvent); }
Invalidate()函數能夠引發窗口重繪,窗口重繪調用OnDraw()函數實時的顯示系統時間。到此一個基礎控件的雛形就出來了。可是咱們有時候但願咱們編寫的控件功能強大些,給控件提供相應的屬性,用戶能夠隨意的更改設置控件的屬性。
在vc++開發環境中能夠經過 class Wizard 的來完成。
具體流程是打開Class Wizard—>Automation—>Add Property;
單擊External name 下拉列表框將會看到列表框的許多屬性這些都是MFC爲ActiveX提供的標準屬性,其中的BackColor和ForeColor分別是背景色和前景色屬性,這裏咱們選擇BackColor:
一樣的方法咱們添加ForeColor屬性完成後回到控件開發環境的類視圖,在_DClock1接口下看到了剛添加的兩個屬性:BackColor和ForeClor.
爲了能讓添加的屬性,用戶操做時直接生效這裏還要在OnDraw()中添加代碼:
void CClock1Ctrl::OnDraw( CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) { // TODO: Replace the following code with your own drawing code. CBrush brush(TranslateColor(GetBackColor())); pdc->FillRect(rcBounds,&brush); pdc->SetBkMode(TRANSPARENT); pdc->SetTextColor(TranslateColor(GetForeColor())); // pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))); // pdc->Ellipse(rcBounds); CTime time=CTime::GetCurrentTime(); CString str=time.Format("%H:%M:%S"); pdc->TextOut(10,10,str); }
這時咱們將新建立的控件插入到一個對話框程序中,拖拽控件到窗口,而後右鍵選擇properties將會看到:
在All中咱們看到了在建立控件時設置的兩個屬性:BackColor和ForeClor,這樣用戶能夠直接對新建立的控件的兩個屬性進行設置:
控件Clock1的背景和前景兩個屬性根據用戶須要自行更換。