提示:看看原代码会明白下面所说的!
原代码
处理滚动条时的问题:
有了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消息处