Windows系統(tǒng)的消息機制資料_第1頁
Windows系統(tǒng)的消息機制資料_第2頁
Windows系統(tǒng)的消息機制資料_第3頁
Windows系統(tǒng)的消息機制資料_第4頁
Windows系統(tǒng)的消息機制資料_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第 1 章 Windows 系統(tǒng)的消息機制對諸如 PowerBuilder (后文簡寫為PB)、 Visual Basic 和 Dephi 等大多數(shù)可視化程序設(shè)計語言來講,程序設(shè)計的核心是對象的事件、屬性和方法,但對Windows 系統(tǒng)本身而言,卻是以消息處理為其控制機制。Windows把系統(tǒng)中的對象都作為窗口來對待,每個窗口都有一個用來標(biāo)識其身份的句柄。Windows通過向窗口發(fā)送消息,在開發(fā)語言中轉(zhuǎn)化為對象的事件,然后驅(qū)動對象,響應(yīng)用戶的動作。在許多面向?qū)ο蟮目梢暬绦蛟O(shè)計語言中,Windows的眾多消息已經(jīng)演變成了對象的屬性或方法。本章內(nèi)容包括Windows 系統(tǒng)的消息機制、消息的發(fā)送、

2、消息的應(yīng)用實例等。1.1Windows 的工作機制1.1.1Windows的工作方式窗口、事件和消息全面地討論Windows 的內(nèi)部工作機制需要很大的篇幅,對于一般的PB 用戶當(dāng)然沒有必要深入了解所有的技術(shù)細(xì)節(jié)。Windows 系統(tǒng)的工作機制,簡單地說就是3 個關(guān)鍵的概念:窗口、事件和消息。不妨簡單地將窗口看做帶有邊界的矩形區(qū)域。讀者也許已經(jīng)了解多種不同類型的窗口,如 Windows 系統(tǒng)的“資源管理器”窗口、文字處理程序中的文檔窗口或者彈出提示有約會信息的消息對話框窗口等。 除了這些最普通的窗口外, 實際上還有許多其他類型的窗口。 命令按鈕是一個窗口,圖標(biāo)、文本框、選項按鈕和菜單條也都是窗口

3、。Windows操作系統(tǒng)通過給每一個窗口指定一個惟一的標(biāo)識號(窗口句柄,常用hWnd 表示)來管理所有的窗口。操作系統(tǒng)連續(xù)地監(jiān)視每一個窗口的活動或事件的信號。事件可以通過諸如單擊鼠標(biāo)或按下按鍵的操作而產(chǎn)生,也可以通過程序的控制而產(chǎn)生,甚至可以由另一個窗口的操作而產(chǎn)生。每發(fā)生一次事件,將引發(fā)一條消息發(fā)送至操作系統(tǒng)。操作系統(tǒng)處理該消息并廣播給其他窗口。 然后,每一個窗口才能根據(jù)自身處理該條消息的指令而采取適當(dāng)?shù)牟僮鳎ɡ纾?當(dāng)窗口解除了其他窗口的覆蓋時,重新繪制自身窗口)。可以想象,處理各種窗口、事件和消息的所有可能的組合將有驚人的工作量。幸運的是,PB 使用戶擺脫了所有的低層消息處理。許多消息由

4、PB 自動處理了,其他的作為事件過程由編程者自行處理,這樣可以快速創(chuàng)建強大的應(yīng)用程序,而毋需涉及不必要的細(xì)節(jié)。1.1.2句柄的概念在解釋消息之前,首先了解系統(tǒng)如何準(zhǔn)確地將消息發(fā)送到指定的窗口。當(dāng)一個應(yīng)用或多第 1 章Windows系統(tǒng)的消息機制 3個應(yīng)用運行后,會同時創(chuàng)建許多個窗口,Windows作為系統(tǒng)的“大總管”,那么它又是如何識別每一個窗口呢?在程序設(shè)計時,通過窗口的名稱屬性,為每個窗口命名,然后在程序其他部分把窗口名作為識別窗口的標(biāo)識。這種通過為窗口命名來識別不同窗口的方法,對 Windows系統(tǒng)來講顯然是不現(xiàn)實的。Windows 系統(tǒng)是通過稱之為句柄的標(biāo)識符來識別每一個窗口。句柄是系

