1. 程式人生 > >用VS2008+ATL開發Gif的ActiveX控制元件的步驟

用VS2008+ATL開發Gif的ActiveX控制元件的步驟

keywords:ATL,ActiveX,gif,多執行緒

VS2008+ATL開發顯示GifActiveX控制元件

baseMSDN:開發語言-VS文件-VC++-參考資訊-庫參考-ATL-Concepts-ATL Tutorial

1建立解決方案

建立一個空的解決方案,名稱GifSolution。將來包含控制元件專案和測試專案。

2建立ATL專案

解決方案檢視-右擊解決方案-新增-新建專案,彈出的對話方塊中選ATL專案,名稱為GifAnimate確定。彈出的對話方塊中選擇DLL伺服器(可選允許合併代理存根,這樣不會產生代理dll),完成後編譯,這樣工程框架就完成了。

3新增新元件

3.1
一點要說明的

元件分有視窗的和無視窗的,這裡應該用有視窗的,所以新增元件的時候,外觀不要基於none,最好基於CStatic。因為gif是動態的,應該用另一個執行緒繪製,這樣不影響主執行緒響應訊息,繪圖更加流暢。

兩種視窗的區別:無視窗的控制元件用父視窗做自己的視窗;用父視窗的DC繪圖;通過DEFAULT_REFLECTION_HANDLER()把訊息反饋給父視窗以進行響應。有視窗的控制元件,多一個CContainedWindow m_ctlStatic變數作為顯示視窗;在BEGIN_MSG_MAP / END_MSG_MAP之間,通過ALT_MSG_MAP(1)巨集對映訊息處理(1為控制元件m_ctlStatic

構造時候的內部標記,因為可能有多個視窗,預設1個,使用者可以自己新增)

3.2新增元件物件

GifAnimate專案新增類-選擇ATL控制元件,點選新增,彈出對話方塊。

第一卡:元件名稱GifAniControl

第二卡:支援連線點(因為要通知客戶端)

第三卡:預設介面

第四卡:外觀基於Static,可插入(在登錄檔註冊為OLE插入物件,可以插入Office

第五卡:實現固有屬性-背景色、邊框色、邊框可見性

確定後,編譯通過。

3.3為元件新增方法

類檢視-右鍵點選控制元件介面-新增-方法,分別新增Play Stop Pause Continue PrevFrame NextFrame函式,以操作

gif圖片。新增IsPlaying函式,新增LoadGifFromFile LoadGifFromStream函式

3.4為元件新增屬性

注意:在idl檔案裡定義一個列舉,指明播放方向。

類檢視-右鍵點選控制元件介面-新增-屬性,分別新增Loop(迴圈次數) DelayTimeFactor(時間因子) PlayDirection(播放方向)等屬性。

對於每一個屬性,控制元件類增加了一對函式,去讀寫屬性get/put_XXX,真正的變數要我們自己寫的。

4實現繪圖

新增GifImage類,用於實現繪圖功能。

在控制元件類裡,新增一個GifImage型別的變數,主要用於對圖片的控制。

完成元件介面函式和屬性的呼叫。

把視窗的控制代碼給GifImage,讓它實現繪圖。

(對於無視窗控制元件,修改元件的OnDraw函式,實現繪圖)

編譯通過就可以測試了(由於用到了GDI+,用ActiveX控制元件測試容器無法呼叫函式)。

5新增測試專案

右鍵點選解決方案-新增-新建專案,彈出的對話方塊中選MFC EXE專案,名稱GifTestDlg。建立一個基於對話方塊的專案。

匯入DLL#import "../GifAnimate/Debug/GifAnimate.dll"

初始化COMGDI+

在對話方塊初始化的時候建立控制元件,並設定屬性等。

編譯執行成功。

6新增事件

第二步已經支援連線點,idl檔案裡會有事件介面

6.1為事件介面新增函式(宣告)

類檢視-右鍵點選lib接口裡的事件介面-新增-方法,新增一個Click函式,引數為long型的xy座標。產生的效果是,在idl檔案裡,嚮導為事件介面添加了一個點選函式。

6.2生成代理類函式

生成一個代理類,實現函式。[Only in VC6, VS2008自動完成]

類檢視-右鍵點選控制元件類-新增-新增連線點,在對話方塊選中以上提到的連線點,確定。

代理類會包裝一個函式Fire_Click,觸發客戶端。

6.3觸發事件(呼叫函式)

響應控制元件類的WM_LBUTTONDOWN訊息,呼叫代理類的Fire_Click函式。

6.4客戶端關注事件

客戶端用ATL或者MFC完成一個接收器GifSink,連線、工作、斷開。

7新增屬性頁

完全可以不做而通過程式設定屬性,做這個是給懶程式設計師用的,或者只是讓元件使用更方便。

7.1新增屬性頁卡片

新增--ATL屬性頁-確定,彈出對話方塊中新增簡稱,修改元件屬性和標題,確定。

系統生成相關的對話方塊卡片資源、對應對卡片類、idl相關內容、註冊指令碼等。卡片類有一個Apply函式,用於接受屬性設定。

7.2設定屬性

修改對話方塊,增加新控制元件等等。然後處理資料變化,例如:處理EditEN_CHANGE事件,設定page元件的髒資料標記(修改但沒有確定)。最好並完成Apply函式。

7.3手工把屬性頁新增到控制元件

在控制元件類.h新增如下程式碼

PROP_ENTRY("Sides", 1, CLSID_GifProp)

8說明

1.本文只是舉例說明開發過程,拋磚而已。

2.樣例只是框架,不能直接使用,所有程式碼沒有經過測試

3.樣例接收器GifSink和屬性頁卡片沒有完成,懶了,呵呵

4.樣例背景等很多屬性沒有實現

5.使用了GDI+,但GDI+Image類的SetActiveFrame函式有問題,網上貌似沒有解決辦法。Debug版本不影響使用,Release版本沒有測試。如果有興趣,可以使用IPicture介面,網上很多。

6.本文和本樣例版權crybird所有,引用處請標記crybird