[00004]-[2015-07-16]-[00]-[VC++ 开发Activity控件基础]
Visual C++是開發(fā)ActiveX控件的強大工具,它的特點是開發(fā)周期短、便于使用,因此它已經(jīng)成為開發(fā)ActiveX控件的主要工具之一。Visual C++集成開發(fā)環(huán)境,使用了微軟自己的類庫MFC,MFC對開發(fā)ActiveX控件提供了全面的支持,本文講述的過程均在Visual C++ 6.0(以下簡稱VC)中實現(xiàn)。
1、 創(chuàng)建工程:
對于使用過VC的人,可以很容易地創(chuàng)建一個開發(fā)ActiveX控件的工程,沒有使用過VC的人,按
照下面的操作步驟,也可以很快創(chuàng)建一個同樣的工程出來。
??? 第一步:“File”—>“New”—>“(Projects)MFC ActiveX ControlWizard”,在“Project Name”中輸入合適的工程名(以test為例),在“Location”中選擇工程文件存放路徑,然后,“OK”進入下一步;
??? 第二步:選擇你想在這個工程中生成的ActiveX控件的個數(shù)(至少一個),其余選項決定是否生成一些輔助文件,通常按照默認設置即可,“Next”進入下一步;
??? 第三步:編輯你的工程中各個類和文件的名稱,配置一些輔助選項,可以全部選擇默認設置,“Finish”進入下一步;
??? 第四步:展示向導為你的工程生成的各種配置信息,“Cancel”重新設置不滿意的選項,“OK”結束工程的創(chuàng)建。
2、? 繪制控件:
MFC將對ActiveX控件的支持封裝在COleControl類中,所有ActiveX控件均從這個類
派生。繪制控件的全部操作則集中在一個虛函數(shù)中—OnDraw(),其默認實現(xiàn)如下:
void CTestCtrl::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);
}
??? 可以看到,OnDraw()函數(shù)的默認實現(xiàn)是在矩形rcBounds中繪制一個橢圓,通過改寫OnDraw()函數(shù)中的內容,就可以繪制自己想要的控件了。需要注意的一點,控件的繪制被限制在矩形rcBounds中,繪制范圍不能超出這個矩形。
3、? 添加屬性:
ActiveX控件提供了三種類型的屬性供用戶選擇:公共屬性、具有通知特性的屬性和Get/Set
類型的屬性。下面依次對三種類型屬性的添加、初始化、新屬性值的獲取和屬性的永久保存,分別進行介紹。
??? 三種類型的屬性的添加,都遵照相同的步驟:“View”—>“ClassWizard”—>“(Automation)Add Property”—>“Add Property”對話框。注意,“Class Name”中應是你想添加屬性的控件類的名稱(如CTestCtrl)。
㈠. 公共屬性:
COleControl類提供了九種常用的屬性作為公共屬性,我們以“Caption”為例。在“Add Property”對話框中的“External Name”選擇“Caption”,“Implementation”中選中“Stock”,然后“OK”即向控件添加了Caption公共屬性。
??? COleControl類為每一個公共屬性都提供了默認的設置和獲取成員函數(shù),對于Caption屬性有SetText()和GetText()(或InternalGetText())。
COleControl類在函數(shù)DoPropExchange()中對于公共屬性都有默認的初始化,但是我們可以在成員函數(shù)OnResetState()中,為公共屬性設置我們自己想要的初始值。Caption默認的初始值為空,可以使用成員函數(shù)SetText( LPCTSTR pszText ),為其設置任意的字符串。
??? 我們可以通過調用函數(shù)GetText()或InternalGetText()獲得當前的Caption屬性值。需要注意的是,對于GetText()函數(shù),在調用之后,需要調用span lang="EN-US">SysFreeString()函數(shù)以釋放資源。此外,GetText()函數(shù)的返回值為BSTR類型,經(jīng)常需要與大家常用的CString字符串類型進行變換:BSTR可以直接賦值CString,也可以調用API函數(shù)::SysAllocString(Cstring);但是將CString轉換成BSTR,必須調用函數(shù)CString::AllocSysString()。InternalGetText()函數(shù)則無上述煩惱。
??? 對于公共屬性的永久保存,在COleControl類的成員函數(shù)DoPropExchange()有默認實現(xiàn),就無需大家費心了。
㈡. 具有通知特性的屬性:
在“Add Property”對話框的“Implementation”中選中“Member variable”,即選擇了向控
件添加具有通知特性的屬性。在“External Name”中輸入屬性的名字(Shape),在“Type”中選擇變量類型(BOOL),“Variable Name”和“Notification function”中會自動生成默認的變量名(m_shape)和通知函數(shù)名(OnShapeChanged),當然也可以手工輸入自己習慣的名字。最后,“OK”便向控件添加了一個具有通知特性的屬性。
??? 對于屬性的初始化和永久保存,只要在DoPropExchange()函數(shù)中調用PX_函數(shù)即可。按照上面添加的屬性例子,可以如是調用:PX_Bool(pPX, _T("Shape"), m_bShape, FALSE)。其中,“FALSE”為變量“m_bShape”即屬性“Shape”的初始值。
??? 至此,不得不先說一下控件的屬性對話框了。MFC將控件的屬性對話框封裝在類COlePropertyPage中,所有控件的屬性對話框都派生自這個類。控件的屬性對話框,是控件開發(fā)者提供給控件用戶、用于定制控件外觀的通訊工具,控件用戶可以通過它來修改控件的某些屬性。COlePropertyPage類中最重要的成員當屬DoDataExchange()函數(shù)了,控件開發(fā)者就是通過在其中調用DDP_函數(shù)把控件的屬性與控件屬性對話框中的各種控件聯(lián)系起來的。對于控件的公共屬性,在為屬性對話框中的相應控件添加變量的時候,可以在“Optional property name”中選擇相應的公共屬性,則屬性對話框類就會在DoDataExchange()函數(shù)種自動添加相應的DDP_函數(shù),例如,對于Caption屬性,就會自動添加這樣的語句:DDP_Text(pDX, IDC_CAPTION_EDIT, m_strCaption, _T("Caption") );但是對于用戶添加的自定義屬性,則必須手工輸入DDP_函數(shù),例如,對于前面添加的“Shape”屬性,應添加如下語句:DDP_Check(pDX, IDC_SHAPE_CHECK, m_bShape, _T("Shape") )
。
??? 對于“Notification function”需要補充說明的是,雖然在相應的函數(shù)中,屬性添加向導會自動添加函數(shù)SetModifiedFlag(),但是如果需要在屬性被改變時,相應改變控件的顯示,則需開發(fā)人員手工加入函數(shù)InvalidateControl()(它會激發(fā)OnDraw()函數(shù)的調用)。
㈢. Get/Set類型的屬性:
在“Add Property”對話框的“Implementation”中選中“Get/Set mothods”,即選擇了向控
件添加“Get/Set類型的屬性”。 在“External Name”中輸入屬性的名字(Color),在“Type”中選擇變量類型(OLE_COLOR),“Get function”和“Set function”中會自動生成默認的函數(shù)名“GetColor”和“SetColor”,當然也可以手工輸入自己習慣的函數(shù)名。最后“OK”,便完成了向控件添加Get/Set類型的屬性。
?
轉載于:https://www.cnblogs.com/Auris/p/4652187.html
總結
以上是生活随笔為你收集整理的[00004]-[2015-07-16]-[00]-[VC++ 开发Activity控件基础]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓开发笔记——关于图片的三级缓存策略(
- 下一篇: [SoapUI] 在Test Step