5、統(tǒng)動態(tài)分配給窗口的32 位整型數(shù)標(biāo)識值,常用hWnd 表示,即英文handle to awindow 的縮寫。大量API 函數(shù)都需要窗口句柄作參數(shù),或返回一個窗口或設(shè)備場境的句柄。句柄可以通俗地理解為Windows 為系統(tǒng)中所有存在的窗口動態(tài)分配的身份識別號碼。在 PB 中,可以通過handle 函數(shù)來取得窗口和控件的句柄,當(dāng)聲明API 函數(shù)時,常把保存句柄的變量聲明為Long 或 Ulong 長整型數(shù)據(jù)類型。Windows 為窗口和控件分配句柄標(biāo)識是動態(tài),同樣的程序每次運行時和在不同計算機上運行時所分配的窗口句柄標(biāo)識可能是完全不一樣的。窗口的句柄屬性僅能在運行時訪問,該屬性對窗口的外觀并沒有

6、任何影響,它僅作為API函數(shù)調(diào)用的參數(shù)或返回值,或其他需識別窗口或?qū)ο蟮牡胤?。在后面章?jié)中, 讀者將會看到幾乎所有涉及窗口的API 函數(shù)都需要傳遞hWnd 參數(shù),以便函數(shù)準(zhǔn)確獲得用戶要處理的窗口或?qū)ο?。句柄作為由操作系統(tǒng)定義的惟一的長整型值,可以用它來引用窗體和控件等對象。在Windows 系統(tǒng)中, API 函數(shù)的調(diào)用常用的句柄包括窗口句柄,菜單句柄、 設(shè)備對象句柄、設(shè)備場景句柄, 等等。 如果函數(shù)需要用句柄作為參數(shù),則應(yīng)該把參數(shù)聲明為傳值,對于返回句柄的API 函數(shù),應(yīng)將返回的句柄值聲明為Long 或 Ulong 類型數(shù)據(jù)類型。句柄是一種標(biāo)識符(ID )編號,而不是指針或者數(shù)值,不要試圖對它

7、們進(jìn)行任何數(shù)學(xué)運算。1.1.3消息的概念Windows 系統(tǒng)是以消息處理為其控制機制, 系統(tǒng)通過消息為窗口過程 ( windows procedure )傳遞輸入。 系統(tǒng)和應(yīng)用兩者都可以產(chǎn)生消息。 對于每個輸入事件, 例如用戶按下了鍵盤上的某個鍵、移動了鼠標(biāo)、單擊了一個控件上的滾動條,等等,系統(tǒng)都將產(chǎn)生一系列消息。此外,對于應(yīng)用帶給系統(tǒng)的變化,如字體資源的改變、應(yīng)用本身窗口的改變,系統(tǒng)都將通過消息以響應(yīng)這種變化。應(yīng)用通過產(chǎn)生消息指示應(yīng)用的窗口完成特定的任務(wù),或與其他應(yīng)用的窗口進(jìn)行通信。每個窗口都有一個處理 Windows 系統(tǒng)發(fā)送消息的處理程序,稱為窗口程序。它是隱含在窗口背后的一段程序腳本,

8、其中包含對事件進(jìn)行處理的代碼。Windows 系統(tǒng)為每條消息指定了一個消息編號,例如當(dāng)一個窗口變?yōu)榛顒哟翱跁r,它事實上是收到一條來自 Windows 系統(tǒng)的 WM_ACTIVATE 消息,該消息的編號為 6,它對應(yīng)于 PB 窗口的 Activate 事件。對于窗口來說,諸如 Open、Activate 、MouseDown 、Resize 等事件,實際上對應(yīng)的是窗口內(nèi)部的消息處理程序,這些程序?qū)τ谟脩魜碇v是不可見的。類似地,命令按鈕也有消息處理程序, 它的處理程序響應(yīng)諸如WM_LBUTTONDOWN和 WM_RBUTTONDOWN類的消息,即激活命令按鈕的MouseDown 事件。3之1)窗口

9、句柄( a window handle ):窗口句柄用來標(biāo)識消息將要發(fā)送到的窗口對象,系統(tǒng)使用窗口句柄來確定哪一個窗口句柄應(yīng)該接收該消息。 4PowerBuilder Win32 API程序設(shè)計(高級卷)2)消息標(biāo)識符( a message identifier):消息標(biāo)識符是用來區(qū)分不同消息的命名常量,當(dāng)窗口過程接收到一個消息時, 它使用消息標(biāo)識符來確定如何處理該消息。例如,消息標(biāo)識符WM_PAINT告訴窗口過程“窗口的客戶區(qū)已經(jīng)發(fā)生變化,窗口必須進(jìn)行重新繪制”。3)消息參數(shù)( message parameters):消息參數(shù)用來表述窗口過程處理消息時所使用的數(shù)據(jù)或數(shù)據(jù)的位置, 通常用一對參

