用VS2008+ATL開發Gif的ActiveX控制元件的步驟
keywords:ATL,ActiveX,gif,多執行緒
用VS2008+ATL開發顯示Gif的ActiveX控制元件
base:MSDN:開發語言-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
3.2新增元件物件
為GifAnimate專案新增類-選擇ATL控制元件,點選新增,彈出對話方塊。
第一卡:元件名稱GifAniControl
第二卡:支援連線點(因為要通知客戶端)
第三卡:預設介面
第四卡:外觀基於Static,可插入(在登錄檔註冊為OLE插入物件,可以插入Office)
第五卡:實現固有屬性-背景色、邊框色、邊框可見性
確定後,編譯通過。
3.3為元件新增方法
類檢視-右鍵點選控制元件介面-新增-方法,分別新增Play Stop Pause Continue PrevFrame NextFrame函式,以操作
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"
初始化COM和GDI+
在對話方塊初始化的時候建立控制元件,並設定屬性等。
編譯執行成功。
6新增事件
第二步已經支援連線點,idl檔案裡會有事件介面
6.1為事件介面新增函式(宣告)
類檢視-右鍵點選lib接口裡的事件介面-新增-方法,新增一個Click函式,引數為long型的x,y座標。產生的效果是,在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設定屬性
修改對話方塊,增加新控制元件等等。然後處理資料變化,例如:處理Edit的EN_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。