一篇文章學(xué)會用戶自定義消息及層次劃分
有些人對術(shù)語 WM_USER 表示消息范圍基的名稱有不同的意見,因為 WM_USER 是由窗口類的實現(xiàn)者來定義的。他們抱怨的是,用戶不能使用它們,因為它們屬于窗口類定義的一部分。
但是,問題是,”這里的用戶是誰?” 換句話說,當(dāng)我們說”用戶自定義”這個詞的時候,做自定義操作的這個用戶到底是指誰?
在上面這個問題中,總共有四個不同的組件涉及其中,每個組件都有它自己的消息范圍。
>窗口管理器處理 WM_USER 之下的消息。
> 窗口類的實現(xiàn)者處理 WM_USER 到 WM_APP – 1 之間的消息。
> 應(yīng)用程序(具體來說,就是創(chuàng)建窗口的代碼)處理 WM_APP 到 MAXINTATOM – 1 之間的消息。
> 所有其他組件通過 RegisterWindowMessage 處理 MAXINTATOM 到 MAXWORD 之間的消息。
用戶是誰?這取決于你是站在哪個角度來如何理解這個問題的。
從窗口管理器的角度來看,窗口類的實現(xiàn)者是用戶,因為窗口類的代碼會調(diào)用窗口管理器。
從窗口類的實現(xiàn)者的角度來看,應(yīng)用程序是用戶,因為它調(diào)用了窗口類。
那如果從應(yīng)用程序的角度來看,所有的外部代碼就是用戶了,因為外部代碼會調(diào)用應(yīng)用程序。
相反,你可以“向上”查找列表,并觀察到從每個組件的角度來看,屬于其上方組件的消息是“保留”的。
從類實現(xiàn)者的角度來看,窗口管理器消息是保留的。從應(yīng)用程序的角度來看,類實現(xiàn)者的消息是保留的。從所有外部程序的角度來看,應(yīng)用程序的消息是保留的。讓我們來看看下圖,幫助理解。
每個框?qū)儆谄鋬?nèi)框的消息視為保留;相反,每個內(nèi)框?qū)⑾乱粋€外框視為其“用戶”。
由于 winuser.h 頭文件是由窗口管理器團隊編寫的,因此他們從窗口管理器的角度看世界也就不足為奇了。因此,窗口管理器外部的所有內(nèi)容都是“用戶定義的”,窗口管理器內(nèi)部的所有內(nèi)容都是“保留的”。
當(dāng)然,如果從類實現(xiàn)者的角度來看,那么“保留”和“用戶”這兩個詞的上下文就會發(fā)生變化。例如,你可以在對話框常量 DWLP_USER 中看到這一點,該常量是對話框的“用戶”可以使用的窗口字節(jié)的索引;即,通過應(yīng)用程序的對話過程。
總結(jié)
簡化一個復(fù)雜的問題,可以通過劃分層次的思路來將其分成一個一個的小問題。人生也是如此。