VC使用ActiveX控件常见问题
轉自:http://lingchuangsong.blog.163.com/blog/static/126932322008631104133309/
?
一方面,它表示將你聯系到Microsoft、Internet和業界的新技術的小型快速的可重用組件。它與開發語言無關,任何支持 ActiveX控件的軟件開發平臺(如VB、VC++、Access、VFP、Delphi、PowerBuilder等)上,都可以使用ActiveX控件,程序員可以像使用Windows標準控件一樣使用不同廠商開發的ActiveX控件。這樣就實現了軟件開發的工業化,大大地提高了軟件的生產效率。
另一方面,它代表Internet與應用程序的一種集成策略。用戶可以從Internet上下載ActiveX控件,也可以通過網絡在本地機上調用遠程機上的ActiveX控件,還可以將ActiveX控件加入到Internet主頁上。
既然ActiveX控件對程序員是如此地重要,那么如何用好ActiveX控件也就成為軟件開發者所關心的問題。本文以VC++5.0為開發工具,以一個項目名為Test的應用程序為例,就筆者在控件使用中遇到的一些問題加以討論。
要想在應用程序中使用ActiveX控件,必須使你的應用程序成為ActiveX控件包容器。ActiveX 控件包容器就是完全支持ActiveX控件,并能把控件組合進自己的窗口或對話框的父應用程序。利用MFC的AppWizard,你可以很方便地創建你的包容器程序。事實上,在用AppWizard創建新的應用程序時,你的應用程序就被缺省設置為控件包容器,即在第3步選中支持ActiveX Controls的復選框。如果你在創建過程中沒有選擇這項技術支持,以后也可以手動地加入這項支持。
步驟如下:
1. 在項目的應用類的.cpp文件(本例中為test.cpp)的Initinstance函數中加入對函數AfxEnableControlContainer()的調用,如下所示:
BOOL CTestApp::InitInstance()
{
AfxEnableControlContainer();
...
}
在使用一個已注冊的ActiveX控件之前,必須先用組件廊將該控件添加到應用程序中,步驟如下:
1.從Project菜單選擇Add To Project下的Components and Controls。
2.在彈出的對話框中雙擊Registered ActiveX Control子目錄,打開此目錄。
3.選擇你需要的控件,點擊Insert按鈕,彈出Confirm Classes對話框。
4.在列出的類名中選擇需要的類(缺省為全選中,最好接受缺省設置),點擊OK,關閉Confirm Classes對話框。
5.點擊Close關閉組件廊,該控件的圖標即加入到對話框編輯器的控件面板上。
這樣,我們就可以在對話框中像使用Windows標準控件那樣使用該控件了。但在某些應用中,你可能需要在非對話框容器(如應用程序的窗口)中嵌入ActiveX控件。這時沒有對話框編輯器,我們應怎樣在非對話框容器中使用ActiveX控件呢?
當組件廊將ActiveX控件添加到你的應用程序后,組件廊會創建一些包裹類(即在Confirm Classes對話框中列出的那些類)。其中有一個類的基類是CWnd,該類是控件的包裹類,它被用作控件與控件包容器之間的接口,有兩個公有的Create成員函數:
virtual BOOL Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID,
CCreateContext* pContext = NULL)
和BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID,
CFile* pPersist = NULL, BOOL bStorage = FALSE,
BSTR bstrLicKey = NULL)
我們就可以使用該控件的包裹類的Create函數在非對話框容器中動態地創建此控件的實例。
步驟如下:(本例中欲加入的控件名為MSFlexGrid ,CMSFlexGrid是控件的包裹類,msflexgrid.h是包裹類的頭文件)
1.在視類頭文件(本例中為TestView.h)中的類定義前加上
#include “msflexgrid.h”
2. 在TestView.h中CTestView類定義的protected部分加上控件包裹類類型的成員變量聲明:
class CTestView : public CView
{
...
protected:
CMSFlexGrid m_fgrid;
...
};
3. 用ClassWizard為類CTestView 添加消息WM_CREATE的處理函數CTestView::OnCreate,在此函數中,調用控件類CMSFlexGrid的Create函數:
int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// ****** Add your code below this line ********** //
m_fgrid.Create(NULL, WS_VISIBLE,
CRect(50,50,100,100), this, 0); //用this指針作為指向父窗口的指針 m_fgrid.SetCols(2);
m_fgrid.SetRows(10);
m_fgrid.SetTextMatrix(0,0,"序號");
m_fgrid.SetTextMatrix(0,1,"姓名");
// ****** Add your code above this line ********** //
return 0;
}
4.重新鏈接工程,運行。可以看到當應用程序的視窗生成時,控件也動態地生成了。
5.如果你以后還想改變控件的位置和大小,可以繼承CWnd::MoveWindow()函數。例如,若想使控件充滿整個窗口,并在父窗口移動和縮放時也隨之移動和縮放,可以添加消息WM_SIZE的處理函數OnSize,并加入如下代碼:
void CTestView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
m_fgrid.MoveWindow(0,0,cx,cy);
}
通常情況下,我們可以用兩種方法來存取對話框中的控件:1、將控件與對話框的成員變量相關聯,通過對話框數據交換DDX來實現控件和對應的成員變量之間的數據交換(詳情請參閱VC聯機幫助ActiveX Control Containers: Connecting an ActiveX Control to a Member Variable);2、調用函數CWnd::GetDlgItem來取得指向控件的指針。
有些ActiveX控件沒有用戶界面,在運行時不可見。如果你在對話框中加入了運行時不可見的ActiveX控件,并想用CWnd::GetDlgItem來存取此控件,此控件將不能正常工作。要得到代表此控件的對象指針,可采取以下兩種方法之一:
1. 在ClassWizard的成員變量標簽中,選擇此控件的ID,點擊Add Variable,然后輸入一個成員變量名,在Category中選擇”Control”,在Variable type中選擇控件類。
2. 聲明一個此控件類型的局部變量,并將它作為一個對話框項。加入類似如下所列的代碼(其中CmyCtrl是控件類,IDMYCTRL1是控件ID):
CMyCtrl myCtrl;
myCtrl.SubclassDlgItem(IDC_MYCTRL1, this);
// ... 使用控件myCtrl ...
myCtrl.UnsubclassWindow();
下面舉一個例子加以說明。本例將在對話框中加入一個運行時不可見的計時控件Timer Object。該控件在一個的預定的時間間隔過去之后引發 Timer 事件,該時間間隔儲存于該控件的 Interval 屬性中,它以千分之一秒為單位指定時間的長度。本例用一個成員變量m_num來計數,每隔Interval時間遞增1,當m_num計到10時,重置為0,并將時間間隔m_Interval增加200毫秒,并分別在兩個靜態框中顯示當前的m_num和m_Interval。
步驟如下:
1.用組件廊將Timer控件加入到項目Test中。
2.在項目中插入一個新的對話框,類名為CTestDlg。
3.在對話框模板中加入控件Timer Object(包裹類為CIeTimer),如圖2的右下角。打開屬性對話框,設置ID為IDC_TIMER1。再切換至All屬性頁,設置Interval為200。
4.在對話框模板中添加靜態控件,Caption為“The current interval is:”。
5.添加一個不帶Caption的靜態控件,打開屬性對話框,設置ID為IDC_STATIC1。再切換至Extended Styles屬性頁,選中Static edge復選框。
6.按下Ctrl鍵的同時雙擊靜態控件IDC_STATIC1,彈出Add Member Variable對話框,第一項中填寫變量名m_text1,Category項中選擇Control,Variable type項中選擇CStatic。
7.添加靜態控件“The current number is:”。
8.重復步驟5到步驟6,添加一個不帶Caption的靜態控件(ID為IDC_STATIC2),變量名為m_text2。
9.運行ClassWizard并選擇Message Map屬性頁,在Class name 中選擇CTestDlg,Object IDs中選擇IDC_TIMER1,在Messages中選擇Timer,點擊Add Function…按鈕,加入OnTimerTimer1()處理函數。
若采用第一種方法,則按前面所述方法用ClassWizard給此控件類添加一個成員變量m_timer,并在OnTimerTimer1函數中添加如下代碼:
void CTestDlg::OnTimerTimer1()
{
// TODO: Add your control notification handler code here
char buf[10];
m_num++;
if(m_num>=10)
{
m_num=0;
m_interval+=200;
m_timer.SetInterval(m_interval);
}
_itoa(m_interval,buf,10);
m_text1.SetWindowText (buf);
_itoa(m_num,buf,10);
m_text2.SetWindowText (buf);
}
若采用第二種方法,不需要添加此控件類的成員變量,只需將加灰顯示的語句用下列語句代替即可:
CIeTimer m_timer;
m_timer.SubclassDlgItem(IDC_TIMER1,this);
m_timer.SetInterval(m_interval);
m_timer.UnsubclassWindow();
運行之后可以看到計數的步調越來越慢了(時間間隔越來越大了)
ActiveX控件大大地簡化了開發者的工作,靈活地使用控件能使開發者高效地開發出各種軟件。以上是筆者在使用控件的過程中總結出的一些實踐經驗,希望對大家有所幫助。
總結
以上是生活随笔為你收集整理的VC使用ActiveX控件常见问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Activex test contact
- 下一篇: vs2008 外部调用ActiveX控件