Windows程序設(shè)計的關(guān)鍵技術(shù)_第1頁
Windows程序設(shè)計的關(guān)鍵技術(shù)_第2頁
Windows程序設(shè)計的關(guān)鍵技術(shù)_第3頁
Windows程序設(shè)計的關(guān)鍵技術(shù)_第4頁
Windows程序設(shè)計的關(guān)鍵技術(shù)_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

消息驅(qū)動機(jī)制Windows程序和傳統(tǒng)程序的根本區(qū)別: 傳統(tǒng)程序是通過調(diào)用系統(tǒng)函數(shù)來獲得用戶輸入,而Windows程序是通過操作系統(tǒng)發(fā)送的消息來處理用戶輸入。不了解事件編程就無法深入Windows程序和Web設(shè)計的殿堂。面向?qū)ο蟮木幊?,要?zhí)行一個任務(wù)有兩種啟動方式:客戶/服務(wù)器模式。委托/事件模式。上海大學(xué)機(jī)電工程與自動化學(xué)院雷電事件概念事件字面意義:事件可以是你認(rèn)為的任何可能發(fā)生的事情。事件:是事件源中的方法,該方法在被調(diào)用時生成事件,本質(zhì)上是一種特殊的函數(shù)指針,通過調(diào)用事件方法“激發(fā)”該事件。事件源(事件發(fā)生器):是定義事件和包含事件的對象。事件接收器:是接收事件的對象。事件處理程序:是事件接收器中接收事件的方法。掛鉤事件(定閱事件):是指將事件與事件處理程序相關(guān)聯(lián)。解除掛鉤事件(撤銷定閱事件):是指使事件與事件處理程序分離。上海大學(xué)機(jī)電工程與自動化學(xué)院雷電鼠標(biāo)事件處理程序:OnClick客戶定閱鼠標(biāo)事件回調(diào)(通知)客戶事件處理程序:OnSubmit定閱鼠標(biāo)事件回調(diào)(通知)事件發(fā)生器事件ButtonClick最重要的意義是:事件源模塊不用關(guān)心誰來響應(yīng)事件,使系統(tǒng)間的模塊間的關(guān)系是一種松散的關(guān)系。上海大學(xué)機(jī)電工程與自動化學(xué)院雷電事件的處理主要有兩種方法委托式的事件處理模式(函數(shù)回調(diào),函數(shù)指針的集合)類的層次體系的虛函數(shù)覆蓋。(多態(tài)性)上海大學(xué)機(jī)電工程與自動化學(xué)院雷電事件機(jī)制的實(shí)現(xiàn)VC++6.0沒有提供支持:雖然C語言所具有的函數(shù)回調(diào)對此非常適用,而C++卻始終缺少這種針對對象方法的回調(diào)。函數(shù)指針只能使用全局函數(shù)或靜態(tài)函數(shù)。例:

typedefvoid(*EventFunc)(intx,inty); EventFunconBnEvent[]=; onBnEvent[0]=myOnBn; myOnBn(intx,inty){….}

onBnEvent[0](3,140); onBnEvent[1](3,50);聲明委托(聲明事件簽名)定義事件對象事件源引發(fā)事件處理事件(全局函數(shù))訂閱事件上海大學(xué)機(jī)電工程與自動化學(xué)院雷電VC++7.0提供下面的關(guān)鍵字支持面向?qū)ο蟮氖录幊?/p>

event_source、event_receiver __event、 __hook、__unhookVC++8.0提供下面的關(guān)鍵字支持托管代碼的事件編程

delegate、event .NET對不同類型的對象預(yù)定義了大量事件 訂閱事件+=取消訂閱-=VC++9.0STL增加了function類模板,bind函數(shù),以支持本地的面向?qū)ο蟮氖录幊躺虾4髮W(xué)機(jī)電工程與自動化學(xué)院雷電例:.NET事件機(jī)制編程usingnamespaceSystem;delegate

voidDel(int,float);refclassEventSource{public:

eventDel^E;

voidfire(inti,floatf){E(i,f);}};refclassEventReceiver{public:

voidHandler(inti,floatf){Console::WriteLine("Receive:{0},{1}",i,f);}};

intmain(){EventSource^es=gcnewEventSource(); EventReceiver^er=gcnewEventReceiver(); es->E+=gcnewDel(er,&EventReceiver::Handler); es->fire(1,3.14);}輸出結(jié)果:Receive:1,3.14事件對象聲明委托(聲明事件簽名)事件響應(yīng)成員函數(shù)創(chuàng)建對象Hook事件激發(fā)事件上海大學(xué)機(jī)電工程與自動化學(xué)院雷電標(biāo)準(zhǔn)C++庫的擴(kuò)展(新)#include<iostream>#include<vector>#include<functional>usingnamespacestd;usingnamespacestd::tr1;usingnamespacestd::tr1::placeholders;classCMyControl{public: typedeffunction<void(int,int)>EventHandle; vector<EventHandle>m_onBnEvent;

