![Windows程序設(shè)計(jì)之窗口過程_第1頁](http://file4.renrendoc.com/view/d9bba8f8c73f08974b4af50d2b7176f8/d9bba8f8c73f08974b4af50d2b7176f81.gif)
![Windows程序設(shè)計(jì)之窗口過程_第2頁](http://file4.renrendoc.com/view/d9bba8f8c73f08974b4af50d2b7176f8/d9bba8f8c73f08974b4af50d2b7176f82.gif)
![Windows程序設(shè)計(jì)之窗口過程_第3頁](http://file4.renrendoc.com/view/d9bba8f8c73f08974b4af50d2b7176f8/d9bba8f8c73f08974b4af50d2b7176f83.gif)
![Windows程序設(shè)計(jì)之窗口過程_第4頁](http://file4.renrendoc.com/view/d9bba8f8c73f08974b4af50d2b7176f8/d9bba8f8c73f08974b4af50d2b7176f84.gif)
![Windows程序設(shè)計(jì)之窗口過程_第5頁](http://file4.renrendoc.com/view/d9bba8f8c73f08974b4af50d2b7176f8/d9bba8f8c73f08974b4af50d2b7176f85.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第四章 窗口過程Windows系統(tǒng)中的每個窗口都有一個相應(yīng)的窗口過程,用于處理和發(fā)送或投遞給該類窗口的所有消息。窗口外觀和特性的所有方面取決于窗口過程對這些消息的響應(yīng)。每個窗口都是某個窗口類的實(shí)例,窗口類決定了窗口用來處理它的消息的窗口過程,屬于同一種窗口類的所有窗口使用相同的窗口過程。窗口過程的結(jié)構(gòu):窗口過程包含四個參數(shù),如表4-1:參 數(shù)描 述hwnd接收消息的窗口的句柄。uMsg消息標(biāo)志,標(biāo)志是對應(yīng)于系統(tǒng)頭文件的一個預(yù)定義的常量,也可以是應(yīng)用程序定義的常量。wParam, lParam消息參數(shù),對于它們的解釋取決于uMsg參數(shù)的值。1在這個處理過程中,消息隊(duì)列中的MSG結(jié)構(gòu)中的time和
2、pt都被忽略了,如果應(yīng)用程序希望得到這個值,要自己通過更改消息環(huán)來實(shí)現(xiàn)。默認(rèn)窗口過程:默認(rèn)窗口過程DefWindowProc定義了一些所有窗口都有的基本特性。默認(rèn)窗口過程為窗口提供了最基本的功能,應(yīng)用程序的窗口過程應(yīng)當(dāng)把它不處理的任何消息傳給DefWindowProc來處理。即使應(yīng)用程序處理某個消息,出于某種目的,還是可以把剩余的處理轉(zhuǎn)交給DefWindowProc。建窗口過程的子類(SubClass):建子類是一種技術(shù),它使得應(yīng)用程序在窗口處理某個消息前截獲這條消息。通過給一個窗口建立子類,應(yīng)用程序可以增加、修改或監(jiān)視窗口的特性。應(yīng)用程序可以為任何窗口建例子類,包括屬于系統(tǒng)全局類的窗口,例如
3、應(yīng)用程序可以通過為編輯控制建子類來禁止控制框接收某些字符。應(yīng)用程序通過把窗口原窗口過程的地址換成一個叫做子類過程的新窗口過程的地址來為一個窗口建子類,從此就由子類過程接收和發(fā)送窗口的所有消息。子類過程在它接收到一條消息后可能有三種情況:把消息傳給原來的窗口過程;修改這條消息后再傳給原窗口過程;處理這條消息而不傳遞給原窗口過程。如果子類過程處理某條消息,它可以在把它傳遞給原窗口過程前、后或前后都對這條消息做附加處理。2Windows系統(tǒng)提供兩種類型的子類:實(shí)例子類和全局子類。對于實(shí)例子類,應(yīng)用程序取代的是一個窗口的某個實(shí)例的窗口過程地址,應(yīng)用程序必須用實(shí)例子類來子類一個存在的窗口。對于全局子類,
4、窗口過程取代的是窗口類的WNDCLASS結(jié)構(gòu)中窗口過程的地址,后面所有由這個窗口類創(chuàng)建的窗口用的就是子類過程的地址,但由這個窗口類創(chuàng)建的已存在的窗口是不受影響的。實(shí)例子類:應(yīng)用程序通過函數(shù)SetWindowLong來為某個窗口實(shí)例創(chuàng)建子類,應(yīng)用程序把GWL_WNDPROC標(biāo)志、要創(chuàng)建子類的窗口的句柄以及子類過程的地址傳給SetWindowLong。子類過程可以駐留在應(yīng)用程序模塊中或者是一個動態(tài)鏈接庫(DLL)中。應(yīng)用程序必須在應(yīng)用程序或者DLL的模塊定義文件(.def)的EXPORTS語句中列出子類過程的名字。SetWindowLong返回窗口原窗口過程的地址,應(yīng)用程序必須保留這個地址,用于后
5、面對函數(shù)CallWindowProc的調(diào)用中,以便把截取的消息傳給原窗口過程。窗口刪除子類時也要原窗口過程的地址。這就需要再調(diào)用一次SetWindowLong,把原窗口過程的地址以及GWL_WNDPROC標(biāo)志和窗口句柄傳給它。在MFC中,建子類的方法為CWnd:SubclassWindow函數(shù)。應(yīng)用程序能夠?yàn)橄到y(tǒng)中任意窗口建立子類,但是在為并不屬于它的窗口建立3子類時,應(yīng)用程序必須保證子類過程不要破壞原窗口過程的原有特性,因?yàn)閼?yīng)用程序并不控制這個窗口,它就不能使用有可能被窗口屬主改變的窗口信息。應(yīng)用程序在沒有完全搞清窗口或類附加字節(jié)確切的意思以及原窗口過程是如何使用這些字節(jié)之前是不能夠使用它們
6、的。即使搞清了,如果不是它自己的窗口也不應(yīng)該使用。如果應(yīng)用程序使用另一個應(yīng)用程序窗口的窗口附加字節(jié),而某些東西被其屬主改變了,子類過程可能會失敗。如果應(yīng)用程序?yàn)橐粋€子類窗口創(chuàng)建子類,就必須按相反的次序來刪除前面的子類,否則可能發(fā)生不可預(yù)期的系統(tǒng)錯誤。全局子類:要為一個窗口類建全局子類,應(yīng)用程序必須使用這個窗口類的某一個窗口的句柄。應(yīng)用程序也需要這個句柄來刪除子類。要得到句柄,應(yīng)用程序通常用要創(chuàng)建子類的窗口類創(chuàng)建一個隱藏窗口,有了句柄之后,應(yīng)用程序調(diào)用SetClassLong指定這個句柄、GWL_WNDPROC標(biāo)志以及子類過程的地址,SetClassLong返回這個窗口類原來的窗口過程的地址。全
7、局子類中原窗口過程的地址的用法與實(shí)例子類中相同,子類過程調(diào)用函數(shù)CallWindowProc把消息傳給原窗口過程,應(yīng)用程序從窗口類中刪除子類也是調(diào)用SetClassLong,向它傳送原窗口過程的地址、GCL_WNDPROC標(biāo)志以及該窗口類的一個實(shí)例窗口句柄。為一個控制類建一個全局子類的應(yīng)用結(jié)束時4必須刪除子類,否則有可能出現(xiàn)系統(tǒng)錯誤。應(yīng)用程序不能為一個系統(tǒng)全局類創(chuàng)建全局子類。如果有不止一個應(yīng)用程序?yàn)橐粋€系統(tǒng)全局類創(chuàng)建全局子類,就會發(fā)生不可恢復(fù)的系統(tǒng)錯誤。如果應(yīng)用程序需要為一個系統(tǒng)全局類建立全局子類,就必須用超類技術(shù)。超類(類似于派生):超類允許應(yīng)用程序創(chuàng)建一個新的窗口類,既具有原來窗口類的基本
8、功能,又增加一些由應(yīng)用程序提供的增強(qiáng)功能。用于產(chǎn)生超類的窗口類稱為基類,通?;愂窍到y(tǒng)全局窗口類。超類有它自己的窗口過程,叫做超類過程。超類過程處理一條消息也有三種情況:把消息傳給原窗口過程;修改消息后傳給原窗口過程;直接處理這條消息。同樣也可以對消息進(jìn)行一些預(yù)處理后交給原窗口過程。與子類過程不同,超類過程是能夠處理窗口創(chuàng)建消息的(WM_NCCREATE, WM_CREATE等),但它必須把這些消息再傳給原基類窗口過程,以便基類窗口過程能夠完成它的初始化過程。要為一個窗口類建超類,應(yīng)用程序應(yīng)該首先調(diào)用函數(shù)GetClassInfo來檢取有關(guān)基類的信息,GetClassInfo用基類的WNDCLA
9、SS結(jié)構(gòu)值填充一個WNDCLASS結(jié)構(gòu)。然后把應(yīng)用程序的實(shí)例句柄復(fù)制到WNDCLASS結(jié)構(gòu)的hInstance成員中5把超類的名字復(fù)制到lpszClassName成員中。如果基類有一個菜單,應(yīng)用程序還必須用相同的菜單標(biāo)志提供新的菜單項(xiàng),并且把菜單名復(fù)制到lpszMenuName成員中。如果超類過程處理WM_COMMAND并且不再返回給基類的窗口過程,那么菜單中也就無需有相應(yīng)的標(biāo)志。函數(shù)GetClassInfo并不返回WNDCLASS結(jié)構(gòu)中的lpszMenuName、lpszClassName和hInstance成員。應(yīng)用程序必須設(shè)置WNDCLASS結(jié)構(gòu)中的lpfnWndProc成員,GetClassInfo用原窗口類的窗口過程地址填充這個成員,應(yīng)用程序必須保留這個地址,以便向原窗口過程傳遞消息,然后再把超類過程的地址復(fù)制到lpfnWndProc成員中。如果需要的話,應(yīng)用程序可
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年船舶潤滑油供應(yīng)合同
- 2025年機(jī)關(guān)單位臨時工兼職人員合同
- 2025年積分銷售合同協(xié)議書示例
- 2025年醫(yī)療設(shè)備策劃合作租賃與銷售框架合同
- 2025年住宅項(xiàng)目園林景觀設(shè)計(jì)合同
- 2025年農(nóng)地耕作權(quán)交換協(xié)議
- 2025年專利技術(shù)合同爭議處理方法
- 2025年企業(yè)資產(chǎn)重組授權(quán)代理協(xié)議指導(dǎo)
- 2025年智能穿戴項(xiàng)目申請報(bào)告模式
- 2025年共同投資合作成果合作協(xié)議書
- 員工賠償金保密協(xié)議書(2篇)
- XX小學(xué)法治副校長(派出所民警)法制教育課講稿
- (2024年)肺栓塞的護(hù)理課件
- 出納收入支出記賬表Excel模板
- 叉車操作規(guī)程
- 2021年春新青島版(五四制)科學(xué)四年級下冊全冊教學(xué)課件
- 土建工程技術(shù)標(biāo)范本(DOC167頁)
- 班級管理(課件).ppt
- 惡性腫瘤化療后重度骨髓抑制病人的護(hù)理論文
- cmu200_中文使用詳細(xì)說明
- 注塑參數(shù)DOE分析范例
評論
0/150
提交評論