在VC裏實現長按鍵時,解決窗口不更新的問題

在修改一個老程序時,發現有這樣一個問題,當按下一次向下或向上方向鍵時窗口裏的數據可以向上或向下滾動一條,也會立即更新到窗口裏顯示。但是,當長按,不彈起按鍵時,就會發現數據有滾動,但窗口不更新的現象。這種現象就會給客戶一種假死的感覺,體驗非常不好。爲了解決這個問題,仔細地看了一下VC裏MFC的消息體系。

爲什麼一次按下再彈起就可以更新窗口呢?因爲這裏使用InvalidateRect函數,通知窗口有區域無效了,也就是作了一個標記,但這是Windows並不會立即更新窗口裏的數據,等到彈起按鍵,沒有操作時纔會處理無效的消息。因此,按一下按鍵再彈起時,可以更新窗口裏的內容,因爲窗口後面沒有其它消息處理了,可以處理無效消息。

但是當用戶長按時,這時系統源源不斷地產生按下按鍵的消息,這時雖然調用InvalidateRect函數,通知系統這個窗口無效,需要更新了,但是因爲有不斷的按鍵消息產生,導致系統並不去更新窗口,因此窗口裏的數據並不會更新,但程序裏計數已經在更新,這樣就導致程序內部數據與窗口顯示的數據不一樣。

通過上面的分析,就明白了按一次和長按的差別。要解決這個問題,必須在InvalidateRect函數調用之後,再調用UpdateWindow函數,這樣纔可立即更新窗口,也即是讓窗口重新繪製一次,這樣處理之後就會發現窗口裏更新的數據,與程序內部的數據保持一致。

到此,就可以完美地解決這個問題。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章