voidhook(EventHandleonEventHandle) { m_onBnEvent.push_back(onEventHandle); }

voidnotifyAll() { intx=100; inty=200;for(vector<EventHandle>::iteratorit=m_onBnEvent.begin(); it!=m_onBnEvent.end();++it) { EventHandle&onEventHandle=*it;

onEventHandle(x,y);

} }};訂閱事件成員函數(shù)事件對象通知客戶代碼處理事件成員函數(shù)激發(fā)事件,回調(diào)客戶代碼處理事件上海大學(xué)機(jī)電工程與自動化學(xué)院雷電classCMyView{

public: CMyControlm_ctrl; CMyView() { m_ctrl.hook(bind(&CMyView::onEventHandle,this,_1,_2)); } voidonEventHandle(intx,inty) { cout<<x<<""<<y<<endl; }};int_tmain(intargc,_TCHAR*argv[]){ CMyViewm; m.m_ctrl.notifyAll(); return0;}訂閱事件綁定參數(shù)到可調(diào)用成員函數(shù)輸出:100200上海大學(xué)機(jī)電工程與自動化學(xué)院雷電例HTML事件<html><body><script> functiontest() { Text2.value+=Text1.value; }</script><inputid="Text1"type="text"value="a"><inputid="Text2"type="text"><p></p><inputid="Button1"type=buttonvalue="clickme"onclick="test()"></body></html>上海大學(xué)機(jī)電工程與自動化學(xué)院雷電覆蓋事件方法你的類從基類中派生而來,且基類中中已有事件處理函數(shù),針對不同的處理,可通過覆蓋這些事件方法來設(shè)計你所希望的對應(yīng)事件處理。

classCMyView:publicCView {…. public: virtualvoidOnDraw(CDC*pDC) {……} };上海大學(xué)機(jī)電工程與自動化學(xué)院雷電Windows消息處理消息泵WndProc地址PostMessage()SendMessage()消息n+1消息n+2消息n+3窗口對象非MFC窗口用簡單的case語句來編程WndPro(每個case語句執(zhí)行一些函數(shù),或調(diào)用其他一些函數(shù)。MainWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){ switch(message) { caseWM_CREATE: :::case語句不能很好地適應(yīng)C++和封裝技術(shù)。上海大學(xué)機(jī)電工程與自動化學(xué)院雷電MFC消息映射表為什么要消息映像?為什么不為每個窗口消息調(diào)用一個預(yù)定義的虛擬函數(shù)?因?yàn)樗糃PU。上海大學(xué)機(jī)電工程與自動化學(xué)院雷電MFC的消息映射與命令傳遞VC++中有一個ClassWizard(類向?qū)В?,它會幫助用戶建立消息映射和消息處理函?shù)的框架,消息和函數(shù)都由MFC缺省的命名方式命名。根據(jù)消息處理函數(shù)的不同,消息分三類():窗口消息:由MFC的窗口類(CWnd)對象來處理,即這類消息處理函數(shù)一般是CWnd類的成員函數(shù)。有缺省窗口處理函數(shù)控制通知消息:來自子窗口的通知消息。參數(shù)中包含子窗口標(biāo)識和通知碼。通知碼是子窗口定義的一些常量。有缺省處理,但一般要重載。*若CWnd派生類沒有重載上述兩類消息處理函數(shù),則消息映射機(jī)制會轉(zhuǎn)由其基類處理(最終是CWnd類);若CWnd類也沒有定義對應(yīng)的消息處理函數(shù),則調(diào)用Windows缺省的窗口函數(shù)處理。命令消息:來自菜單、工具欄,加速鍵的通知消息,參數(shù)中包括命令標(biāo)識(ID)號,它是應(yīng)用程序自定義的一些常量,由程序員編寫消息處理函數(shù)。MFC也定義了一些缺省的標(biāo)準(zhǔn)命令消息處理函數(shù),上海大學(xué)機(jī)電工程與自動化學(xué)院雷電8.8MFC的消息映射與命令傳遞程序類型搜索路徑SDI單文檔當(dāng)前視圖→當(dāng)前文檔→文檔模板→主框架窗口→應(yīng)用程序?qū)ο驧DI多文檔當(dāng)前視圖→當(dāng)前文檔→創(chuàng)建文檔的文檔模板→活動的子框架窗口→主框架窗口→應(yīng)用程序?qū)ο髮υ捒虍?dāng)前對話框→對話框的父窗口→應(yīng)用程序?qū)ο驧FC對命令消息搜索相應(yīng)消息處理函數(shù)的過程是:由菜單、工具欄等用戶界面對象產(chǎn)生的命令消息,首先送給主框架窗口的標(biāo)準(zhǔn)MFC窗口函數(shù),然后窗口函數(shù)把命令傳給MFC主框架窗口對象,進(jìn)行命令消息的派送,并按下表的次序進(jìn)行消息匹配。若找不到,則先繼續(xù)搜索其基類的消息映射入口表,若都找不到,再迂回到下一個對象進(jìn)行處理。都找不到,則由缺省的Windows消息處理函數(shù)結(jié)束該命令消息。為了提高消息匹配的效率,MFC內(nèi)部有一個消息緩沖池,使用以消息值為關(guān)鍵字的散列(哈希)查找,這里可存放512條最近使用過的消息映射入口表項(xiàng)的有關(guān)信息(只需放入口表項(xiàng),即兩個指針)。僅在消息緩沖池中匹配不到才進(jìn)行前文所敘的搜索過程。上海大學(xué)機(jī)電工程與自動化學(xué)院雷電組件對象模型--COMCOM是在其上生成ActiveX控件和OLE的基本“對象模型”。COM允許對象向其他組件和宿主應(yīng)用程序公開其功能。它既定義對象如何公開自身,又定義此公開如何跨越多個進(jìn)程和網(wǎng)絡(luò)進(jìn)行工作。COM還定義對象的生命周期。上海大學(xué)機(jī)電工程與自動化學(xué)院雷電COM接口接口是對象向外界公開其功能的方法。在COM中,接口是指向由對象實(shí)現(xiàn)的函數(shù)的指針表(類似于C++vtable)。該表表示接口及其指向的函數(shù)是該接口的方法。對象可以公開它所選擇的任意多個接口。每個接口都基于基本的COM接口IUnknown。IUnknown

