版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第四章 窗口過(guò)程Windows系統(tǒng)中的每個(gè)窗口都有一個(gè)相應(yīng)的窗口過(guò)程,用于處理和發(fā)送或投遞給該類窗口的所有消息。窗口外觀和特性的所有方面取決于窗口過(guò)程對(duì)這些消息的響應(yīng)。每個(gè)窗口都是某個(gè)窗口類的實(shí)例,窗口類決定了窗口用來(lái)處理它的消息的窗口過(guò)程,屬于同一種窗口類的所有窗口使用相同的窗口過(guò)程。窗口過(guò)程的結(jié)構(gòu):窗口過(guò)程包含四個(gè)參數(shù),如表4-1:參 數(shù)描 述hwnd接收消息的窗口的句柄。uMsg消息標(biāo)志,標(biāo)志是對(duì)應(yīng)于系統(tǒng)頭文件的一個(gè)預(yù)定義的常量,也可以是應(yīng)用程序定義的常量。wParam, lParam消息參數(shù),對(duì)于它們的解釋取決于uMsg參數(shù)的值。1在這個(gè)處理過(guò)程中,消息隊(duì)列中的MSG結(jié)構(gòu)中的time和
2、pt都被忽略了,如果應(yīng)用程序希望得到這個(gè)值,要自己通過(guò)更改消息環(huán)來(lái)實(shí)現(xiàn)。默認(rèn)窗口過(guò)程:默認(rèn)窗口過(guò)程DefWindowProc定義了一些所有窗口都有的基本特性。默認(rèn)窗口過(guò)程為窗口提供了最基本的功能,應(yīng)用程序的窗口過(guò)程應(yīng)當(dāng)把它不處理的任何消息傳給DefWindowProc來(lái)處理。即使應(yīng)用程序處理某個(gè)消息,出于某種目的,還是可以把剩余的處理轉(zhuǎn)交給DefWindowProc。建窗口過(guò)程的子類(SubClass):建子類是一種技術(shù),它使得應(yīng)用程序在窗口處理某個(gè)消息前截獲這條消息。通過(guò)給一個(gè)窗口建立子類,應(yīng)用程序可以增加、修改或監(jiān)視窗口的特性。應(yīng)用程序可以為任何窗口建例子類,包括屬于系統(tǒng)全局類的窗口,例如
3、應(yīng)用程序可以通過(guò)為編輯控制建子類來(lái)禁止控制框接收某些字符。應(yīng)用程序通過(guò)把窗口原窗口過(guò)程的地址換成一個(gè)叫做子類過(guò)程的新窗口過(guò)程的地址來(lái)為一個(gè)窗口建子類,從此就由子類過(guò)程接收和發(fā)送窗口的所有消息。子類過(guò)程在它接收到一條消息后可能有三種情況:把消息傳給原來(lái)的窗口過(guò)程;修改這條消息后再傳給原窗口過(guò)程;處理這條消息而不傳遞給原窗口過(guò)程。如果子類過(guò)程處理某條消息,它可以在把它傳遞給原窗口過(guò)程前、后或前后都對(duì)這條消息做附加處理。2Windows系統(tǒng)提供兩種類型的子類:實(shí)例子類和全局子類。對(duì)于實(shí)例子類,應(yīng)用程序取代的是一個(gè)窗口的某個(gè)實(shí)例的窗口過(guò)程地址,應(yīng)用程序必須用實(shí)例子類來(lái)子類一個(gè)存在的窗口。對(duì)于全局子類,
4、窗口過(guò)程取代的是窗口類的WNDCLASS結(jié)構(gòu)中窗口過(guò)程的地址,后面所有由這個(gè)窗口類創(chuàng)建的窗口用的就是子類過(guò)程的地址,但由這個(gè)窗口類創(chuàng)建的已存在的窗口是不受影響的。實(shí)例子類:應(yīng)用程序通過(guò)函數(shù)SetWindowLong來(lái)為某個(gè)窗口實(shí)例創(chuàng)建子類,應(yīng)用程序把GWL_WNDPROC標(biāo)志、要?jiǎng)?chuàng)建子類的窗口的句柄以及子類過(guò)程的地址傳給SetWindowLong。子類過(guò)程可以駐留在應(yīng)用程序模塊中或者是一個(gè)動(dòng)態(tài)鏈接庫(kù)(DLL)中。應(yīng)用程序必須在應(yīng)用程序或者DLL的模塊定義文件(.def)的EXPORTS語(yǔ)句中列出子類過(guò)程的名字。SetWindowLong返回窗口原窗口過(guò)程的地址,應(yīng)用程序必須保留這個(gè)地址,用于后
5、面對(duì)函數(shù)CallWindowProc的調(diào)用中,以便把截取的消息傳給原窗口過(guò)程。窗口刪除子類時(shí)也要原窗口過(guò)程的地址。這就需要再調(diào)用一次SetWindowLong,把原窗口過(guò)程的地址以及GWL_WNDPROC標(biāo)志和窗口句柄傳給它。在MFC中,建子類的方法為CWnd:SubclassWindow函數(shù)。應(yīng)用程序能夠?yàn)橄到y(tǒng)中任意窗口建立子類,但是在為并不屬于它的窗口建立3子類時(shí),應(yīng)用程序必須保證子類過(guò)程不要破壞原窗口過(guò)程的原有特性,因?yàn)閼?yīng)用程序并不控制這個(gè)窗口,它就不能使用有可能被窗口屬主改變的窗口信息。應(yīng)用程序在沒(méi)有完全搞清窗口或類附加字節(jié)確切的意思以及原窗口過(guò)程是如何使用這些字節(jié)之前是不能夠使用它們
6、的。即使搞清了,如果不是它自己的窗口也不應(yīng)該使用。如果應(yīng)用程序使用另一個(gè)應(yīng)用程序窗口的窗口附加字節(jié),而某些東西被其屬主改變了,子類過(guò)程可能會(huì)失敗。如果應(yīng)用程序?yàn)橐粋€(gè)子類窗口創(chuàng)建子類,就必須按相反的次序來(lái)刪除前面的子類,否則可能發(fā)生不可預(yù)期的系統(tǒng)錯(cuò)誤。全局子類:要為一個(gè)窗口類建全局子類,應(yīng)用程序必須使用這個(gè)窗口類的某一個(gè)窗口的句柄。應(yīng)用程序也需要這個(gè)句柄來(lái)刪除子類。要得到句柄,應(yīng)用程序通常用要?jiǎng)?chuàng)建子類的窗口類創(chuàng)建一個(gè)隱藏窗口,有了句柄之后,應(yīng)用程序調(diào)用SetClassLong指定這個(gè)句柄、GWL_WNDPROC標(biāo)志以及子類過(guò)程的地址,SetClassLong返回這個(gè)窗口類原來(lái)的窗口過(guò)程的地址。全
7、局子類中原窗口過(guò)程的地址的用法與實(shí)例子類中相同,子類過(guò)程調(diào)用函數(shù)CallWindowProc把消息傳給原窗口過(guò)程,應(yīng)用程序從窗口類中刪除子類也是調(diào)用SetClassLong,向它傳送原窗口過(guò)程的地址、GCL_WNDPROC標(biāo)志以及該窗口類的一個(gè)實(shí)例窗口句柄。為一個(gè)控制類建一個(gè)全局子類的應(yīng)用結(jié)束時(shí)4必須刪除子類,否則有可能出現(xiàn)系統(tǒng)錯(cuò)誤。應(yīng)用程序不能為一個(gè)系統(tǒng)全局類創(chuàng)建全局子類。如果有不止一個(gè)應(yīng)用程序?yàn)橐粋€(gè)系統(tǒng)全局類創(chuàng)建全局子類,就會(huì)發(fā)生不可恢復(fù)的系統(tǒng)錯(cuò)誤。如果應(yīng)用程序需要為一個(gè)系統(tǒng)全局類建立全局子類,就必須用超類技術(shù)。超類(類似于派生):超類允許應(yīng)用程序創(chuàng)建一個(gè)新的窗口類,既具有原來(lái)窗口類的基本
8、功能,又增加一些由應(yīng)用程序提供的增強(qiáng)功能。用于產(chǎn)生超類的窗口類稱為基類,通常基類是系統(tǒng)全局窗口類。超類有它自己的窗口過(guò)程,叫做超類過(guò)程。超類過(guò)程處理一條消息也有三種情況:把消息傳給原窗口過(guò)程;修改消息后傳給原窗口過(guò)程;直接處理這條消息。同樣也可以對(duì)消息進(jìn)行一些預(yù)處理后交給原窗口過(guò)程。與子類過(guò)程不同,超類過(guò)程是能夠處理窗口創(chuàng)建消息的(WM_NCCREATE, WM_CREATE等),但它必須把這些消息再傳給原基類窗口過(guò)程,以便基類窗口過(guò)程能夠完成它的初始化過(guò)程。要為一個(gè)窗口類建超類,應(yīng)用程序應(yīng)該首先調(diào)用函數(shù)GetClassInfo來(lái)檢取有關(guān)基類的信息,GetClassInfo用基類的WNDCLA
9、SS結(jié)構(gòu)值填充一個(gè)WNDCLASS結(jié)構(gòu)。然后把應(yīng)用程序的實(shí)例句柄復(fù)制到WNDCLASS結(jié)構(gòu)的hInstance成員中5把超類的名字復(fù)制到lpszClassName成員中。如果基類有一個(gè)菜單,應(yīng)用程序還必須用相同的菜單標(biāo)志提供新的菜單項(xiàng),并且把菜單名復(fù)制到lpszMenuName成員中。如果超類過(guò)程處理WM_COMMAND并且不再返回給基類的窗口過(guò)程,那么菜單中也就無(wú)需有相應(yīng)的標(biāo)志。函數(shù)GetClassInfo并不返回WNDCLASS結(jié)構(gòu)中的lpszMenuName、lpszClassName和hInstance成員。應(yīng)用程序必須設(shè)置WNDCLASS結(jié)構(gòu)中的lpfnWndProc成員,GetClassInfo用原窗口類的窗口過(guò)程地址填充這個(gè)成員,應(yīng)用程序必須保留這個(gè)地址,以便向原窗口過(guò)程傳遞消息,然后再把超類過(guò)程的地址復(fù)制到lpfnWndProc成員中。如果需要的話,應(yīng)用程序可
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年幼兒園保教主任工作計(jì)劃樣本(四篇)
- 2024年少先隊(duì)輔導(dǎo)員工作總結(jié)例文(三篇)
- 2024年家電采購(gòu)合同例文(四篇)
- 2024年大學(xué)學(xué)生會(huì)主席工作計(jì)劃范本(二篇)
- 2024年安全標(biāo)準(zhǔn)化自評(píng)管理制度例文(三篇)
- 2024年司爐工崗位責(zé)任制制度全(二篇)
- 2024年廚房承包合同協(xié)議格式范文(二篇)
- 2024年安全經(jīng)費(fèi)管理制度例文(二篇)
- 2024年安全委員辦公室崗位職責(zé)范本(二篇)
- 2024年幼兒園大班第一學(xué)期工作計(jì)劃例文(四篇)
- 設(shè)計(jì)師會(huì)議管理制度
- 人教版英語(yǔ)九年級(jí)Unit 13《Were trying to save the earth》全單元教學(xué)設(shè)計(jì)
- 行賄受賄檢討書(shū)
- (正式版)JC∕T 60022-2024 陶粒窯協(xié)同處置固體廢物技術(shù)規(guī)范
- 《中國(guó)傳統(tǒng)建筑》課件-中國(guó)民居建筑
- 六年級(jí)道德與法治期末測(cè)試卷加答案(易錯(cuò)題)
- 《鐵路貨運(yùn)組織》課件-項(xiàng)目2 整車、零擔(dān)貨物運(yùn)輸過(guò)程
- 山東省高等學(xué)校教師崗前培訓(xùn)考試暨教師資格筆試題庫(kù)及完整答案(易錯(cuò)題)
- 新制定《公平競(jìng)爭(zhēng)審查條例》學(xué)習(xí)課件
- DZ/T 0452.3-2023 稀土礦石化學(xué)分析方法 第3部分:鋰、鈹、鈧、錳、鈷、鎳、銅、鋅、鎵、銣、鈮、鉬、銦、銫、鉭、鎢、鉈、鉛、鉍、釷、鈾及15個(gè)稀土元素含量的測(cè)定 ICP-MS法(正式版)
- 少數(shù)民族朝鮮族民俗介紹
評(píng)論
0/150
提交評(píng)論