10、數(shù)表示。 消息參數(shù)的意義和取值取決于消息。 消息參數(shù)取值可以是整型數(shù)、 Bit 位標(biāo)識、指向結(jié)構(gòu)的指針,等等,當(dāng)不需要使用消息參數(shù)時,通常將其設(shè)置為 NULL 。窗口過程必須通過檢查消息標(biāo)識符來確定如何對消息參數(shù)進(jìn)行解釋。有關(guān)消息標(biāo)識符、消息參數(shù)的具體使用,將在后面介紹解釋。Sendmessage 函數(shù)時給予進(jìn)一步1.1.4消息的類型1系統(tǒng)定義的消息當(dāng)系統(tǒng)與應(yīng)用進(jìn)行通信時,系統(tǒng)將發(fā)送或郵寄消息。系統(tǒng)通過這些消息控制應(yīng)用的運行,并為應(yīng)用的進(jìn)程提供輸入或其他信息。應(yīng)用內(nèi)部也可發(fā)送或郵寄系統(tǒng)定義的消息,應(yīng)用通常使用這些消息控制由預(yù)先注冊的窗口類創(chuàng)建的窗口的操作。每一個系統(tǒng)定義的消息都有一個惟一的消息

11、標(biāo)識符(值),并用一個表明消息用途標(biāo)識符常量表示(這些在SDK 的頭文件中定義)。如WM_PAINT消息標(biāo)識符表示要求窗口進(jìn)行重繪的消息。消息標(biāo)識符常量前綴表示消息所屬的消息類別,如WM_ 表示窗口類消息,BM_ 表示按鈕類消息,表1-1 給出了不同類別消息的前綴。在 PB 中,消息標(biāo)識符常量通常聲明為窗口或?qū)ο蟮膶嵗A浚纾篊ONSTANT 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)識符前綴消息分類ABM應(yīng)用桌面工具欄消息BM按鈕控件消息CB組合框控件消息CBEM擴展組合框控件消息CDM通用對話框消息DBT設(shè)備消息DL拖曳列表框控件消息DMDTM默認(rèn)按鈕控件消息日期時間選取控件消息消息標(biāo)識符前綴EMHDMHKMIPMLBLVMMCMPBMPGMPSMRBSBSBMSTMTBTBMTCMTTMTVMUDMWM第 1 章Windows 系統(tǒng)

13、的消息機制 5續(xù)表消息分類編輯控件消息頭控件消息熱鍵控件消息IP 地址控件消息列表框控件消息列表視圖控件消息月歷控件消息進(jìn)度條控件消息Pager 控件消息屬性頁面消息Rebar 控件消息狀態(tài)欄窗口消息滾動條控件消息靜態(tài)控件消息工具欄消息跟蹤條控件消息Tab 控件消息Tooltip 控件消息樹形控件消息Up-down控件消息普通窗口消息Windows系統(tǒng)使用了成千上萬條消息。從窗口到控件都有一組可接收和響應(yīng)的消息。在Visual Basic 的 API 瀏覽器中,以常量的方式列出了Windows 的大部分消息。據(jù)粗略統(tǒng)計,微軟在MSDN 中列出的消息約有數(shù)千種,全部弄清楚這么多種消息是不現(xiàn)實的,

14、也是沒有必要的。這是因為PB 已經(jīng)將很多消息封裝為了對象的“屬性”(例如窗口的Title 和 WindowState 屬性)和“方法(函數(shù))”(例如關(guān)閉窗口函數(shù)Close)??梢园l(fā)現(xiàn),消息可能演變成PB 對象的屬性、方法(函數(shù))和事件。既然PB 已經(jīng)對消息進(jìn)行了封裝,那么又何必使用消息來進(jìn)行程序設(shè)計呢?這時因為,PB 提供的事件、屬性和方法并未完全涵蓋所有消息,為了彌補PB 在某些功能的不足,常使用系統(tǒng)消息或應(yīng)用自定義的消息來強化PB 的程序設(shè)計。2應(yīng)用定義的消息應(yīng)用也可以創(chuàng)建自己的消息,并將消息應(yīng)用于它的窗口或與其他窗口的進(jìn)程進(jìn)行通信。如果應(yīng)用創(chuàng)建了自己的消息,接收消息的窗口過程必須解釋消息

15、,同時對消息進(jìn)行恰當(dāng)?shù)奶幚?。系統(tǒng)保留的消息標(biāo)識符的取值范圍為0 x0000 0 x03FF( 0 1023),專門用于系統(tǒng)定義的消息;應(yīng)用定義的消息不能使用這些值,應(yīng)用定義的消息取值范圍為0 x0400 0 x7FFF( 0 32767)。RegisterWindowMessage 函數(shù)提供了分配消息編號的功能,該函數(shù)用一個消息名稱作為參 6PowerBuilder Win32 API程序設(shè)計(高級卷)數(shù),并為這個名稱分配一個惟一的、尚未使用過的編號。1.1.5用于發(fā)送消息的API 函數(shù)Windows 應(yīng)用程序允許應(yīng)用程序向自己或其他應(yīng)用程序發(fā)送消息,甚至可以向Windows操作系統(tǒng)本身發(fā)送消

