最近在使用公司介面庫中發現乙個問題,就是下拉框獲得焦點以後父視窗無法收到wm_mousewheel訊息,即使主動設定父視窗焦點問題依然存在。一開始懷疑是焦點不再父視窗上導致的問題,然後我就在視窗類的訊息處理中加上日誌記錄wm_setfocus和wm_killfocus獲取和失去焦點的視窗。
執行後的結果是,即使手動設定父視窗的焦點,父視窗確實收到了wm_setfocus訊息,但是緊接著子視窗也收到wm_setfocus,父視窗收到wm_killfocus訊息。排除各種可能性以後,確信這是windows父子視窗的一種機制,焦點在父子視窗間一定存在著某種必然的聯絡,就是父視窗的某個子視窗會強制奪取父視窗的焦點。
那麼既然這樣,這就是導致父視窗無法收到wm_mousewheel訊息的根本原因嗎?繼續**,我在父視窗中加入乙個介面庫之外的普通wtl視窗,發現焦點在這個視窗的時候,不會導致父視窗收不到wm_mousewheel訊息。那麼這就排除了子視窗奪取焦點導致父視窗收不到wm_mousewheel的因素,所以問題還是出在介面庫對wm_mousewheel的處理上。
所以再仔細檢視介面庫相關**,找到了問題的根本原因。
介面庫在視窗處理wm_mousewheel訊息後直接返回了,沒有交由底層api繼續處理該訊息,導致子視窗收到wm_mousewheel後,沒有被繼續分發給父視窗。解決方法也很簡單,在子視窗處理wm_mousewheel訊息的時候,按需求決定是否繼續由底層處理,比如子視窗在自己被隱藏的時候,bhanded設為false,繼續交給父視窗處理就行了。
控制項失去焦點與獲得焦點
1.失去焦點 讓控制項失去焦點的方法,就是給該控制項傳送乙個wm killfocus的訊息。可以通過下面三種方式實現 1使用cwnd類的postmessage getdlgitem 控制項id號 postmessage wm killfocus,0,0 2獲取控制項的控制代碼,然後通過控制代碼直接給...
焦點透視與成角透視
我們之前說過透視現象有三種,按消失點的個數依次為焦點透視 成角透視和三點透視。那麼出現這三種透視現象是有條件的,前提條件是只有平視的情況下才會出現焦點透視和成角透視,同樣的,僅有非平視的時候才會出現三點透視。那麼,我們怎麼去理解這2個概念呢?圖九,通過三張立面示意圖可以看到。平視即視平線與水平面重疊...
EditText獲取焦點和失去焦點
在android開發中,關於edittext自動獲取焦點彈出鍵盤,我們可能又是會有讓鍵盤自動彈出的需求,有時可能又會有不想讓鍵盤自動彈出的需求 需求 edittext自動獲取焦點並彈出鍵盤,edittext.setfocusable true edittext.setfocusableintouch...