提示:看看原代碼會明白下面所說的!
原代碼
處理捲軸時的問題:
有了WS_VSCROLL後會出現捲軸,但是無法滾動,還沒有鍵盤介面,也沒有初始化滾動塊的大小等等
我們要做的事情是:
1.要處理滾動訊息
2.移動滾動塊到滑鼠指定的位置
3.並更新客戶區的內容
滾動訊息:
WM_VSCROLL
nScrollCode = (int) LOWORD(wParam); // scroll bar value
nPos = (short int) HIWORD(wParam); // scroll box position
hwndScrollBar = (HWND) lParam; // handle to scroll bar
他告訴我們,使用者對捲軸的行為(nScrollCode)和滾動塊的位置(nPos)以及捲軸的控制代碼
Mesage Cracker
void SysMets_OnVScroll(HWND hwnd, HWND hwndCtl, UINT code, int pos)
{
}
滾動nScrollCode:
SB_LINEUP 點擊向上小箭頭
SB_PAGEDOWN 點擊滾動塊下面空白地區
SB_THUMBTRACK 移動滾動塊
如何同步更新客戶區的內容:
1.在處理滾動時要同時更新客戶區的內容要產生WM_PAINT訊息
InvalidateRect,ScrollWindow,RedraweWindow三者選一
2.考慮進滾動塊的位置來定位客戶區內容的顯示位置
奇妙滾動的原理:
滾動時,要求客戶區要重新繪製,當下滾動時,客戶區向上滾動,定量是什麼意思呢?
當捲軸位置為0時,顯示第0行 座標(0,0) 第1行座標(0,1)
當捲軸位置向下移動一個單位時,顯示第0行座標(0,-1)---也就是看不見了,第1行座標(0,0)--奇妙的向上
滾動了
所以為了要從基於0開始,就要在原來的座標上減去滾動塊的位置值
i-iVscrollPos
新捲軸函數
SetScrollInfo
GetScrollInfo
hwnd是有捲軸的父視窗,不是捲軸的hwnd
fMask表示你要取Scroll的什麼資訊
捲軸最好的初始化的地方是WM_SIZE訊息處