16、息(比如要求關(guān)閉操作系統(tǒng)或重新啟動操作系統(tǒng))。Windows提供了2個專門用于發(fā)送消息的API 函數(shù) SendMessage 和 PostMessage。1 SendMessage函數(shù)SendMessage 函數(shù)發(fā)送指定的消息到窗口或Windows 系統(tǒng),然后函數(shù)調(diào)用窗口的處理消息的過程,并等待窗口過程處理完消息后返回。原型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 兩個參數(shù)的含義隨消息wMsg 參數(shù)不同而改變, 因此每當(dāng)向窗口傳遞某種消息時,除了要了解該消息的含義外,還要注意wParam 和 lParam 的含義和設(shè)置。SendMessage 函數(shù)會返回一個Long 值,由于這個函數(shù)是直接調(diào)用窗口程序,因此窗口程序可以返回一

18、個值, 把它作為 SendMessage 函數(shù)的返回值, 這個返回值的具體含義由消息決定。不過,除非在MSDN 明確列出了該消息的返回值,否則,返回值就沒有具體意義,應(yīng)該忽略。此外,在使用返回值時,通常調(diào)用SendMessageTimeOut 函數(shù)檢查是否超時,因為只有在消息完全處理完畢后,才能得到一個有效返回值。前面曾提到默認(rèn)的窗口過程函數(shù)DefWindowProc用來處理應(yīng)用程序無法處理的消息,該函數(shù)確保所有消息都要處理,無論這些消息是否對窗口有用。調(diào)用DefWindowProc函數(shù)時,需要傳入與窗口消息處理過程相同的參數(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)的消息機制 7hWndwMsgwParamlParam窗口句柄;指定要發(fā)送的消息;依賴于消息wMsg依賴于消息wMsg的其他信息;的其他信息。返回值函數(shù)返回消息的處理結(jié)果,該取決于消息的類型。2. PostMessage函數(shù)PostMess

20、age函數(shù)同 SendMessage 類似,它把消息放在指定窗口創(chuàng)建的線程的消息隊列中,然后不等消息處理完就返回,而不像 SendMessage 那樣必須等到消息處理完畢才返回。目標(biāo)窗口通過 GetMessage 或 PeekMessage從消息隊列中取出并處理。原型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。示例下面代碼演示了如何通過發(fā)送消息,在PB 應(yīng)用中關(guān)閉另外運行的第三方程序。1)運行 Windows 的系統(tǒng)的記事本程序 NotePad,并創(chuàng)建一個未命名的文檔。2)在 PB 中新建一個窗口,為窗口聲明如下對象級外部函數(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)在窗口上放置一個按鈕控件,為按鈕的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è)計(高級卷)ll_iReturn = PostMessage(ll_iHwnd, WM_QUIT, 0, 0)MessageBox( 提示信息 , 記事本已經(jīng)關(guān)閉!)上述代碼運行后,使用 FindWindow 函數(shù)獲取 Windows 記事本程序窗口的句柄,然后向記事本窗口發(fā)送 WM_QUIT 消息,記事本程序?qū)⒈魂P(guān)閉。1.2事件與消息1.2.1從消息到事件雖然在前面提到 Windows 系統(tǒng)會產(chǎn)生事件來驅(qū)動對象,

24、 但更嚴(yán)格的講 Windows 息,然后由 PB 將其轉(zhuǎn)化為驅(qū)動對象的事件。那么 PB 是如何將消息轉(zhuǎn)換為事件呢?先產(chǎn)生消1.1 節(jié)介紹了消息的概念。也可以通俗地將消息理解為由Windows操作系統(tǒng)送往程序的事件。它是系統(tǒng)中各個控件(窗口)溝通的方式。舉例來說,當(dāng)移動鼠標(biāo)、按下鼠標(biāo)鍵、改變窗口視窗大小時,Windows 都會送出消息以通知程序。當(dāng)然,為了要辨別事件的內(nèi)容,Windows系統(tǒng)中預(yù)定義了許多的消息,如WM_PAINT , WM_CHAR等。當(dāng)事件發(fā)生時, Windows 系統(tǒng)根據(jù)窗口的身份碼句柄hWnd ,判斷該事件必須由哪個窗口接收,然后將事件以消息的方式送往程序的窗口中。雖然在

