1.滚动条的产生
创建窗口时,在窗口风格标识符包括 WS_VSCROLL 或者 WS_HSCROLL, 就会出现滚动条。
hwnd = CreateWindow (szAppName, TEXT ("标题"),
WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
WS_VSCROLL 垂直滚动条
WS_HSCROLL 水平滚动条
2.滚动条消息
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_VSCROLL | WS_HSCROLL
WPARAM wParam, // request and position
LPARAM lParam // handle to scroll bar (HWND)
);
wParam low-order 保存用户行为
high-order 保存当前的位置,如果低阶的行为不是
SB_THUMBPOSITION or SB_THUMBTRACK,那么就不用理会
WM_VSCROLL 垂直滚动条消息
switch(LOWORD(wParam))
{
case SB_BOTTOM: //滚到底
case SB_LINEUP: //向上滚动一行
case SB_LINEDOWN: //向下滚动一行
case SB_PAGEUP: //向上滚动一页
case SB_PAGEDOWN: //向下滚动一页
case SB_THUMBTRACK: //拖动滚动条
case SB_TOP: //滚到顶
}
WS_HSCROLL 水平滚动条消息
switch(LOWORD(wParam))
{
case SB_ENDSCROLL: //滚动结束
case SB_LINELEFT: //向左滚动一行
case SB_LINERIGHT: //向右滚动一行
case SB_PAGELEFT: //向左滚动一页
case SB_PAGERIGHT: //向右滚动一页
case SB_THUMBPOSITION: //拖动滚动条
}
3.滚动条API
//结构体参数
typedef struct tagSCROLLINFO {
UINT cbSize; //设为 sizeof(SCROLLINFO)
UINT fMask; //要设置或者获取的值
int nMin; //范围最小值
int nMax; //范围最大值
UINT nPage; //页面大小
int nPos; //当前位置
int nTrackPos; //当前追随位置
} SCROLLINFO, *LPSCROLLINFO;
typedef SCROLLINFO CONST *LPCSCROLLINFO;
fMask
SIF_ALL 包括SIF_PAGE, SIF_POS, SIF_RANGE, and SIF_TRACKPOS.
SIF_PAGE 可用于指定或获取页面大小
SIF_POS 可用于指定或获取滑块条当前位置
SIF_RANGE 可用于指定或获取滑块条min 跟 max 范围
SIF_TRACKPOS 在SetScrollInfo 中被忽略
//SetScrollInfo 可以设置滚动条的
包括最小和最大滚动位置,
页面大小,
滚动条的位置
int SetScrollInfo(
HWND hwnd, // 窗口句柄
int fnBar, // SB_HORZ 或 SB_VERT
LPCSCROLLINFO lpsi, // 结构体
BOOL fRedraw // 是否重绘
);
//调用例子
//设置垂直滑块条范围跟滑块条大小
SCROLLINFO si ;
si.cbSize = sizeof(si); //结构体大小,微软用来判断API版本,因为有的时候版本参数不一样
si.fMask = SIF_PAGE | SIF_RANGE; //操作行为 设置页面 跟 范围
si.nMin = 0; //最小范围
si.nMax = 100; //最大范围
si.nPage = 50; //页面大小
SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
//设置垂直滑块条位置
SCROLLINFO si ;
si.cbSize = sizeof(si);
si.fMask = SIF_POS; //操作行为 设置滑块条位置
si.nPos = 100; //位置
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
//GetScrollInfo 可以获取滚动条的
包括最小和最大滚动位置,
页面大小,
滚动条的位置
BOOL GetScrollInfo( HWND hwnd, // 窗口句柄
int fnBar, // SB_HORZ 或 SB_VERT
LPSCROLLINFO lpsi // 结构体
);
//调用例子
//获取滑块条所有信息
SCROLLINFO si ;
si.cbSize = sizeof(si);
si.fMask = SIF_ALL; //获取滑块条所有信息
GetScrollInfo(hwnd, SB_VERT, &si);
//滚动窗口
BOOL ScrollWindow( HWND hWnd, // 窗口句柄
int XAmount, // 滚动x位置
int YAmount, // 滚动y位置
CONST RECT *lpRect, // 指定滚动区域,为NULL客户区整体滚动
CONST RECT *lpClipRect // clipping rectangle
);