




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第 1 章 Windows 系統(tǒng)的消息機(jī)制對(duì)諸如 PowerBuilder (后文簡(jiǎn)寫為PB)、 Visual Basic 和 Dephi 等大多數(shù)可視化程序設(shè)計(jì)語(yǔ)言來(lái)講,程序設(shè)計(jì)的核心是對(duì)象的事件、屬性和方法,但對(duì)Windows 系統(tǒng)本身而言,卻是以消息處理為其控制機(jī)制。Windows把系統(tǒng)中的對(duì)象都作為窗口來(lái)對(duì)待,每個(gè)窗口都有一個(gè)用來(lái)標(biāo)識(shí)其身份的句柄。Windows通過(guò)向窗口發(fā)送消息,在開(kāi)發(fā)語(yǔ)言中轉(zhuǎn)化為對(duì)象的事件,然后驅(qū)動(dòng)對(duì)象,響應(yīng)用戶的動(dòng)作。在許多面向?qū)ο蟮目梢暬绦蛟O(shè)計(jì)語(yǔ)言中,Windows的眾多消息已經(jīng)演變成了對(duì)象的屬性或方法。本章內(nèi)容包括Windows 系統(tǒng)的消息機(jī)制、消息的發(fā)送、
2、消息的應(yīng)用實(shí)例等。1.1Windows 的工作機(jī)制1.1.1Windows的工作方式窗口、事件和消息全面地討論Windows 的內(nèi)部工作機(jī)制需要很大的篇幅,對(duì)于一般的PB 用戶當(dāng)然沒(méi)有必要深入了解所有的技術(shù)細(xì)節(jié)。Windows 系統(tǒng)的工作機(jī)制,簡(jiǎn)單地說(shuō)就是3 個(gè)關(guān)鍵的概念:窗口、事件和消息。不妨簡(jiǎn)單地將窗口看做帶有邊界的矩形區(qū)域。讀者也許已經(jīng)了解多種不同類型的窗口,如 Windows 系統(tǒng)的“資源管理器”窗口、文字處理程序中的文檔窗口或者彈出提示有約會(huì)信息的消息對(duì)話框窗口等。 除了這些最普通的窗口外, 實(shí)際上還有許多其他類型的窗口。 命令按鈕是一個(gè)窗口,圖標(biāo)、文本框、選項(xiàng)按鈕和菜單條也都是窗口
3、。Windows操作系統(tǒng)通過(guò)給每一個(gè)窗口指定一個(gè)惟一的標(biāo)識(shí)號(hào)(窗口句柄,常用hWnd 表示)來(lái)管理所有的窗口。操作系統(tǒng)連續(xù)地監(jiān)視每一個(gè)窗口的活動(dòng)或事件的信號(hào)。事件可以通過(guò)諸如單擊鼠標(biāo)或按下按鍵的操作而產(chǎn)生,也可以通過(guò)程序的控制而產(chǎn)生,甚至可以由另一個(gè)窗口的操作而產(chǎn)生。每發(fā)生一次事件,將引發(fā)一條消息發(fā)送至操作系統(tǒng)。操作系統(tǒng)處理該消息并廣播給其他窗口。 然后,每一個(gè)窗口才能根據(jù)自身處理該條消息的指令而采取適當(dāng)?shù)牟僮鳎ɡ纾?當(dāng)窗口解除了其他窗口的覆蓋時(shí),重新繪制自身窗口)??梢韵胂?,處理各種窗口、事件和消息的所有可能的組合將有驚人的工作量。幸運(yùn)的是,PB 使用戶擺脫了所有的低層消息處理。許多消息由
4、PB 自動(dòng)處理了,其他的作為事件過(guò)程由編程者自行處理,這樣可以快速創(chuàng)建強(qiáng)大的應(yīng)用程序,而毋需涉及不必要的細(xì)節(jié)。1.1.2句柄的概念在解釋消息之前,首先了解系統(tǒng)如何準(zhǔn)確地將消息發(fā)送到指定的窗口。當(dāng)一個(gè)應(yīng)用或多第 1 章Windows系統(tǒng)的消息機(jī)制 3個(gè)應(yīng)用運(yùn)行后,會(huì)同時(shí)創(chuàng)建許多個(gè)窗口,Windows作為系統(tǒng)的“大總管”,那么它又是如何識(shí)別每一個(gè)窗口呢?在程序設(shè)計(jì)時(shí),通過(guò)窗口的名稱屬性,為每個(gè)窗口命名,然后在程序其他部分把窗口名作為識(shí)別窗口的標(biāo)識(shí)。這種通過(guò)為窗口命名來(lái)識(shí)別不同窗口的方法,對(duì) Windows系統(tǒng)來(lái)講顯然是不現(xiàn)實(shí)的。Windows 系統(tǒng)是通過(guò)稱之為句柄的標(biāo)識(shí)符來(lái)識(shí)別每一個(gè)窗口。句柄是系
5、統(tǒng)動(dòng)態(tài)分配給窗口的32 位整型數(shù)標(biāo)識(shí)值,常用hWnd 表示,即英文handle to awindow 的縮寫。大量API 函數(shù)都需要窗口句柄作參數(shù),或返回一個(gè)窗口或設(shè)備場(chǎng)境的句柄。句柄可以通俗地理解為Windows 為系統(tǒng)中所有存在的窗口動(dòng)態(tài)分配的身份識(shí)別號(hào)碼。在 PB 中,可以通過(guò)handle 函數(shù)來(lái)取得窗口和控件的句柄,當(dāng)聲明API 函數(shù)時(shí),常把保存句柄的變量聲明為L(zhǎng)ong 或 Ulong 長(zhǎng)整型數(shù)據(jù)類型。Windows 為窗口和控件分配句柄標(biāo)識(shí)是動(dòng)態(tài),同樣的程序每次運(yùn)行時(shí)和在不同計(jì)算機(jī)上運(yùn)行時(shí)所分配的窗口句柄標(biāo)識(shí)可能是完全不一樣的。窗口的句柄屬性僅能在運(yùn)行時(shí)訪問(wèn),該屬性對(duì)窗口的外觀并沒(méi)有
6、任何影響,它僅作為API函數(shù)調(diào)用的參數(shù)或返回值,或其他需識(shí)別窗口或?qū)ο蟮牡胤?。在后面章?jié)中, 讀者將會(huì)看到幾乎所有涉及窗口的API 函數(shù)都需要傳遞hWnd 參數(shù),以便函數(shù)準(zhǔn)確獲得用戶要處理的窗口或?qū)ο蟆>浔鳛橛刹僮飨到y(tǒng)定義的惟一的長(zhǎng)整型值,可以用它來(lái)引用窗體和控件等對(duì)象。在Windows 系統(tǒng)中, API 函數(shù)的調(diào)用常用的句柄包括窗口句柄,菜單句柄、 設(shè)備對(duì)象句柄、設(shè)備場(chǎng)景句柄, 等等。 如果函數(shù)需要用句柄作為參數(shù),則應(yīng)該把參數(shù)聲明為傳值,對(duì)于返回句柄的API 函數(shù),應(yīng)將返回的句柄值聲明為L(zhǎng)ong 或 Ulong 類型數(shù)據(jù)類型。句柄是一種標(biāo)識(shí)符(ID )編號(hào),而不是指針或者數(shù)值,不要試圖對(duì)它
7、們進(jìn)行任何數(shù)學(xué)運(yùn)算。1.1.3消息的概念Windows 系統(tǒng)是以消息處理為其控制機(jī)制, 系統(tǒng)通過(guò)消息為窗口過(guò)程 ( windows procedure )傳遞輸入。 系統(tǒng)和應(yīng)用兩者都可以產(chǎn)生消息。 對(duì)于每個(gè)輸入事件, 例如用戶按下了鍵盤上的某個(gè)鍵、移動(dòng)了鼠標(biāo)、單擊了一個(gè)控件上的滾動(dòng)條,等等,系統(tǒng)都將產(chǎn)生一系列消息。此外,對(duì)于應(yīng)用帶給系統(tǒng)的變化,如字體資源的改變、應(yīng)用本身窗口的改變,系統(tǒng)都將通過(guò)消息以響應(yīng)這種變化。應(yīng)用通過(guò)產(chǎn)生消息指示應(yīng)用的窗口完成特定的任務(wù),或與其他應(yīng)用的窗口進(jìn)行通信。每個(gè)窗口都有一個(gè)處理 Windows 系統(tǒng)發(fā)送消息的處理程序,稱為窗口程序。它是隱含在窗口背后的一段程序腳本,
8、其中包含對(duì)事件進(jìn)行處理的代碼。Windows 系統(tǒng)為每條消息指定了一個(gè)消息編號(hào),例如當(dāng)一個(gè)窗口變?yōu)榛顒?dòng)窗口時(shí),它事實(shí)上是收到一條來(lái)自 Windows 系統(tǒng)的 WM_ACTIVATE 消息,該消息的編號(hào)為 6,它對(duì)應(yīng)于 PB 窗口的 Activate 事件。對(duì)于窗口來(lái)說(shuō),諸如 Open、Activate 、MouseDown 、Resize 等事件,實(shí)際上對(duì)應(yīng)的是窗口內(nèi)部的消息處理程序,這些程序?qū)τ谟脩魜?lái)講是不可見(jiàn)的。類似地,命令按鈕也有消息處理程序, 它的處理程序響應(yīng)諸如WM_LBUTTONDOWN和 WM_RBUTTONDOWN類的消息,即激活命令按鈕的MouseDown 事件。3之1)窗口
9、句柄( a window handle ):窗口句柄用來(lái)標(biāo)識(shí)消息將要發(fā)送到的窗口對(duì)象,系統(tǒng)使用窗口句柄來(lái)確定哪一個(gè)窗口句柄應(yīng)該接收該消息。 4PowerBuilder Win32 API程序設(shè)計(jì)(高級(jí)卷)2)消息標(biāo)識(shí)符( a message identifier):消息標(biāo)識(shí)符是用來(lái)區(qū)分不同消息的命名常量,當(dāng)窗口過(guò)程接收到一個(gè)消息時(shí), 它使用消息標(biāo)識(shí)符來(lái)確定如何處理該消息。例如,消息標(biāo)識(shí)符WM_PAINT告訴窗口過(guò)程“窗口的客戶區(qū)已經(jīng)發(fā)生變化,窗口必須進(jìn)行重新繪制”。3)消息參數(shù)( message parameters):消息參數(shù)用來(lái)表述窗口過(guò)程處理消息時(shí)所使用的數(shù)據(jù)或數(shù)據(jù)的位置, 通常用一對(duì)參
10、數(shù)表示。 消息參數(shù)的意義和取值取決于消息。 消息參數(shù)取值可以是整型數(shù)、 Bit 位標(biāo)識(shí)、指向結(jié)構(gòu)的指針,等等,當(dāng)不需要使用消息參數(shù)時(shí),通常將其設(shè)置為 NULL 。窗口過(guò)程必須通過(guò)檢查消息標(biāo)識(shí)符來(lái)確定如何對(duì)消息參數(shù)進(jìn)行解釋。有關(guān)消息標(biāo)識(shí)符、消息參數(shù)的具體使用,將在后面介紹解釋。Sendmessage 函數(shù)時(shí)給予進(jìn)一步1.1.4消息的類型1系統(tǒng)定義的消息當(dāng)系統(tǒng)與應(yīng)用進(jìn)行通信時(shí),系統(tǒng)將發(fā)送或郵寄消息。系統(tǒng)通過(guò)這些消息控制應(yīng)用的運(yùn)行,并為應(yīng)用的進(jìn)程提供輸入或其他信息。應(yīng)用內(nèi)部也可發(fā)送或郵寄系統(tǒng)定義的消息,應(yīng)用通常使用這些消息控制由預(yù)先注冊(cè)的窗口類創(chuàng)建的窗口的操作。每一個(gè)系統(tǒng)定義的消息都有一個(gè)惟一的消息
11、標(biāo)識(shí)符(值),并用一個(gè)表明消息用途標(biāo)識(shí)符常量表示(這些在SDK 的頭文件中定義)。如WM_PAINT消息標(biāo)識(shí)符表示要求窗口進(jìn)行重繪的消息。消息標(biāo)識(shí)符常量前綴表示消息所屬的消息類別,如WM_ 表示窗口類消息,BM_ 表示按鈕類消息,表1-1 給出了不同類別消息的前綴。在 PB 中,消息標(biāo)識(shí)符常量通常聲明為窗口或?qū)ο蟮膶?shí)例常量,例如:CONSTANT long WM_MOUSEMOVE= 512CONSTANT long WM_LBUTTONDOWN = 513CONSTANT long WM_LBUTTONUP= 514CONSTANT long WM_LBUTTONDBLCLK= 515CON
12、STANT long WM_RBUTTONDOWN= 516CONSTANT long WM_RBUTTONUP= 517CONSTANT long WM_RBUTTONDBLCLK= 518表 1-1Windows系統(tǒng)定義的消息類別消息標(biāo)識(shí)符前綴消息分類ABM應(yīng)用桌面工具欄消息BM按鈕控件消息CB組合框控件消息CBEM擴(kuò)展組合框控件消息CDM通用對(duì)話框消息DBT設(shè)備消息DL拖曳列表框控件消息DMDTM默認(rèn)按鈕控件消息日期時(shí)間選取控件消息消息標(biāo)識(shí)符前綴EMHDMHKMIPMLBLVMMCMPBMPGMPSMRBSBSBMSTMTBTBMTCMTTMTVMUDMWM第 1 章Windows 系統(tǒng)
13、的消息機(jī)制 5續(xù)表消息分類編輯控件消息頭控件消息熱鍵控件消息IP 地址控件消息列表框控件消息列表視圖控件消息月歷控件消息進(jìn)度條控件消息Pager 控件消息屬性頁(yè)面消息Rebar 控件消息狀態(tài)欄窗口消息滾動(dòng)條控件消息靜態(tài)控件消息工具欄消息跟蹤條控件消息Tab 控件消息Tooltip 控件消息樹(shù)形控件消息Up-down控件消息普通窗口消息Windows系統(tǒng)使用了成千上萬(wàn)條消息。從窗口到控件都有一組可接收和響應(yīng)的消息。在Visual Basic 的 API 瀏覽器中,以常量的方式列出了Windows 的大部分消息。據(jù)粗略統(tǒng)計(jì),微軟在MSDN 中列出的消息約有數(shù)千種,全部弄清楚這么多種消息是不現(xiàn)實(shí)的,
14、也是沒(méi)有必要的。這是因?yàn)镻B 已經(jīng)將很多消息封裝為了對(duì)象的“屬性”(例如窗口的Title 和 WindowState 屬性)和“方法(函數(shù))”(例如關(guān)閉窗口函數(shù)Close)??梢园l(fā)現(xiàn),消息可能演變成PB 對(duì)象的屬性、方法(函數(shù))和事件。既然PB 已經(jīng)對(duì)消息進(jìn)行了封裝,那么又何必使用消息來(lái)進(jìn)行程序設(shè)計(jì)呢?這時(shí)因?yàn)?,PB 提供的事件、屬性和方法并未完全涵蓋所有消息,為了彌補(bǔ)PB 在某些功能的不足,常使用系統(tǒng)消息或應(yīng)用自定義的消息來(lái)強(qiáng)化PB 的程序設(shè)計(jì)。2應(yīng)用定義的消息應(yīng)用也可以創(chuàng)建自己的消息,并將消息應(yīng)用于它的窗口或與其他窗口的進(jìn)程進(jìn)行通信。如果應(yīng)用創(chuàng)建了自己的消息,接收消息的窗口過(guò)程必須解釋消息
15、,同時(shí)對(duì)消息進(jìn)行恰當(dāng)?shù)奶幚?。系統(tǒng)保留的消息標(biāo)識(shí)符的取值范圍為0 x0000 0 x03FF( 0 1023),專門用于系統(tǒng)定義的消息;應(yīng)用定義的消息不能使用這些值,應(yīng)用定義的消息取值范圍為0 x0400 0 x7FFF( 0 32767)。RegisterWindowMessage 函數(shù)提供了分配消息編號(hào)的功能,該函數(shù)用一個(gè)消息名稱作為參 6PowerBuilder Win32 API程序設(shè)計(jì)(高級(jí)卷)數(shù),并為這個(gè)名稱分配一個(gè)惟一的、尚未使用過(guò)的編號(hào)。1.1.5用于發(fā)送消息的API 函數(shù)Windows 應(yīng)用程序允許應(yīng)用程序向自己或其他應(yīng)用程序發(fā)送消息,甚至可以向Windows操作系統(tǒng)本身發(fā)送消
16、息(比如要求關(guān)閉操作系統(tǒng)或重新啟動(dòng)操作系統(tǒng))。Windows提供了2個(gè)專門用于發(fā)送消息的API 函數(shù) SendMessage 和 PostMessage。1 SendMessage函數(shù)SendMessage 函數(shù)發(fā)送指定的消息到窗口或Windows 系統(tǒng),然后函數(shù)調(diào)用窗口的處理消息的過(guò)程,并等待窗口過(guò)程處理完消息后返回。原型LRESULTSendMessage(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam );PB 聲明FUNCTIONLong SendMessage(Long hwnd, Long wMsg, Long wParam,
17、Long lParam) LIBRARYuser32.dllALIAS FOR SendMessageA參數(shù)hWnd為接收消息窗口的句柄;wMsg指定要發(fā)送的消息;wParam依賴于消息wMsg 的其他信息;lParam依賴于消息wMsg 的其他信息。返回值函數(shù)返回消息的處理結(jié)果,該值取決于消息的類型。wParam 和 lParam 兩個(gè)參數(shù)的含義隨消息wMsg 參數(shù)不同而改變, 因此每當(dāng)向窗口傳遞某種消息時(shí),除了要了解該消息的含義外,還要注意wParam 和 lParam 的含義和設(shè)置。SendMessage 函數(shù)會(huì)返回一個(gè)Long 值,由于這個(gè)函數(shù)是直接調(diào)用窗口程序,因此窗口程序可以返回一
18、個(gè)值, 把它作為 SendMessage 函數(shù)的返回值, 這個(gè)返回值的具體含義由消息決定。不過(guò),除非在MSDN 明確列出了該消息的返回值,否則,返回值就沒(méi)有具體意義,應(yīng)該忽略。此外,在使用返回值時(shí),通常調(diào)用SendMessageTimeOut 函數(shù)檢查是否超時(shí),因?yàn)橹挥性谙⑼耆幚硗戤吅?,才能得到一個(gè)有效返回值。前面曾提到默認(rèn)的窗口過(guò)程函數(shù)DefWindowProc用來(lái)處理應(yīng)用程序無(wú)法處理的消息,該函數(shù)確保所有消息都要處理,無(wú)論這些消息是否對(duì)窗口有用。調(diào)用DefWindowProc函數(shù)時(shí),需要傳入與窗口消息處理過(guò)程相同的參數(shù)。C 原型LRESULTDefWindowProc ( HWND h
19、Wnd, UINT Msg, WPARAM wParam, LPARAM lParam );PB 聲明FUNCTIONLong DefWindowProc (Long hwnd,Long wMsg,Long wParam,Long lParam)LIBRARYuser32.dllALIAS FOR DefWindowProcA參數(shù)第 1 章Windows系統(tǒng)的消息機(jī)制 7hWndwMsgwParamlParam窗口句柄;指定要發(fā)送的消息;依賴于消息wMsg依賴于消息wMsg的其他信息;的其他信息。返回值函數(shù)返回消息的處理結(jié)果,該取決于消息的類型。2. PostMessage函數(shù)PostMess
20、age函數(shù)同 SendMessage 類似,它把消息放在指定窗口創(chuàng)建的線程的消息隊(duì)列中,然后不等消息處理完就返回,而不像 SendMessage 那樣必須等到消息處理完畢才返回。目標(biāo)窗口通過(guò) GetMessage 或 PeekMessage從消息隊(duì)列中取出并處理。原型LRESULTPostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );PB 聲明FUNCTIONLong PostMessage (Long hwnd,Long wMsg,Long wParam,Long lParam)LIBRARYuser32.dllAL
21、IAS FOR PostMessageA參數(shù)hWnd為接收消息窗口的句柄;Msg指定要發(fā)送的消息;wParam依賴于消息Msg 的其他信息;lParam依賴于消息Msg 的其他信息。返回值如果函數(shù)調(diào)用成功,函數(shù)返回值為非0;如果調(diào)用失敗,函數(shù)返回0。示例下面代碼演示了如何通過(guò)發(fā)送消息,在PB 應(yīng)用中關(guān)閉另外運(yùn)行的第三方程序。1)運(yùn)行 Windows 的系統(tǒng)的記事本程序 NotePad,并創(chuàng)建一個(gè)未命名的文檔。2)在 PB 中新建一個(gè)窗口,為窗口聲明如下對(duì)象級(jí)外部函數(shù)和實(shí)例變量:FUNCTIONLong FindWindow(StringlpClassName,StringlpWindowNam
22、e) LIBRARYuser32.dllALIASFOR FindWindowAFUNCTIONLong PostMessage(Longhwnd, Long wMsg, Long wParam, Long lParam)LIBRARYuser32.dllALIAS FOR PostMessageAConstant long WM_QUIT = 18(3)在窗口上放置一個(gè)按鈕控件,為按鈕的Clicked事件加入如下腳本:String ls_sTitle, pbNullStringLong ll_iHwnd, ll_ihTaskLong ll_iReturnSetNull(pbNullStrin
23、g)ls_sTitle = 未定標(biāo)題 記事本 ll_iHwnd = FindWindow(SetNull, ls_sTitle) 8PowerBuilder Win32 API程序設(shè)計(jì)(高級(jí)卷)ll_iReturn = PostMessage(ll_iHwnd, WM_QUIT, 0, 0)MessageBox( 提示信息 , 記事本已經(jīng)關(guān)閉!)上述代碼運(yùn)行后,使用 FindWindow 函數(shù)獲取 Windows 記事本程序窗口的句柄,然后向記事本窗口發(fā)送 WM_QUIT 消息,記事本程序?qū)⒈魂P(guān)閉。1.2事件與消息1.2.1從消息到事件雖然在前面提到 Windows 系統(tǒng)會(huì)產(chǎn)生事件來(lái)驅(qū)動(dòng)對(duì)象,
24、 但更嚴(yán)格的講 Windows 息,然后由 PB 將其轉(zhuǎn)化為驅(qū)動(dòng)對(duì)象的事件。那么 PB 是如何將消息轉(zhuǎn)換為事件呢?先產(chǎn)生消1.1 節(jié)介紹了消息的概念。也可以通俗地將消息理解為由Windows操作系統(tǒng)送往程序的事件。它是系統(tǒng)中各個(gè)控件(窗口)溝通的方式。舉例來(lái)說(shuō),當(dāng)移動(dòng)鼠標(biāo)、按下鼠標(biāo)鍵、改變窗口視窗大小時(shí),Windows 都會(huì)送出消息以通知程序。當(dāng)然,為了要辨別事件的內(nèi)容,Windows系統(tǒng)中預(yù)定義了許多的消息,如WM_PAINT , WM_CHAR等。當(dāng)事件發(fā)生時(shí), Windows 系統(tǒng)根據(jù)窗口的身份碼句柄hWnd ,判斷該事件必須由哪個(gè)窗口接收,然后將事件以消息的方式送往程序的窗口中。雖然在
25、Windows 系統(tǒng)中包含了數(shù)以百計(jì)的事件, 但是操作系統(tǒng)并沒(méi)有為各個(gè)事件設(shè)計(jì)不同的消息結(jié)構(gòu),而是以一個(gè)一般性的結(jié)構(gòu)來(lái)描述消息,Windows 使用了一個(gè)特殊的函數(shù)來(lái)實(shí)現(xiàn)這一過(guò)程,這個(gè)函數(shù)的名稱叫做“窗口處理函數(shù)”或者叫做“窗口消息處理函數(shù)”,該函數(shù)就是 WindowProc 。LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );從函數(shù)的定義可以看出,任何要發(fā)送的消息都有4 個(gè)參數(shù),其中:HWND hwnd發(fā)送窗口的句柄UINT uMsg消息代碼Windows 中每一個(gè)消息都有惟一的一
26、個(gè)代碼。在 Visual Basic 的 API 文本瀏覽器中以常量的格式列出了所有消息名和代碼,在PB 中也可以直接利用Visual Basic 的 API 文本瀏覽器列出的這些消息,惟一需要做的就是將Visual Basic 十六進(jìn)制消息代碼轉(zhuǎn)換為PB 的十進(jìn)制,如在 Visual Basic 聲明定義的有關(guān)鼠標(biāo)移動(dòng)的消息:Public Const WM_MOUSEMOVE = &H200在 PB 中應(yīng)聲明為:Constant Long WM_MOUSEMOVE = 512WPARAM wParam 和 LPARAM lParam 為兩個(gè) 32 位的長(zhǎng)整型值,用來(lái)指定當(dāng)前發(fā)送消息時(shí)所帶信息
27、,如在鼠標(biāo)移動(dòng)時(shí)返回鼠標(biāo)的位置等。當(dāng) Windows 有消息需要通知程序的時(shí)候,它就會(huì)調(diào)用該函數(shù),然后自己的程序就從中檢第 1 章Windows系統(tǒng)的消息機(jī)制 9測(cè)發(fā)送的消息。Windows中消息的種類是很多的,不可能也沒(méi)有必要檢測(cè)所有的消息,只需要檢測(cè)感興趣的消息即可。檢測(cè)消息的程序其實(shí)就是一個(gè)條件判斷組合,如圖1.1 所示。那 么 未 處 理 的 消 息 到 那 里 去 了 ? Windows系 統(tǒng) 為 窗 口 提 供 了 默 認(rèn) 的 窗 口 過(guò) 程DefWindowProc,這個(gè)窗口過(guò)程將負(fù)責(zé)處理那些不需要的消息。正因?yàn)橛辛诉@個(gè)默認(rèn)窗口過(guò)程,才可以利用 Windows 的窗口進(jìn)行開(kāi)發(fā),而
28、不必過(guò)多關(guān)注窗口各種消息的處理。例如,窗口在被拖動(dòng)時(shí)會(huì)有很多消息發(fā)送,可以不予理睬讓系統(tǒng)自己去處理。接收消息是希望的是處理消息消息?否停止圖 1.1消息處理流程從上面分析可以看出,事件驅(qū)動(dòng)機(jī)制是針對(duì)諸如PB、Visual Basic 這類面向?qū)ο蟮拈_(kāi)發(fā)環(huán)境而言,在其背后隱含的是Windows 系統(tǒng)的消息驅(qū)動(dòng)機(jī)制,但Windows 系統(tǒng)的消息驅(qū)動(dòng)應(yīng)用范圍要比高級(jí)開(kāi)發(fā)語(yǔ)言定義的事件驅(qū)動(dòng)范圍廣泛的多。1.2.2PB 事件對(duì)消息的封裝在 PB 中,除了為窗口和控件預(yù)置的事件外,PB 還將 Windows 系統(tǒng)的許多消息封裝為用戶自選事件,根據(jù)與 Windows 系統(tǒng)的消息的對(duì)應(yīng)關(guān)系,為每個(gè)事件定義了E
29、ventID ,如圖 1.2所示。當(dāng)窗口或控件的預(yù)置事件無(wú)法滿足程序設(shè)計(jì)要求時(shí),可以使用這些自選事件。如在設(shè)備場(chǎng)景中繪制的位圖,當(dāng)窗口大小改變時(shí),位圖并不會(huì)自動(dòng)重繪。這時(shí)就需要使用窗口的事件ID號(hào)位 pbm_paint 事件,該事件與窗口的WM_PAINT消息相對(duì)應(yīng),當(dāng)窗口發(fā)生變化時(shí)強(qiáng)迫窗口重繪。在 PB 中,事件 ID 的作用是把PB 的事件與系統(tǒng)消息聯(lián)系起來(lái),被用戶的動(dòng)作或其他系統(tǒng)活動(dòng)觸發(fā)的事件必須具有ID 號(hào)。對(duì)于 PB 的系統(tǒng)對(duì)象,如窗口、按鈕等控件,定義好的系統(tǒng)事件通常都使用 ID 號(hào)。當(dāng)用戶使用自選事件時(shí),可以使用如圖 1.2 所示列在 Event Declaration 對(duì)話框中
30、的事件ID號(hào),用來(lái)響應(yīng)某個(gè)系統(tǒng)消息。如果定義被系統(tǒng)消息觸發(fā)的用戶自選事件,可以從ID 號(hào)列表中選擇事件 ID 號(hào)。其中,列在Event 對(duì)話框中的所有以pbm_前綴開(kāi)始的ID 號(hào),為映射到PB中的系統(tǒng)消息。在定義用戶自選事件時(shí),不能修改與事件ID 號(hào)相關(guān)的參數(shù)及返回值,因?yàn)檫@些是整個(gè)事件 ID 號(hào)的具體組成部分。如果與事件ID 號(hào)相應(yīng)的系統(tǒng)消息發(fā)生時(shí),PB 觸發(fā)該事件,并為事件的參數(shù)賦值。如果用戶自定義事件,并且與系統(tǒng)消息無(wú)關(guān),則不為事件選擇ID號(hào)。這樣事件將不會(huì)被用戶的動(dòng)作或系統(tǒng)的活動(dòng)觸發(fā),只能在應(yīng)用中用腳本來(lái)觸發(fā)。 10PowerBuilder Win32 API程序設(shè)計(jì)(高級(jí)卷)圖 1.
31、2PB 的用戶自選事件由于 PB 的技術(shù)開(kāi)發(fā)文檔中并未列出每個(gè)事件ID 的具體含義及與Windows 系統(tǒng)消息的對(duì)應(yīng)關(guān)系,用戶在使用這些自選事件時(shí)常常感到困惑。為此,筆者將這些事件與Windows 系統(tǒng)的消息的對(duì)應(yīng)關(guān)系及具體含義逐一進(jìn)行了分析,這些 PB 的自選事件ID 涵蓋了窗口消息, 以及按鈕、組合框、列表框、編輯掩碼等控件的消息,下面逐一列在表1-2 1-8 中,供讀者參考。(1) PB 的按鈕自選事件及對(duì)應(yīng)的系統(tǒng)消息,如表1-2 所示。(2) PB 的組合框控件(ComBox )自選事件及對(duì)應(yīng)的系統(tǒng)消息,如表1-3 所示。表 1-2按鈕事件及對(duì)應(yīng)的系統(tǒng)消息PB 的事件 IDpbm_bm
32、getstatepbm_bmsetcheckpbm_bmsetstatepbm_bnclickedpbm_bndisablepbm_bndoubleclickedpbm_bndragdroppbm_bndragenterpbm_bndragleavepbm_bndragoverpbm_bnhilitepbm_bnpaintpbm_bnsetfocuspbm_bnunhilite對(duì)應(yīng)的系統(tǒng)消息消息作用BM_GETSTATE按鈕是否加亮BM_SETCHECK設(shè)置按鈕的選中或未選中狀態(tài)BM_SETSTATE加亮或不加亮按鈕BN_CLICKED按鈕控件被單擊BN_DISABLE使按鈕控件無(wú)效BN_DO
33、UBLECLICKED按鈕控件被雙擊BN_DRAGDROP一個(gè)對(duì)象被放到按鈕控件BN_DRAGENTER一個(gè)對(duì)象被拖到按鈕控件BN_DRAGLEAVE一個(gè)對(duì)象被拖離按鈕控件BN_DRAGOVER一個(gè)對(duì)象被拖經(jīng)按鈕控件BN_HILITE按鈕控件被加亮BN_PAINT按鈕控件被繪制BN_SETFOCUS按鈕控件獲得焦點(diǎn)BN_UNHILITE按鈕控件不被加亮第 1 章 Windows 系統(tǒng)的消息機(jī)制11PB 的事件 ID pbm_cbaddstringpbm_cbdeletestringpbm_cbdirpbm_cbfindstringpbm_cbfindstringexactpbm_cbgetco
34、untpbm_cbgetcurselpbm_cbgetdroppedcontrolsetpbm_cbgeteditselpbm_cbgetextendeduipbm_cbgetitemdatapbm_cbgetitemheightpbm_cbgetlbtextpbm_cbgetlbtextlenpbm_cbinsertstringpbm_cblimittextpbm_cbresetcontentpbm_cbselectstringpbm_cbsetcurselpbm_cbseteditselpbm_cbsetextendeduipbm_cbsetitemdatapbm_cbsetitemhei
35、ghtpbm_cbshowdropdownpbm_cbndblclkpbm_cbndragdroppbm_cbndragenterpbm_cbndragleavepbm_cbndragoverpbm_cbndropdownpbm_cbneditchangepbm_cbneditupdatepbm_cbnerrspacepbm_cbnkillfocuspbm_cbnselchangepbm_cbnselendcancelpbm_cbnselendokpbm_cbnsetfocus表 1-3組合框事件及對(duì)應(yīng)的系統(tǒng)消息對(duì)應(yīng)的系統(tǒng)消息消息作用CB_ADDSTRING將字符串加到組合框CB_DELETE
36、STRING從組合框刪除一個(gè)字符串CB_DIR加一個(gè)目錄列表到組合框CB_FINDSTRING搜索以一組字符開(kāi)頭的字符串CB_FINDSTRINGEXACT搜索與所提供的字符完全匹配的字符串CB_GETCOUNT列表框中的項(xiàng)數(shù)CB_GETCURSEL當(dāng)前被選項(xiàng)的數(shù)目CB_GETDROPPEDCONTROLSET列表框在屏幕上的坐標(biāo)位置CB_GETEDITSEL編輯器控件中被選字符的范圍CB_GETEXTENDEDUI默認(rèn)或擴(kuò)展的用戶界面CB_GETITEMDATA重畫(huà)的列表框中的4 字節(jié)( 32 位)項(xiàng)CB_GETITEMHEIGHT列表框中某一項(xiàng)的高度CB_GETLBTEXT列表框中的文本C
37、B_GETLBTEXTLEN列表框中文本的長(zhǎng)度CB_INSERTSTRING向列表框中插入新的字符串項(xiàng)CB_LIMITTEXT限制能被輸入到列表框中的字符數(shù)CB_RESETCONTENT刪除列表框中所有內(nèi)容CB_SELECTSTRING搜索匹配的字符串并顯示CB_SETCURSEL在列表框中選擇并顯示一項(xiàng)CB_SETEDITSEL在列表框的編輯區(qū)域中選擇一塊文本CB_SETEXTENDEDUI設(shè)置默認(rèn)或擴(kuò)展的用戶界面CB_SETITEMDATA在列表框中設(shè)定4 字節(jié)( 32 位)項(xiàng)CB_SETITEMHEIGHT設(shè)置列表框中項(xiàng)的高度CB_SHOWDROPDOWN顯示或隱藏列表框中下拉列表區(qū)域C
38、BN_DBLCLK用戶在列表中某一項(xiàng)上雙擊鼠標(biāo)CBN_DRAGDROP一個(gè)對(duì)象被放到組合框控件上CBN_DRAGENTER一個(gè)對(duì)象被拖到組合框控件上CBN_DRAGLEAVE一個(gè)對(duì)象被拖離組合框控件CBN_DRAGOVER一個(gè)對(duì)象被拖經(jīng)組合框控件CBN_DROPDOWN列表框的下拉區(qū)域即將被顯示CBN_EDITCHANGE編輯器控件中的文本發(fā)生變化CBN_EDITUPDATE列表框編輯器控件中的文本即將被改變CBN_ERRSPACE列表框滿,不能再向其中加入項(xiàng)CBN_KILLFOCUS通用列表框失去焦點(diǎn)CBN_SELCHANGE列表框中被選文本被改變CBN_SELENDCANCEL用戶按下了“
39、取消”按鈕CBN_SELENDOK用戶按下了“確認(rèn)”按鈕CBN_SETFOCUS通用對(duì)話控件擁有焦點(diǎn) 12PowerBuilder Win32 API程序設(shè)計(jì)(高級(jí)卷)( 3)PB 的編輯控件( EditMask )自選事件及對(duì)應(yīng)的系統(tǒng)消息,如表1-4 所示。( 4)PB 的列表框控件(ListBox )自選事件及對(duì)應(yīng)的系統(tǒng)消息,如表1-5 所示。表 1-4編輯控件事件及對(duì)應(yīng)的系統(tǒng)消息PB 的自選事件ID對(duì)應(yīng)的系統(tǒng)消息pbm_emcanundoEM_CANUNDOpbm_ememptyundobufferEM_EM_PTYUNDOBUFFERpbm_emfmtlinesEM_FMTLINESp
40、bm_emgetfirstvisiblelineEM_GETFIRSTVISIBLELINEpbm_emgethandleEM_GETHANDLEpbm_emgetlineEM_GETLINEpbm_emgetlinecountEM_GETLINECOUNTpbm_emgetmodifyEM_GETMODIFYpbm_emgetrectEM_GETRECTpbm_emgetselEM_GETSELpbm_emlimittextEM_LIMITTEXTpbm_emlinefromcharEM_LINEFROMCHARpbm_emlineindexEM_LINEINDEXpbm_emlinelen
41、gthEM_LINELENGTHpbm_emlinescrollEM_LINESCROLLpbm_emreplaceselEM_REPLACESELpbm_emsethandleEM_SETHANDLEpbm_emsetmodifyEM_SETMODIFYpbm_emsetpasswordcharEM_SETPASSWORDCHARpbm_emsetrectEM_SETRECTpbm_emsetrectnpEM_SETRECTNPpbm_emsetselEM_SETSELpbm_emsettabstopsEM_SETTABSTOPSpbm_emsetwordbreakEM_SETWORDBRE
42、AKpbm_emsetwordbreakprocEM_SETWORDBREAKPROCpbm_emundoEM_UNDOpbm_enchangeEN_CHANGEpbm_enerrspaceEN_ERRSPACEpbm_enhscrollEN_HSCROLLpbm_enmaxtextEN_MAXTEXTpbm_enupdateEN_UPDATEpbm_envscrollEN_VSCROLL消息作用編輯器控件是否能撤消上一次修改清空由 Windows 管理的取消操作的緩沖區(qū)在多行編輯器控件的行尾增加或刪除回車換行返回編輯器控件中可見(jiàn)的第一行的行號(hào)獲得編輯器控件使用的內(nèi)存句柄從編輯器控件中復(fù)制一行
43、到內(nèi)存緩沖區(qū)返回多行編輯器控件的行數(shù)文本是否被用戶修改返回控件的長(zhǎng)方形域返回被選文本的起始位置限制用戶鍵入的文本長(zhǎng)度返回被選文本的行號(hào)返回控件中被選行第一個(gè)字符在編輯串中的位置返回編輯器控件中被選行中的字符數(shù)水平或垂直卷滾編輯器控件從剪貼板或從鍵盤上用新文本替換被選文本設(shè)置編輯器控件的句柄設(shè)置編輯器控件的modified 標(biāo)志設(shè)置用戶輸入任何文本時(shí)顯示的字符,在輸入密碼時(shí)的顯示設(shè)置 / 重置編輯器控件所在的長(zhǎng)方形區(qū)域 ,編輯器控件中的文本被重畫(huà)除了不重畫(huà)文本,大致與setrect 相同選擇字符在多行編輯器控件中設(shè)置tabstops設(shè)置新的詞拆分函數(shù)設(shè)置新的詞拆分過(guò)程撤消最近的編輯操作編輯器控件
44、中的文本發(fā)生改變編輯器控件內(nèi)存緩沖區(qū)溢出用戶點(diǎn)中上水平滾動(dòng)條用戶試圖輸入比允許更多的文本編輯器控件即將顯示用戶的修改用戶點(diǎn)中垂直滾動(dòng)條第 1 章 Windows 系統(tǒng)的消息機(jī)制13表 1-5列表框控件事件及對(duì)應(yīng)的系統(tǒng)消息PB 的事件 ID對(duì)應(yīng)的系統(tǒng)消息pbm_lbaddstringLB_ADDSTRINGpbm_lbdeletestringLB_DELETESTRINGpbm_lbdirLB_DIRpbm_lbfindstringLB_FINDSTRINGpbm_lbfindstringexactLB_FINDSTRINGEXACTpbm_lbgetcaretindexLB_GETCARETI
45、NDEXpbm_lbgetcountLB_GETCOUNTpbm_lbgetcurselLB_GETCURSELpbm_lbgethorizontalextentLB_GETHORIZONTALEXTENT消息作用向列表框控件中增加一項(xiàng)或一個(gè)字符串從列表框中刪除一項(xiàng)或一個(gè)字符串用目錄列表填充列表框在列表框中搜索與所給字符串匹配的項(xiàng)在列表框中搜索與所給字符串精確匹配的項(xiàng)在列表框中搜索擁有焦點(diǎn)的項(xiàng)確定列表框中的項(xiàng)數(shù)確定所選項(xiàng)是第幾項(xiàng)獲得列表框的寬度、計(jì)算水平卷滾pbm_lbgetitemheight pbm_lbgetitemrect pbm_lbgetsel pbm_lbgetselcount
46、pbm_lbgetselitems pbm_lbgettext pbm_lbgettextlen pbm_lbgettopindex pbm_lbinsertstring pbm_lbresetcontent pbm_lbselectstring pbm_lbselitemrange pbm_lbsetcaretindex pbm_lbsetcolumnwidth pbm_lbsetcurselpbm_lbsethorizontaltextpbm_lbsetitemdatapbm_lbsetitemheightpbm_lbsetselpbm_lbsettabstopspbm_lbsettopi
47、ndexpbm_endblclkpbm_enerrspacepbm_enselcancelpbm_enselchangeLB_GETITEMHEIGHTLB_GETITEMRECTLB_GETSELLB_GETSELCOUNTLB_GETSELITEMSLB_GETTEXTLB_GETTEXTLENLB_GETTOPINDEXLB_INSERTSTRINGLB_RESETCONTENTLB_SELECTSTRINGLB_SELITEMRANGELB_SETCARETINDEXLB_SETCOLUMNWIDTHLB_SETCURSELLB_SETHORIZONTALTEXTLB_SETITEMD
48、ATALB_SETITEMHEIGHTLB_SETSELLB_SETTABSTOPSLB_SETTOPINDEXLBN_DBLCLKLBN_ERRSPACELBN_SELCANCELLBN_SELCHANGE確定列表框控件中項(xiàng)的高度確定列表框的尺寸獲得列表框中當(dāng)前所選的項(xiàng)在多選列表框中獲得所選項(xiàng)的數(shù)目用列表框中各自的項(xiàng)號(hào)填充給定的整數(shù)數(shù)組獲得列表框中當(dāng)前所選項(xiàng)的文本獲得列表框中當(dāng)前所選項(xiàng)的文本中的字符數(shù)確定列表框中可見(jiàn)的最上面一項(xiàng)的項(xiàng)號(hào)向列表框中加入一個(gè)新字符串重置(消除)列表框中的內(nèi)容搜索并加亮與所給字符匹配的字符串選擇 / 取消列表框中某一范圍中的項(xiàng)設(shè)置列表框中的某一項(xiàng)擁有焦點(diǎn)設(shè)置列表框中
49、列的寬度在列表框中選擇并加亮一項(xiàng)設(shè)置列表框中被水平卷滾的單元數(shù)設(shè)置與列表框相關(guān)的 32 位/4 字節(jié)值設(shè)置列表框中項(xiàng)的高度在列表框中選擇一個(gè)字符串設(shè)置列表框控件中tabstops 的位置滾動(dòng)列表框使特定的項(xiàng)成為可見(jiàn)的最上面項(xiàng)用戶在列表框控件中的某一項(xiàng)上雙擊用戶試圖超越可在列表框中輸入字符的最大限制當(dāng)前選取文本被取消用戶在列表框中選擇或取消了一項(xiàng)(5) PB 的窗口自選事件及對(duì)應(yīng)的系統(tǒng)消息,如表1-6 所示。 14PowerBuilder Win32 API程序設(shè)計(jì)(高級(jí)卷)表 1-6窗口事件及對(duì)應(yīng)的系統(tǒng)消息PB 的事件 IDpbm_activateapppbm_askcbformatnamep
50、bm_charpbm_chartoitempbm_childactivatepbm_clearpbm_commandpbm_compactingpbm_compareitempbm_ctlcolorpbm_deadcharpbm_deleteitempbm_destroyclipboard pbm_devmodechanged pbm_drawclipboard pbm_drawitempbm_dropfilespbm_erasebkgndpbm_fontchangepbm_getdlgcodepbm_getfontpbm_getminmaxintopbm_gettextpbm_gettext
51、lengthpbm_hscrollclipboardpbm_iconerasebkgndpbm_initdialogpbm_initmenupbm_initmenupopuppbm_keydown對(duì)應(yīng)的系統(tǒng)消息WM_ACTIVATEAPPWM_ASKCBFORMATNAMEWM_CHARWM_CHARTOITEM WM_CHILDACTIVATE WM_CLEAR WM_COMMANDWM_COMPACTINGWM_COMPAREITEMWM_CTLCOLORWM_DEADCHARWM_DELETEITEMWM_DESTROYCLIPBOARD WM_DEVMODECHANGED WM_DRA
52、WCLIPBOARD WM_DRAWITEMWM_DROPFILESWM_ERASEBKGNDWM_FONTCHANGEWM_GETDLGCODEWM_GETFONTWM_GETMINMAXINTOWM_GETTEXTWM_GETTEXTLENGTHWM_HSCROLLCLIPBOARDWM_ICONERASEBKGNDWM_INITDIALOGWM_INITMENUWM_INITMENUPOPUPWM_KEYDOWN消息作用被激活的窗口屬于另外一個(gè)應(yīng)用要求剪貼板中的內(nèi)容被復(fù)制到一個(gè)使用自定義格式的文本緩沖區(qū)中傳送鍵盤上按下的鍵通過(guò)轉(zhuǎn)換鍵盤來(lái)的字符,幫助列表框定位其中的項(xiàng)一個(gè)子窗口被移動(dòng)或激活
53、用戶要?jiǎng)h除當(dāng)前編輯器控件中的內(nèi)容用戶選擇了一個(gè)菜單項(xiàng)、控件或使用了加速鍵系統(tǒng)內(nèi)存資源不足;當(dāng)Windows 占用了多于1/8的 CPU 時(shí)間緊縮內(nèi)存時(shí),產(chǎn)生這條消息當(dāng)新項(xiàng)被加入列表框或組合框時(shí)產(chǎn)生此消息,系統(tǒng)用這條消息進(jìn)行項(xiàng)之間的比較一個(gè)控件即將被繪制,可在此時(shí)改變控件的顏色用戶選擇了一種非英語(yǔ)字符集或其他特殊字符集,這將改變下面將要輸入的字符從列表框或組合框中移去一項(xiàng)剪貼板內(nèi)容被清除WIN.INI中的一個(gè)設(shè)備名被修改剪貼板內(nèi)容發(fā)生改變列表框或組合框的一項(xiàng)內(nèi)容被改變當(dāng)鼠標(biāo)左鍵在一個(gè)注冊(cè)為拖放文件接受器的應(yīng)用上釋放時(shí),發(fā)出該消息窗口的客戶區(qū)需要重畫(huà)應(yīng)用可用的字體數(shù)改變通知消息,說(shuō)明當(dāng)前使用哪種類
54、型的鍵盤獲取當(dāng)前激活的字體檢索窗口可設(shè)置的最小或最大尺寸從一個(gè)控件 (如按鈕或編輯器控件 )中復(fù)制文本到一個(gè)內(nèi)存緩沖區(qū)用來(lái)確定一個(gè)控件中的字符數(shù)剪貼板的水平滾動(dòng)條被使用一個(gè)最小化窗口需要重畫(huà)背景一個(gè)對(duì)話框即將被顯示一個(gè)菜單即將被顯示一個(gè)彈出式窗口即將被顯示鍵盤上的一個(gè)鍵被按下PB 的事件 IDpbm_keyuppbm_mdiactivepbm_mdicascadepbm_mdicreatepbm_mdidestroypbm_mdigetactivepbm_mdiiconrangepbm_mdimaximizepbm_mdinextpbm_mdirestorepbm_mdisetmenupbm_
55、mdifitlepbm_measureitempbm_menucharpbm_menuselectpbm_mouseactivatepbm_mousemovepbm_ncactivatepbm_nccalcsizepbm_nccreatepbm_ncdestroypbm_nchittestpbm_nclbuttondblclkpbm_ncpaintpbm_nextdlgctlpbm_paintclipboardpbm_paintPB 的事件 IDpbm_palettechangedpbm_paletteischangingpbm_parentnotifypbm_querydragiconpbm
56、_queryendsessionpbm_querynewpalettepbm_queryopenpbm_quit第 1 章 Windows對(duì)應(yīng)的系統(tǒng)消息WM_KEYUPWM_MDIACTIVEWM_MDICASCADEWM_MDICREATEWM_MDIDESTROYWM_MDIGETACTIVEWM_MDIICONRANGEWM_MDIMAXIMIZEWM_MDINEXTWM_MDIRESTOREWM_MDISETMENUWM_MDIFITLEWM_MEASUREITEMWM_MENUCHARWM_MENUSELECTWM_MOUSEACTIVATEWM_MOUSEMOVEWM_NCACTI
57、VATEWM_NCCALCSIZEWM_NCCREATEWM_NCDESTROYWM_NCHITTESTWM_NCLBUTTONDBLCLKWM_NCPAINTWM_NEXTDLGCTLWM_PAINTCLIPBOARDWM_PAINT對(duì)應(yīng)的系統(tǒng)消息WM_PALETTECHANGEDWM_PALETTEISCHANGINGWM_PARENTNOTIFYWM_QUERYDRAGICONWM_QUERYENDSESSIONWM_QUERYNEWPALETTEWM_QUERYOPENWM_QUIT系統(tǒng)的消息機(jī)制15續(xù)表消息作用鍵盤上的一個(gè)鍵被釋放一個(gè) MDI 子窗口(窗口)被激活以重疊的形式重排所有
58、的窗口創(chuàng)建一個(gè)窗口從 MDI 框架中移去一個(gè)窗口獲得當(dāng)前活動(dòng)的 MDI 窗口的句柄在一個(gè) MDI 框架中重排最小化窗口的圖標(biāo)最大化一個(gè) MDI 子窗口激活下一個(gè) MDI 子窗口(緊接著活動(dòng)窗口的窗口)把 MDI 窗口恢復(fù)到它原來(lái)的大小將一個(gè)菜單與一個(gè) MDI 窗口聯(lián)系起來(lái)平鋪所有的MDI 窗口這個(gè)消息被送給即將創(chuàng)建的、內(nèi)有按鈕或其他控件的窗口用戶使用了一個(gè)快捷鍵 ,但系統(tǒng)不支持該快捷鍵用戶選擇了一個(gè)菜單項(xiàng)用戶在一個(gè)非活動(dòng)窗口中單擊了鼠標(biāo)用戶移動(dòng)了鼠標(biāo)窗口的非客戶區(qū)即將被激活窗口的尺寸需要重新計(jì)算窗口即將創(chuàng)建它的非客戶區(qū)窗口的非共享區(qū)被析構(gòu)每次非客戶區(qū)被移動(dòng)時(shí)都發(fā)送該消息用戶在非客戶區(qū)雙擊了鼠標(biāo)
59、非客戶需要畫(huà)出在對(duì)話框中將焦點(diǎn)轉(zhuǎn)給另一個(gè)控件剪貼板應(yīng)用有剪貼操作,剪貼板查看器需重畫(huà)窗口的客戶區(qū)需要被畫(huà)出消息作用系統(tǒng)調(diào)色板被改變系統(tǒng)調(diào)色板即將被改變通知父窗口一個(gè)子窗口即將被創(chuàng)建用戶要拖動(dòng)一個(gè)最小化窗口通知消息,說(shuō)明窗口即將被關(guān)閉應(yīng)用即將收到輸入焦點(diǎn), 應(yīng)該執(zhí)行必要的顏色調(diào)整一個(gè)最小化窗口即將被恢復(fù)應(yīng)用處理的最后一個(gè)消息 16PB 的事件 IDpbm_renderallformatspbm_renderformatspbm_setcursorpbm_setfontpbm_setredrawpbm_settextpbm_sizeclipboardpbm_spoolerstatuspbm_syscharpbm_syscolorchangepbm_syscommandpbm_sysdeadcharpbm_syskeydownpbm_syskeyupp
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 全國(guó)青島版信息技術(shù)七年級(jí)下冊(cè)專題一第9課四、《數(shù)據(jù)透視表》教學(xué)設(shè)計(jì)
- 2025年計(jì)劃生育技術(shù)服務(wù)項(xiàng)目發(fā)展計(jì)劃
- 第17課 第二次世界大戰(zhàn)與戰(zhàn)后國(guó)際秩序的形成 教學(xué)設(shè)計(jì)-2023-2024學(xué)年高中歷史統(tǒng)編版(2019)必修中外歷史綱要下冊(cè)
- 一看雜技-表內(nèi)乘法(一)第2課時(shí)(教學(xué)設(shè)計(jì))-2024-2025學(xué)年二年級(jí)上冊(cè)數(shù)學(xué)青島版(五四學(xué)制)
- 2025年網(wǎng)紅直播合作協(xié)議書(shū)
- 11 趙州橋 教學(xué)設(shè)計(jì)-2023-2024學(xué)年語(yǔ)文三年級(jí)下冊(cè)統(tǒng)編版
- 10《牛郎織女(一)》教學(xué)設(shè)計(jì)-2024-2025學(xué)年語(yǔ)文五年級(jí)上冊(cè)統(tǒng)編版
- 第6課《被壓扁的沙子》教學(xué)設(shè)計(jì)-2023-2024學(xué)年統(tǒng)編版語(yǔ)文八年級(jí)下冊(cè)
- 第11課 音樂(lè)盒之二 防空警報(bào)-高中信息技術(shù)Arduino開(kāi)源硬件系列課程教學(xué)設(shè)計(jì)
- 川教版(2019)小學(xué)信息技術(shù)四年級(jí)下冊(cè) 第二單元第3節(jié)《圖文并茂》教學(xué)設(shè)計(jì)及反思
- 2025年度空調(diào)安裝驗(yàn)收及保修服務(wù)合同
- 急救護(hù)理學(xué)第十章災(zāi)難救護(hù)講解
- 2025年常德職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- GB/T 19411-2024除濕機(jī)
- 四年級(jí)四年級(jí)下冊(cè)閱讀理解20篇(附帶答案解析)經(jīng)典
- 簡(jiǎn)約喜慶元宵節(jié)介紹模板 教學(xué)課件
- 《網(wǎng)絡(luò)服務(wù)器搭建、配置與管理-Linux(RHEL8、CentOS8)(微課版)(第4版)》全冊(cè)電子教案
- 球泡檢驗(yàn)標(biāo)準(zhǔn)
- 振動(dòng)分析基礎(chǔ)講義1
- 記賬憑證匯總表excel模板
- 四川省老舊小區(qū)改造更新技術(shù)導(dǎo)則(試行)
評(píng)論
0/150
提交評(píng)論