25、Windows 系統(tǒng)中包含了數(shù)以百計的事件, 但是操作系統(tǒng)并沒有為各個事件設(shè)計不同的消息結(jié)構(gòu),而是以一個一般性的結(jié)構(gòu)來描述消息,Windows 使用了一個特殊的函數(shù)來實現(xiàn)這一過程,這個函數(shù)的名稱叫做“窗口處理函數(shù)”或者叫做“窗口消息處理函數(shù)”,該函數(shù)就是 WindowProc 。LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );從函數(shù)的定義可以看出,任何要發(fā)送的消息都有4 個參數(shù),其中:HWND hwnd發(fā)送窗口的句柄UINT uMsg消息代碼Windows 中每一個消息都有惟一的一

26、個代碼。在 Visual Basic 的 API 文本瀏覽器中以常量的格式列出了所有消息名和代碼,在PB 中也可以直接利用Visual Basic 的 API 文本瀏覽器列出的這些消息,惟一需要做的就是將Visual Basic 十六進(jìn)制消息代碼轉(zhuǎn)換為PB 的十進(jìn)制,如在 Visual Basic 聲明定義的有關(guān)鼠標(biāo)移動的消息:Public Const WM_MOUSEMOVE = &H200在 PB 中應(yīng)聲明為:Constant Long WM_MOUSEMOVE = 512WPARAM wParam 和 LPARAM lParam 為兩個 32 位的長整型值,用來指定當(dāng)前發(fā)送消息時所帶信息

27、,如在鼠標(biāo)移動時返回鼠標(biāo)的位置等。當(dāng) Windows 有消息需要通知程序的時候,它就會調(diào)用該函數(shù),然后自己的程序就從中檢第 1 章Windows系統(tǒng)的消息機制 9測發(fā)送的消息。Windows中消息的種類是很多的,不可能也沒有必要檢測所有的消息,只需要檢測感興趣的消息即可。檢測消息的程序其實就是一個條件判斷組合,如圖1.1 所示。那 么 未 處 理 的 消 息 到 那 里 去 了 ? Windows系 統(tǒng) 為 窗 口 提 供 了 默 認(rèn) 的 窗 口 過 程DefWindowProc,這個窗口過程將負(fù)責(zé)處理那些不需要的消息。正因為有了這個默認(rèn)窗口過程,才可以利用 Windows 的窗口進(jìn)行開發(fā),而

28、不必過多關(guān)注窗口各種消息的處理。例如,窗口在被拖動時會有很多消息發(fā)送,可以不予理睬讓系統(tǒng)自己去處理。接收消息是希望的是處理消息消息?否停止圖 1.1消息處理流程從上面分析可以看出,事件驅(qū)動機制是針對諸如PB、Visual Basic 這類面向?qū)ο蟮拈_發(fā)環(huán)境而言,在其背后隱含的是Windows 系統(tǒng)的消息驅(qū)動機制,但Windows 系統(tǒng)的消息驅(qū)動應(yīng)用范圍要比高級開發(fā)語言定義的事件驅(qū)動范圍廣泛的多。1.2.2PB 事件對消息的封裝在 PB 中,除了為窗口和控件預(yù)置的事件外,PB 還將 Windows 系統(tǒng)的許多消息封裝為用戶自選事件,根據(jù)與 Windows 系統(tǒng)的消息的對應(yīng)關(guān)系,為每個事件定義了E

29、ventID ,如圖 1.2所示。當(dāng)窗口或控件的預(yù)置事件無法滿足程序設(shè)計要求時,可以使用這些自選事件。如在設(shè)備場景中繪制的位圖,當(dāng)窗口大小改變時,位圖并不會自動重繪。這時就需要使用窗口的事件ID號位 pbm_paint 事件,該事件與窗口的WM_PAINT消息相對應(yīng),當(dāng)窗口發(fā)生變化時強迫窗口重繪。在 PB 中,事件 ID 的作用是把PB 的事件與系統(tǒng)消息聯(lián)系起來,被用戶的動作或其他系統(tǒng)活動觸發(fā)的事件必須具有ID 號。對于 PB 的系統(tǒng)對象,如窗口、按鈕等控件,定義好的系統(tǒng)事件通常都使用 ID 號。當(dāng)用戶使用自選事件時,可以使用如圖 1.2 所示列在 Event Declaration 對話框中

