為了得到乙個自適應滾動條,你需要告訴windows滾動條所覆蓋區域的最大值和最小值,當前滾動條的位置以及滾動條滑塊(thumb,也稱」頁大小」)的大小。
乙個比較麻煩的方法,是當顯示區域最大值是可變的情況。這和gdi中的座標計算有點不同:gdi中,一段範圍,是不包含終結點的。這會導致在****現類似」-1″這樣的**,用來對公式做出補償修正。
為了實現這個目標,我們需要額外定義如下的變數:
我稍後會解釋為什麼這裡的變數名叫做g_yorigin。
接下來,我們會定義乙個幫助函式,它將會是滾動條操作的核心。
我們來看看這個函式:它將會接收乙個代表滾動條目標位置的引數,然後函式對這個引數進行有效性校驗,然後對視窗的內容進行必要的滾動,最後,設定滾動條的相關引數來匹配視窗滾動之後的狀態。
有時候,我們僅僅是希望以乙個相對的位置進行滾動,則可以使用下面的函式。
當視窗大小發生變化時,我們需要重新計算」一頁」中可顯示的條目個數。這個計算過程,會要求滾動條的thumb位置進行自動調整,所以,我們這裡在on_size訊息處理例程中執行力一次dummy scroll,這將觸發滾動條自身的自動調整。
wm_vscroll訊息處理例程比較容易理解。當我們按行或者按頁進行滾動時,實際上我們會在乙個指定的方向上做一些對應的滾動。當使用者拖動滾動條滑塊時,我們將滾動到乙個指定的位置。當使用者拖動滾動條的頂部或底部時,我們也會做相對應的計算。
當然,我們還需要將訊息處理例程和訊息進行關聯,如下圖所示:
最後,我們需要讓我們的繪製函式知道滾動條的存在。幸運的是,我們可以借助gdi的轉換,實現這個目的,並且完全不需要改動paint******content函式。
通過修改視窗的原點,我們的paint******content函式還是和沒有滾動條的時候一樣正常工作。借助於gdi的座標轉換,我們可以愉快的在座標點(0,0)上繪製條目,而繪製的畫素將出現在新設定的原點的位置。
所以,你現在應該可以明白,為什麼這裡的變數叫做g_yorigin了吧?
在上面的onvscroll函式中有乙個隱藏的bug。看看可以找到它嗎?然後試試能不能修復一下?
自製乙個滾動條
參考文章 1 html 2 head 3 title 自定義滾動條 title 4 style 5 parent 1112 child 18 box 23style 24head 25 body 26 div id parent 27 div id child div 28div 29 div id...
乙個頁面中實現多個滾動條
原 這裡是table滾動id 標題簡介 作者 1 這是一篇標題很長的文章用來測試 的測試標題 這是一篇標題很長的文章用來測試 不被太多列擠得變形的描述.管理員 1 這是一篇標題很長的文章用來測試 的測試標題 這是一篇標題很長的文章用來測試 不被太多列擠得變形的描述.管理員 test測試test測試t...
vue中調整某一div的滾動條始終觸底
舉乙個比較長見的例子,在聊天框中,每一條訊息都是乙個元件,通過在父元件中根據資料v for迴圈出來該元件,接收到訊息之後也能快速渲染出來,這是很方便的方法。但是要注意的一點是,每次該div裡新增一條新的訊息之後右邊的滾動條應該是立馬觸底的,也就是顯示最新的一條訊息,因為訊息一般都是新增在乙個集合的末...