vc++技術內(nèi)幕(第四版)筆記(第8章)最近很多朋友喜歡上設計,但是大家卻不知道如何去做,別擔心有圖老師給你解答,史上最全最棒的詳細解說讓你一看就懂。 第八章:使用ActiveX控件 1,ActiveX控件是一個直接插入到C++程序中的軟件模塊,以前常稱OLE控件(OCX),是基于MS-COM技術。 2,ActiveX控件與普通Windows控件比較: 相同點:ActiveX控件也可看成是一個子窗口(可以看成這樣的)。 如果想在對話框上加入ActiveX控件,則只要在對話框編輯器中,把ActiveX控件放在適當?shù)奈恢蒙?,并在資源模板中標識該控件。如果要在運行的過程中建立ActiveX控件,則可以調(diào)用響應控件類的Create成員函數(shù),而且通常在父窗口的WM_CREATE消息控制函數(shù)中調(diào)用。 不同點:屬性和方法。 ActiveX控件不像普通控件那樣發(fā)送以WM_打頭的通知消息給它的包容器窗口,而是激發(fā)事件。事件實際上是由控件調(diào)用包容器函數(shù)。像普通的控件通知消息一樣,事件并沒有返回值傳給ActiveX控件。事件如lick,KeyDown。但對于客戶來說時間與控件的通知消息是一樣的。 3,在MFC庫中,ActiveX控件就像子窗口一樣,但在控件窗口和包容器窗口之間有一層重要代碼。實際上,ActiveX控件可能沒有窗口。當調(diào)用Create函數(shù)時,并不是直接建立控件窗口,而是把控件代碼載入進來,并激發(fā)一個“實地激活”(in-place activation)命令。然后ActiveX控件再建立它自己的窗口,通過MFC的CWnd類指針我們可以訪問該窗口。不過客戶程序最好不要使用ActiveX控件的hWnd句柄。 4,通常ActiveX控件會保存在擴展名為OCX的動態(tài)連接庫中。包容器程序回根據(jù)Windows注冊表利用COM技術在需要的時候裝入動態(tài)連接庫。 說明: 1)暫時可以這樣認為,如果使用了ActiveX控件,那么在運行時候要裝入該ActiveX控件代碼。顯然在發(fā)布含有ActiveX控件的程序時候,必須要包含相應的OCX文件,而且還得提供一個合適的安裝程序。 5,安裝ActiveX控件: 1)把找到的ActiveX控件動態(tài)連接庫拷到硬盤上。 2)在WINDOWS注冊表中登記注冊。(可使用Regsvr32命令行命令) 3)在使用該控件的項目中安裝該控件。(選擇Project菜單,再選擇Add To Project,再選擇Components And Controls,再選擇Registered ActiveX Controls,這時列表框列出系統(tǒng)已經(jīng)注冊所有的ActiveX控件,選擇需要的控件INSERT即可。) 6,ActiveX控件包容器編程: 1)不管ActiveX控件是作為對話框控件,還是做為“子窗口”,MFC和ClassWizard都支持。 2)ActiveX控件編寫者設計了ActiveX控件屬性供使用者在設計時訪問。所有的ActiveX控件屬性(包括設計時屬性),在運行時都是可以訪問的,不過有些屬性可能被設計成只讀的。 3)當在項目中插入ActiveX控件時,ClassWizard就會產(chǎn)生相應的CWnd的派生類C++類,來滿足對空間的方法和屬性進行訪問要求??丶膶傩院头椒ǘ加邢鄳某蓡T函數(shù),同時生成的類還有一個構造函數(shù)可用以動態(tài)創(chuàng)建ActiveX控件的事例。 4)當在項目中插入ActiveX控件ClassWizard生成的CWnd的派生類C++類中,可以看到其成員函數(shù)的代碼中都有對InvokeHelper函數(shù)的調(diào)用,InvokeHelper函數(shù)的第一個參數(shù)都和對應的屬性或方法在ActiveX控件中的分發(fā)(dispatch)ID(標識ActiveX控件的方法或?qū)傩缘模┫鄬?。通過查看ActiveX控件hlp文件可以發(fā)現(xiàn),ActiveX控件的方法在生存的C++類中都有同名的成員函數(shù)與之對應,ActiveX控件的屬性都有一組Get和Set函數(shù)對其操作,其中ActiveX控件的方法和屬性操作與生成的C++類成員函數(shù)相關聯(lián)都是通過InvokeHelper函數(shù)的調(diào)用來完成的,InvokeHelper函數(shù)的第一個參數(shù)是由Component Gallery(控件提供者)提供的。因為經(jīng)過這樣的處理,所以我們?nèi)绻{(diào)用ActiveX控件的方法或?qū)ζ鋵傩赃M行取和設置操作,只需調(diào)用生成的C++類對應的成員函數(shù)便可。下面對InvokeHelper單獨說明: CWnd::InvokeHelper 說明: Call this member function to invoke the OLE control method or property specified by dwDispID, in the context specified by wFlags. wFlags:可以為下面些值,指明調(diào)用InvokeHelper的目的。 //[ DISPATCH_METHOD ] The member is invoked as a method. If a property has the same name, both this and the DISPATCH_PROPERTYGET flag may be set. vtRet: pvRet: pbParamInfo:一般都設置為NULL 5)AppWizard對ActiveX控件的支持是通過在生成的應用程序類的成員函數(shù)InitInstance中插入(AfxEnableControlContainer();),同時在響應項目文件的StdAfx.h文件中插入(#includeafxdisp.h)(原因可參考書P38一些說明)。 如果項目中不包含這兩行,而又要加入ActiveX控件,則只要手工加入上面兩行代碼即可。 6)可以對話框編輯器來生成對話框的模板中加入一個或多個ActiveX控件,這樣我們可以在對話框模板生成的類中添加數(shù)據(jù)成員或事件控制函數(shù)來獲取ActiveX控件的屬性或?qū)ζ淇刂啤?/p> 注意:(詳細見書P159頁的[致WIN32程序員]) 實際上,資源模板并不是在對話框編輯器中所看的那樣。函數(shù)CDialog::DoModal在把對話框模板交給WINDOWS內(nèi)部的對話框過程之前,要先對模板進行預處理,即:它先會去掉所有的ActiveX控件,有剩下的控件建立對話框窗口,然后再裝入ActiveX控件,激活它們并在正確的位置上創(chuàng)建它的窗口。 當模式對話框運行時候,MFC處理所有送給對話框消息時,是不管是有普通控件發(fā)送的,還是ActiveX控件發(fā)送的。故ActiveX控件雖然不是對話框模板一部分,但用戶仍然可以用TAB鍵在所有的控件間切換。 7)調(diào)用UpdateData(FALSE)將會從所有的對話框控件中讀取所有屬性值。如果只需要得到ActiveX控件屬性的話,可以調(diào)用ActiveX控件生成的C++類中Get函數(shù)(同樣設置調(diào)用Set函數(shù)),這樣就提高了效率。 8)事例部分代碼對比說明: 代碼一: CDataExchange dx(this,TRUE); 說明一: CDataExchange類構造函數(shù):(注,在MFC|SRC|AFXWIN.H中可以看到其構造函數(shù)聲明,在MFC|SRC|WINCORE.CPP文件中可以看到其構造函數(shù)的定義。) (本文來源于圖老師網(wǎng)站,更多請訪問http://www./bianchengyuyan/)原型:CDataExchange::CDataExchange(CWnd* pDlgWnd, BOOL bSaveAndValidate); 定義: CDataExchange::CDataExchange(CWnd* pDlgWnd, BOOL bSaveAndValidate) //其中m_pDlgWnd和m_bSaveAndValidate是CDataExchange數(shù)據(jù)成員,可以通過這中方式給它們賦值。 說明二: //CDataExchange does not have a base class. 代碼二:(是為了比較代碼一做些說明的) (本文來源于圖老師網(wǎng)站,更多請訪問http://www./bianchengyuyan/)void CActiveXDialog::DoDataExchange(CDataExchange* pDX) 來源:http://www./n/20160219/1611590.html 第二天:Microsoft基本類庫應用程序框架 ◎MFC是C++的Microsoft Windows API,如果想要開發(fā)WINDOWS的應用程序當然VC/MFC是開發(fā)環(huán)境的首選。 這一章節(jié)主要介紹了MFC庫的優(yōu)點,其實我本人認為在某些特定環(huán)境下其實MFC不一定就象說的那樣好。我想不會有人用純VC做MIS系統(tǒng)吧,太累了。我是這樣理解編程序的,如果把學編程看成學武的話,C/C++語言及編程思想(OOP)是內(nèi)功,API是基本功(編程思想是內(nèi)功、API是基本功這適用于任何WIN32編程,不論Visual C++、Delphi、C++Builder、VB......),VC/MFC應該不同武功其中的一種,不同的學習方法效果不一樣,只要下工夫也都可以達到一定的境界。真正的高手是有著深厚的內(nèi)功,扎實的基本功,至于武功招數(shù)無所謂了,隨便一站不丁不八全無破綻,無招勝有招了。對不住扯遠了。 C++可以通過類庫來進行擴展,我們除了可以使用隨編譯器提供的類庫外還可以很方便使用軟件公司銷售的類庫產(chǎn)品,甚至可以自己開發(fā)。而應用程序框架是一種類庫的超集,它定義了程序的結(jié)構。 下面給出兩個示例程序(一個是書上的一個是我寫的): 雷神建議: 雖然現(xiàn)在很多書都附CD,CD上有書中所有示例的源代碼,但還是應該親自在VC6用手敲進去。這樣可以加深印象以及感受一下編譯除錯后程序正確運行時的樂趣,因為是純手工打造。自從我敲了近一百個代碼示例后,由于筆誤的BUG就很少了,打字速度也提高了。而且最好在原示例代碼的基礎上做些改動例如別千篇一律的顯示HELLO WORLD!換點別的,這樣做也可以加深對示例程序的理解。 1、打開VC++6從菜單選擇NEW,給項目命名為”MyApp01“。 2、選擇MFC AppWizard[exe] 選項,除STEP 1選擇單文檔外其他STEP缺省。 3、在Class View選擇CMyApp01View類的OnDraw()成員函數(shù)雙擊會在C++編譯器看到以下內(nèi)容 書上的例子: 1、先建立一個Win32 Application的應用程序。 2、選擇Project-Add to project-Files,分別創(chuàng)建一個名為MyApp.h和一個名為MyApp.cpp的文件。 3、添加代碼:(最好照敲以下代碼到編譯器,別用Ctrl+C/Ctrl+V) class CMyApp:public CWinApp //見下② class CMyFrame:public CFrameWnd //***************************************************** #include "afxwin.h" BOOL CMyApp::InitInstance () BEGIN_MESSAGE_MAP(CMyFrame,CFrameWnd) CMyFrame::CMyFrame(){ void CMyFrame::OnPaint () 5、再Ctrl+F5,哈成功了。 讓我們看看這個程序中的一些元素。 ①WinMain函數(shù):并非不存在只是已經(jīng)被隱藏在應用程序框架內(nèi)部。 ②CMyApp類:CMyApp類的對象代表一個應用程序,CWinApp基類決定它的大部分行為。 ③應用程序的啟動:當開始運行應用程序時WINDOWS會調(diào)用WinMain函數(shù),WinMain會查找該應用程序的全局對象theApp。 ④CMyApp::InitInstance成員函數(shù):發(fā)現(xiàn)theApp后自動調(diào)用重載的虛函數(shù)InitInstance來完成主窗口的構造和顯示工作。記住這個函數(shù)。 ⑤CWinApp::Run成員函數(shù):WinMain在調(diào)用InitInstance之后緊接著調(diào)用Run函數(shù),它被隱藏在基類中負責傳遞應用程序的消息給相映的窗口。(我把它理解為好象SDK的窗口的過程函數(shù)不知對不對) ⑥CMyFrame類:此類的對象代表著應用程序的主窗口。它的構造函數(shù)調(diào)用基類CFrameWnd的Create函數(shù)創(chuàng)建具體的窗口結(jié)構。 (本文來源于圖老師網(wǎng)站,更多請訪問http://www./bianchengyuyan/)⑦CMyFrame::OnLButtonDown函數(shù):演示消息處理機制,當鼠標坐鍵被按下這一事件被映射到CMyFrame的OnLButtonDown函數(shù)上,如果你選擇F5進行編譯運行的話可以在調(diào)試窗口看到TRACE宏顯示的類似下面的信息 ⑧CMyFrame::OnPaint函數(shù):應用程序每次重新繪制窗口都需要調(diào)用此函數(shù),將顯示"Hello World!"放在這里是因為每次窗口發(fā)生變化時保證"Hello World!"被顯示,你可以試著將語句: 寫在別出,例如寫在 ⑧關閉應用程序:用戶關閉應用程序時會有一系列事件發(fā)生。首先CMyFrame對象被刪除,然后退出Run,進而退出WinMain,最后刪除CMyApp對象。 通過上面的示例我們看見程序的大部分功能包含在基類CWinApp和CFrameWnd中,我們只寫了很少的函數(shù),便可以完成很復雜的功能。所以應用程序框架不僅僅是一種類庫,它還定義了應用程序的結(jié)構,除了基類外還包括WinMain函數(shù),以及用來支持消息處理、診斷、DLL、等都包含在應用程序框架中。 來源:http://www./n/20160219/1602452.html |
|