30、的事件ID號,用來響應(yīng)某個系統(tǒng)消息。如果定義被系統(tǒng)消息觸發(fā)的用戶自選事件,可以從ID 號列表中選擇事件 ID 號。其中,列在Event 對話框中的所有以pbm_前綴開始的ID 號,為映射到PB中的系統(tǒng)消息。在定義用戶自選事件時,不能修改與事件ID 號相關(guān)的參數(shù)及返回值,因為這些是整個事件 ID 號的具體組成部分。如果與事件ID 號相應(yīng)的系統(tǒng)消息發(fā)生時,PB 觸發(fā)該事件,并為事件的參數(shù)賦值。如果用戶自定義事件,并且與系統(tǒng)消息無關(guān),則不為事件選擇ID號。這樣事件將不會被用戶的動作或系統(tǒng)的活動觸發(fā),只能在應(yīng)用中用腳本來觸發(fā)。 10PowerBuilder Win32 API程序設(shè)計(高級卷)圖 1.

31、2PB 的用戶自選事件由于 PB 的技術(shù)開發(fā)文檔中并未列出每個事件ID 的具體含義及與Windows 系統(tǒng)消息的對應(yīng)關(guān)系,用戶在使用這些自選事件時常常感到困惑。為此,筆者將這些事件與Windows 系統(tǒng)的消息的對應(yīng)關(guān)系及具體含義逐一進(jìn)行了分析,這些 PB 的自選事件ID 涵蓋了窗口消息, 以及按鈕、組合框、列表框、編輯掩碼等控件的消息,下面逐一列在表1-2 1-8 中,供讀者參考。(1) PB 的按鈕自選事件及對應(yīng)的系統(tǒng)消息,如表1-2 所示。(2) PB 的組合框控件(ComBox )自選事件及對應(yīng)的系統(tǒng)消息,如表1-3 所示。表 1-2按鈕事件及對應(yīng)的系統(tǒng)消息PB 的事件 IDpbm_bm

32、getstatepbm_bmsetcheckpbm_bmsetstatepbm_bnclickedpbm_bndisablepbm_bndoubleclickedpbm_bndragdroppbm_bndragenterpbm_bndragleavepbm_bndragoverpbm_bnhilitepbm_bnpaintpbm_bnsetfocuspbm_bnunhilite對應(yīng)的系統(tǒng)消息消息作用BM_GETSTATE按鈕是否加亮BM_SETCHECK設(shè)置按鈕的選中或未選中狀態(tài)BM_SETSTATE加亮或不加亮按鈕BN_CLICKED按鈕控件被單擊BN_DISABLE使按鈕控件無效BN_DO

33、UBLECLICKED按鈕控件被雙擊BN_DRAGDROP一個對象被放到按鈕控件BN_DRAGENTER一個對象被拖到按鈕控件BN_DRAGLEAVE一個對象被拖離按鈕控件BN_DRAGOVER一個對象被拖經(jīng)按鈕控件BN_HILITE按鈕控件被加亮BN_PAINT按鈕控件被繪制BN_SETFOCUS按鈕控件獲得焦點BN_UNHILITE按鈕控件不被加亮第 1 章 Windows 系統(tǒng)的消息機制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組合框事件及對應(yīng)的系統(tǒng)消息對應(yīng)的系統(tǒng)消息消息作用CB_ADDSTRING將字符串加到組合框CB_DELETE

36、STRING從組合框刪除一個字符串CB_DIR加一個目錄列表到組合框CB_FINDSTRING搜索以一組字符開頭的字符串CB_FINDSTRINGEXACT搜索與所提供的字符完全匹配的字符串CB_GETCOUNT列表框中的項數(shù)CB_GETCURSEL當(dāng)前被選項的數(shù)目CB_GETDROPPEDCONTROLSET列表框在屏幕上的坐標(biāo)位置CB_GETEDITSEL編輯器控件中被選字符的范圍CB_GETEXTENDEDUI默認(rèn)或擴展的用戶界面CB_GETITEMDATA重畫的列表框中的4 字節(jié)( 32 位)項CB_GETITEMHEIGHT列表框中某一項的高度CB_GETLBTEXT列表框中的文本C

37、B_GETLBTEXTLEN列表框中文本的長度CB_INSERTSTRING向列表框中插入新的字符串項CB_LIMITTEXT限制能被輸入到列表框中的字符數(shù)CB_RESETCONTENT刪除列表框中所有內(nèi)容CB_SELECTSTRING搜索匹配的字符串并顯示CB_SETCURSEL在列表框中選擇并顯示一項CB_SETEDITSEL在列表框的編輯區(qū)域中選擇一塊文本CB_SETEXTENDEDUI設(shè)置默認(rèn)或擴展的用戶界面CB_SETITEMDATA在列表框中設(shè)定4 字節(jié)( 32 位)項CB_SETITEMHEIGHT設(shè)置列表框中項的高度CB_SHOWDROPDOWN顯示或隱藏列表框中下拉列表區(qū)域C