的方法允許定位到由該對象公開的其他接口。另外,每個接口都給定一個唯一的接口ID(IID)。此唯一性使得很容易支持接口版本控制。接口的新版本只是具有新IID的新接口。注意

標(biāo)準(zhǔn)COM和OLE接口的IID是預(yù)定義的。上海大學(xué)機(jī)電工程與自動化學(xué)院雷電IUnknownIUnknown是其他每個COM接口的基接口。IUnknown

定義三種方法:QueryInterface、AddRef和Release。QueryInterface允許接口用戶向?qū)ο笳埱笾赶蚱淞硪粋€接口的指針。AddRef和Release實(shí)現(xiàn)該接口上的引用計數(shù)。上海大學(xué)機(jī)電工程與自動化學(xué)院雷電自動化自動化(以前稱為OLE自動化)使一個應(yīng)用程序可以對另一個應(yīng)用程序中實(shí)現(xiàn)的對象進(jìn)行操作,或者公開對象以便對其進(jìn)行操作。自動化服務(wù)器是一個應(yīng)用程序(COM服務(wù)器的一個類型),它通過COM接口向其他應(yīng)用程序(稱為自動化客戶端)公開其功能。功能的公開使自動化客戶端能夠通過直接訪問對象并使用對象提供的服務(wù)自動執(zhí)行某些函數(shù)。接口定義(IDL)文件。自動化服務(wù)器和客戶端使用總是從IDispatch

派生的COM接口獲取并返回一組稱為自動化的特定數(shù)據(jù)類型。可以使任何公開自動化接口的對象自動化,提供可從其他應(yīng)用程序訪問的方法和屬性。ActiveX控件是一個自動化服務(wù)器類型;而承載ActiveX控件的應(yīng)用程序是該控件的自動化客戶端。上海大學(xué)機(jī)電工程與自動化學(xué)院雷電COM服務(wù)器類型動態(tài)鏈接庫(DLL)

選擇以創(chuàng)建進(jìn)程內(nèi)服務(wù)器??蓤?zhí)行文件(EXE)

選擇以創(chuàng)建本地進(jìn)程外服務(wù)器。服務(wù)(EXE)

選擇以創(chuàng)建當(dāng)Windows啟動時在后臺運(yùn)行的Windows應(yīng)用程序。上海大學(xué)機(jī)電工程與自動化學(xué)院雷電.NET.NETFramework是支持生成和運(yùn)行下一代應(yīng)用程序和XMLWebServices的內(nèi)部Windows組件。.主要組件:公共語言運(yùn)行庫(CLR)

以CLR為目標(biāo)的代碼稱為托管代碼2.面向?qū)ο蟮?NETFramework類庫.上海大學(xué)機(jī)電工程與自動化學(xué)院雷電元數(shù)據(jù)當(dāng)今應(yīng)用程序模型發(fā)生了重大變化,應(yīng)用程序不但包含數(shù)據(jù)、代碼還包含對自身進(jìn)行描述的元數(shù)據(jù),組件間無縫交互。自描述JavaC#C++.NET上海大學(xué)機(jī)電工程與自動化學(xué)院雷電網(wǎng)絡(luò)通訊VC++應(yīng)用程序中Windows套接字的應(yīng)用一.socket基本概念客戶端應(yīng)用邏輯服務(wù)器端應(yīng)用邏輯編程難點(diǎn)socket類型二.MFC使用面向?qū)ο蟮姆椒ㄊ褂妙怌AsyncSocket

和CSocket封裝了WindowsSocketsAPI.上海大學(xué)機(jī)電工程與自動化學(xué)院雷電CAsyncSocketBOOLCreate(UINTnSocketPort=0);//創(chuàng)建socketBOO

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論