RingSDK技術文檔:如何實現ListView列的隱藏

想實現ListView在詳細資料視圖下列的隱藏,網上搜了一下實現方法,發現不外乎兩種方法,一種是刪除列,這是真正的隱藏,但是得記錄刪除的每一個單元格的內容,以備該列再次需要顯示時把內容回填。相當於把ListView原來記錄的東西自己保存了,隱藏的列越多,要記錄的東西越多。而如果用戶要修改已隱藏的單元格的內容,這就麻煩了。因爲既然說“隱藏”,你就得允許修改已隱藏的內容,而實際上刪除了,就得自己提供修改機制。不想這麼麻煩。

 

於是看第二種方法:把列寬設爲0,這樣看上去是隱藏了,也沒有修改單元格內容的麻煩,但是用戶拖動列頭,是可以把隱藏的列內容顯示出來的,這就露餡了。可以子類化其Header控件,在鼠標消息中通過發送HDM_HITTEST消息查詢鼠標位置,發現是在列的分隔線位置且該位置左右有隱藏的列就截取不處理,這樣用戶就無法改變隱藏列的寬度,把隱藏的列內容顯示出來。但是這樣又帶來一個問題,由於無法改變隱藏列的寬度,因此也無法改變隱藏列右邊列的寬度,表現爲如果鼠標是按在隱藏列右邊的分隔線,是無法拖動調整隱藏列右邊列的寬度的。

 

兩種方法都不完美,最完美的方法是完全自繪,自己畫列頭,自己處理列頭的拖動,但是這又太麻煩了,有沒有簡單一點的處理方法呢?

 

下面介紹的就是RingSDK界面庫採用的方法,是結合了上面提到的兩種方法。隱藏採用把列寬設爲0的方法,但是需要移一下位置,就是通過發送HDM_SETITEM消息把隱藏的列移動到最前面去,因爲最前面的列分隔線是無法拖動的,也不會有人去拖,因此把隱藏列放在那裏是最安全的,保險起見,截取鼠標消息處理一下,使無法拖動最左邊的分隔線。這樣唯一的破綻就是移到最左邊的分隔線,鼠標形狀會變,但是一樣無法拖動,這應該是可以接受的。接下來就是處理隱藏列的再次顯示,需要恢復寬度並且移動到原位置,因此需要記錄列的寬度和原來的位置序號,可以使用兩個WORD值,合成一個DWORD值就可以了,不需要分配內存,通過HDM_SETITEM消息把這個值跟相應列綁定就行了。

 

這樣就是一個近乎完美的解決方法,不過可能還有一個缺陷就是:隱藏列後用戶把沒隱藏的列拖來拖去改變排列順序,最後顯示隱藏列時回到的位置可能不一定正確,但是我測試的時候拖來拖去把我自己都拖糊塗了,不知道最後隱藏列顯示出來應該在什麼位置是正確的,看起來好象都正確:-),就沒管這個事情了。

 

真正實現代碼的時候當然沒有上面說的那麼簡單,有很多細節需要考慮,大家可以看源代碼,libsrc/ringheader.cpp。

有關RingSDK界面庫,請訪問以下地址:
http://blog.csdn.net/ringphone/archive/2008/09/11/2911244.aspx
http://topic.csdn.net/u/20080911/16/db5a5642-087a-4c31-a9dd-32ebc9862475.html
http://topic.csdn.net/u/20080911/09/e79a9555-9a77-4fc2-bfba-d78f8bc0fcff.html

 

下載地址:
http://download.csdn.net/source/619588

 

幫助文檔下載地址:
http://download.csdn.net/source/789229

 

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