38、BN_DBLCLK用戶在列表中某一項上雙擊鼠標(biāo)CBN_DRAGDROP一個對象被放到組合框控件上CBN_DRAGENTER一個對象被拖到組合框控件上CBN_DRAGLEAVE一個對象被拖離組合框控件CBN_DRAGOVER一個對象被拖經(jīng)組合框控件CBN_DROPDOWN列表框的下拉區(qū)域即將被顯示CBN_EDITCHANGE編輯器控件中的文本發(fā)生變化CBN_EDITUPDATE列表框編輯器控件中的文本即將被改變CBN_ERRSPACE列表框滿,不能再向其中加入項CBN_KILLFOCUS通用列表框失去焦點CBN_SELCHANGE列表框中被選文本被改變CBN_SELENDCANCEL用戶按下了“

39、取消”按鈕CBN_SELENDOK用戶按下了“確認(rèn)”按鈕CBN_SETFOCUS通用對話控件擁有焦點 12PowerBuilder Win32 API程序設(shè)計(高級卷)( 3)PB 的編輯控件( EditMask )自選事件及對應(yīng)的系統(tǒng)消息,如表1-4 所示。( 4)PB 的列表框控件(ListBox )自選事件及對應(yīng)的系統(tǒng)消息,如表1-5 所示。表 1-4編輯控件事件及對應(yīng)的系統(tǒng)消息PB 的自選事件ID對應(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ū)在多行編輯器控件的行尾增加或刪除回車換行返回編輯器控件中可見的第一行的行號獲得編輯器控件使用的內(nèi)存句柄從編輯器控件中復(fù)制一行

43、到內(nèi)存緩沖區(qū)返回多行編輯器控件的行數(shù)文本是否被用戶修改返回控件的長方形域返回被選文本的起始位置限制用戶鍵入的文本長度返回被選文本的行號返回控件中被選行第一個字符在編輯串中的位置返回編輯器控件中被選行中的字符數(shù)水平或垂直卷滾編輯器控件從剪貼板或從鍵盤上用新文本替換被選文本設(shè)置編輯器控件的句柄設(shè)置編輯器控件的modified 標(biāo)志設(shè)置用戶輸入任何文本時顯示的字符,在輸入密碼時的顯示設(shè)置 / 重置編輯器控件所在的長方形區(qū)域 ,編輯器控件中的文本被重畫除了不重畫文本,大致與setrect 相同選擇字符在多行編輯器控件中設(shè)置tabstops設(shè)置新的詞拆分函數(shù)設(shè)置新的詞拆分過程撤消最近的編輯操作編輯器控件

