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