簡體   English   中英

Win32中的WM_NOTIFY和超類鏈接問題

[英]WM_NOTIFY and superclass chaining issue in Win32

僅供參考我使用中介紹的窗口超類方法這個文章。 如果我想從超類中的基本控件處理WM_NOTIFY消息(即自定義繪圖),則需要從父窗口反射它們或將我自己的窗口設置為父窗口(在CREATESTRUCT內傳遞WM_(NC)CREATE到基類)。 如果我有一個超類,這種方法可以正常工作。 如果我超類我的超類,那么我遇到了一個問題。 現在3個WindowProcs在同一個HWND中運行,當我反映WM_NOTIFY消息(或者讓它們從上面的父技巧發送給我自己)時,它們總是轉到最外層(最派生的)WindowProc。 我無法判斷它們是否是針對內部超類的消息(基本消息應該轉到第一個超類)或者是用於外部超類的消息(來自內部超類的消息是針對外部超類的)。 這些消息無法區分,因為它們都來自具有相同控制ID的相同HWND。 有沒有辦法解決這個問題,而無需創建一個新窗口來封裝每個級別的繼承?

抱歉,文字牆。 這是一個難以解釋的概念。 這是一張圖。

單個超類:

SuperA::WindowProc() -> Base::WindowProc()---\
             ^--------WM_NOTIFY(Base)--------/

超類的超類:

SuperB::WindowProc() -> SuperA::WindowProc() -> Base::WindowProc()---\
             ^--------WM_NOTIFY(Base)--------+-----------------------/
             ^--------WM_NOTIFY(A)-----------/

第二種情況下的WM_NOTIFY消息都來自相同的HWND和控制ID,因此我無法區分用於SuperA(來自Base)的消息和用於SuperB(來自SuperA)的消息。 有任何想法嗎?

當然,控件(原始?)正在向PARENT發送消息。 據推測,您正在攔截這些並將它們發布回原始控件。 外層當然會先看到這些(然后如果它不想處理它們就可以傳遞它們)。

您還沒有說過要攔截哪種NOTIFY消息或為什么。 但是,既然您現在可以在父proc中控制它們以將它們重新發送,為什么不只是更改消息。 滾動您自己的NMHDR結構,嵌入消息和數據,並為超類的級別添加一些標識。 在你的超類中,剝去你想要的那些,重新格式化你不需要的那些,然后發送它們。

聽起來有點混亂。 在那個級別,我傾向於回到基礎並建立我自己的共同控制(當然,取決於你實際上想要做什么)。

Borland通過更改父級別的消息ID來解決這個問題。 當父窗口收到WM_NOTIFY消息時,消息ID將按定義的偏移(CN_BASE)遞增,然后消息將直接傳遞到消息指定的子窗口。 然后子窗口過程(以及子窗口的任何子類)可以查找(CN_BASE + WM_NOTIFY)消息並訪問原始WM_NOTIFY數據。 同樣的技術也適用於WM_COMMAND消息。 嘗試在代碼中執行類似的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM