用VC 來設計ActiveX控制項

2021-06-16 01:45:28 字數 2890 閱讀 4644

用vc++來設計activex控制項

(周勇生 2023年07月05日 14:03)

我們假定專案名為test。建立工作完成後,開啟workspace檔案test.dsw,可以看到系統生成的test控制項框架,主要的類及實現功能描述見下表:

編譯此專案,生成test.ocx。在當前的developer studio環境下,這個控制項已經被自動註冊了。用系統提供的工具activex control test container可以立即進行測試,在已提供的可插入ole控制項列表中,test control就是我們生成的控制項名。如果想在其它環境下使用它,則必須先對test.ocx檔案進行註冊,具體做法是在命令列方式下鍵入命令:「regsvr32 …/test.ocx」。此後,我們就可在任何支援activex控制項的環境中使用它了。注意:.ocx檔案應該隨時更新和註冊。

當然,這樣生成的控制項沒有什麼實質性的用處,若在任何乙個包容器中測試它,則只可見乙個矩形框和乙個內切橢圓,除了縮放和位置移動功能外不能進行任何操作。

1、為控制項新增工具條和子視窗 

vc++的模板常常是很有用的工具,我們設計乙個類c*******,為控制項類t新增工具條,顯示每個按鈕及提示資訊。我們的控制項類ctestctrl是從這個類派生出來的,從而可為控制項加上設計好了的工具條。

以下是實現工具條模板類的定義 (在*******.h檔案中) :

template

class c*******

; 接著,要對testctl.h和testctl.cpp作相應的修改。在testctl.h中要先包含*******.h檔案,並將控制項類定義為:

class ctestctrl : public colecontrol, public c*******

然後,再加進訊息對映巨集:

begin_*******_map(ctestctrl)

*******_button(id_new)

*******_separator()

*******_button(id_cut)

......

*******_separator()

......

end_*******_map()

以響應定製的工具條上的各個按鈕訊息。上面的巨集在*******.h檔案中被定義。於是,在ctestctrl類的成員函式中就可以靈活使用c*******類的各項操作了。

另外,我們再為控制項設計乙個可編輯的子視窗。這實現起來很方便,在控制項類定義中直接加入cedit類的物件作為成員變數m_testedit即可。

要想真正生成我們自己的控制項視窗,則需過載colecontrol::createcontrolwindow函式。控制項視窗被建立時,該函式被呼叫,函式中先呼叫基類同名函式,再依次呼叫create*******和createtestedit 生成控制項中的工具條和子視窗。自然,我們不再需要系統預設呼叫的畫圖函式,將ctestctrl::ondraw 中畫矩形框和橢圓的部分去掉。create*******在工具條模板類中實現;createtestedit 在控制項類中自定義,函式先計算控制項視窗的客戶區和工具條的視窗大小,得到子視窗的位置,使之填滿控制項中工具條以外的全部區域,然後呼叫m_testedit.create函式,設定引數使子視窗具有使用者所希望的各項風格。

2、調整控制項視窗中各個物件的位置 

工具條和子視窗已經在控制項中生成後,還有一項重要的工作就是當控制項位置移動或大小改變時,要相應地調整工具條和子視窗的位置和大小。

colecontrol類為我們提供了這樣的函式:

colecontrol::onsetobjectrects(lpcrect lprectpos, lpcrect lprectclip); 

其中的引數給出了控制項的新位置。過載此函式,先按系統提供的功能自動調整工具條,呼叫:

::sendmessage(m_hwnd*******, tb_autosize, 0l, 0l) 

然後,同建立時一樣計算控制項視窗的客戶區(引數lprectpos已給出),呼叫getwindowrect獲得工具條的視窗大小。為使子視窗填滿控制項中工具條以外的全部區域,應先計算出相應的矩形位置並呼叫m_testedit.setwindowpos來實現子視窗的位置調整。為了美觀起見,也可在子視窗的四邊留出少許富餘。最後,呼叫基類的onsetobjectrects函式。

3、實現對控制項內物件的控制 

因為有了子視窗,實際上使用者的各項功能操作都是由子視窗來控制完成的。我們將焦點的控制權交給子視窗,使使用者能進行輸入和編輯操作,在ctestctrl::onsetfocus中呼叫m_testedit.setfocus。同樣,當控制項物件捕獲到工具條上的按鈕被按下的訊息時,要呼叫 m_testedit 的相應函式以執行使用者的命令。

工具條上提示資訊的顯示也由控制項物件來控制。在ctestctrl::onnotify函式中加入如下**:

nmhdr *pnmhdr = (nmhdr *)lparam;

bool tmp;

if (pnmhdr->code == ttn_needtext)

return on*******needtext(wparam, pnmhdr, tmp); 

這樣,當滑鼠移動並停留在工具條的某個按鈕上時,控制項物件就會呼叫工具條模板類中的on*******needtext 函式以獲得相應的提示資訊。

4、控制項視窗及內部物件的撤消

最後需要說明的是,如果我們在控制項中建立了新的工具條和子視窗,則也應該及時撤消控制項視窗及其內部物件。撤消控制項視窗,即是在 ctestedit::ondestroy函式中依次呼叫destroy*******和 m_testedit.destroywindow 來清除工具條和子視窗。

遵循以上四個工作步驟就可以很好地建立乙個帶有工具條和編輯子視窗的activex控制項。子視窗可由使用者自己定義,象通常的應用程式那樣去實現各種各樣或簡單或複雜的功能。工具條的存在使使用者執行各項操作更加方便。此外,在控制項中加進其它各種所需的物件並進行控制也是可能的。

用VC 來設計ActiveX控制項

用vc 來設計activex控制項 派生類基類實現功能 colecontrolmodule 控制項例項的初始化和撤消 ctestctrl colecontrol 控制項視窗的建立 更新及訊息處理 ctestproppage colepropertypage 控制項屬性頁的設定及與實際屬性值的交換 編...

用C 編寫ActiveX控制項

選自 紅馬天下 的blog,做了適當修改將上下兩章合併 http blogs.homer 前些日子做乙個web專案,必須自己編寫乙個activex控制項。如今的activex控制項大多是使用vb c 來開發的,而我對他們並不熟悉,因此考慮使用熟悉的c 編寫activex控制項。首先,建立乙個winf...

用C 編寫ActiveX控制項(三)

在前面我們已經完成了activex控制項的開發,接下來的就是發布它了。首先,我們建立乙個windows安裝專案,並將activex控制項的主輸出新增到專案輸出中。然後,改動activex控制項的主輸出檔案,將其register屬性改為vsdrpcom.如圖 下一步,我們改動專案屬性,將引導程式更改為...