44、中的文本發(fā)生改變編輯器控件內(nèi)存緩沖區(qū)溢出用戶點中上水平滾動條用戶試圖輸入比允許更多的文本編輯器控件即將顯示用戶的修改用戶點中垂直滾動條第 1 章 Windows 系統(tǒng)的消息機制13表 1-5列表框控件事件及對應(yīng)的系統(tǒng)消息PB 的事件 ID對應(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消息作用向列表框控件中增加一項或一個字符串從列表框中刪除一項或一個字符串用目錄列表填充列表框在列表框中搜索與所給字符串匹配的項在列表框中搜索與所給字符串精確匹配的項在列表框中搜索擁有焦點的項確定列表框中的項數(shù)確定所選項是第幾項獲得列表框的寬度、計算水平卷滾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確定列表框控件中項的高度確定列表框的尺寸獲得列表框中當(dāng)前所選的項在多選列表框中獲得所選項的數(shù)目用列表框中各自的項號填充給定的整數(shù)數(shù)組獲得列表框中當(dāng)前所選項的文本獲得列表框中當(dāng)前所選項的文本中的字符數(shù)確定列表框中可見的最上面一項的項號向列表框中加入一個新字符串重置(消除)列表框中的內(nèi)容搜索并加亮與所給字符匹配的字符串選擇 / 取消列表框中某一范圍中的項設(shè)置列表框中的某一項擁有焦點設(shè)置列表框中

49、列的寬度在列表框中選擇并加亮一項設(shè)置列表框中被水平卷滾的單元數(shù)設(shè)置與列表框相關(guān)的 32 位/4 字節(jié)值設(shè)置列表框中項的高度在列表框中選擇一個字符串設(shè)置列表框控件中tabstops 的位置滾動列表框使特定的項成為可見的最上面項用戶在列表框控件中的某一項上雙擊用戶試圖超越可在列表框中輸入字符的最大限制當(dāng)前選取文本被取消用戶在列表框中選擇或取消了一項(5) PB 的窗口自選事件及對應(yīng)的系統(tǒng)消息,如表1-6 所示。 14PowerBuilder Win32 API程序設(shè)計(高級卷)表 1-6窗口事件及對應(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對應(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消息作用被激活的窗口屬于另外一個應(yīng)用要求剪貼板中的內(nèi)容被復(fù)制到一個使用自定義格式的文本緩沖區(qū)中傳送鍵盤上按下的鍵通過轉(zhuǎn)換鍵盤來的字符,幫助列表框定位其中的項一個子窗口被移動或激活

53、用戶要刪除當(dāng)前編輯器控件中的內(nèi)容用戶選擇了一個菜單項、控件或使用了加速鍵系統(tǒng)內(nèi)存資源不足;當(dāng)Windows 占用了多于1/8的 CPU 時間緊縮內(nèi)存時,產(chǎn)生這條消息當(dāng)新項被加入列表框或組合框時產(chǎn)生此消息,系統(tǒng)用這條消息進(jìn)行項之間的比較一個控件即將被繪制,可在此時改變控件的顏色用戶選擇了一種非英語字符集或其他特殊字符集,這將改變下面將要輸入的字符從列表框或組合框中移去一項剪貼板內(nèi)容被清除WIN.INI中的一個設(shè)備名被修改剪貼板內(nèi)容發(fā)生改變列表框或組合框的一項內(nèi)容被改變當(dāng)鼠標(biāo)左鍵在一個注冊為拖放文件接受器的應(yīng)用上釋放時,發(fā)出該消息窗口的客戶區(qū)需要重畫應(yīng)用可用的字體數(shù)改變通知消息,說明當(dāng)前使用哪種類

54、型的鍵盤獲取當(dāng)前激活的字體檢索窗口可設(shè)置的最小或最大尺寸從一個控件 (如按鈕或編輯器控件 )中復(fù)制文本到一個內(nèi)存緩沖區(qū)用來確定一個控件中的字符數(shù)剪貼板的水平滾動條被使用一個最小化窗口需要重畫背景一個對話框即將被顯示一個菜單即將被顯示一個彈出式窗口即將被顯示鍵盤上的一個鍵被按下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對應(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對應(yīng)的系統(tǒng)消息WM_PALETTECHANGEDWM_PALETTEISCHANGINGWM_PARENTNOTIFYWM_QUERYDRAGICONWM_QUERYENDSESSIONWM_QUERYNEWPALETTEWM_QUERYOPENWM_QUIT系統(tǒng)的消息機制15續(xù)表消息作用鍵盤上的一個鍵被釋放一個 MDI 子窗口(窗口)被激活以重疊的形式重排所有

58、的窗口創(chuàng)建一個窗口從 MDI 框架中移去一個窗口獲得當(dāng)前活動的 MDI 窗口的句柄在一個 MDI 框架中重排最小化窗口的圖標(biāo)最大化一個 MDI 子窗口激活下一個 MDI 子窗口(緊接著活動窗口的窗口)把 MDI 窗口恢復(fù)到它原來的大小將一個菜單與一個 MDI 窗口聯(lián)系起來平鋪所有的MDI 窗口這個消息被送給即將創(chuàng)建的、內(nèi)有按鈕或其他控件的窗口用戶使用了一個快捷鍵 ,但系統(tǒng)不支持該快捷鍵用戶選擇了一個菜單項用戶在一個非活動窗口中單擊了鼠標(biāo)用戶移動了鼠標(biāo)窗口的非客戶區(qū)即將被激活窗口的尺寸需要重新計算窗口即將創(chuàng)建它的非客戶區(qū)窗口的非共享區(qū)被析構(gòu)每次非客戶區(qū)被移動時都發(fā)送該消息用戶在非客戶區(qū)雙擊了鼠標(biāo)

59、非客戶需要畫出在對話框中將焦點轉(zhuǎn)給另一個控件剪貼板應(yīng)用有剪貼操作,剪貼板查看器需重畫窗口的客戶區(qū)需要被畫出消息作用系統(tǒng)調(diào)色板被改變系統(tǒng)調(diào)色板即將被改變通知父窗口一個子窗口即將被創(chuàng)建用戶要拖動一個最小化窗口通知消息,說明窗口即將被關(guān)閉應(yīng)用即將收到輸入焦點, 應(yīng)該執(zhí)行必要的顏色調(diào)整一個最小化窗口即將被恢復(fù)應(yīng)用處理的最后一個消息 16PB 的事件 IDpbm_renderallformatspbm_renderformatspbm_setcursorpbm_setfontpbm_setredrawpbm_settextpbm_sizeclipboardpbm_spoolerstatuspbm_syscharpbm_syscolorchangepbm_syscommandpbm_sysdeadcharpbm_syskeydownpbm_syskeyupp

溫馨提示

  • 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

提交評論