基本的控件(静态文本+编辑框+按钮+单选+复选+组合框+列表框+滚动条),我们只剩下滚动条控件了。
滚动条控件有些不一样,它不是在WM_COMMAND的消息处理中进行响应的,而是有其独立的消息:
WM_HSCROLL 或 WM_VSCROLL !因此,不要再试图在OnCommand中去实现了~
这个练习非常小,只是用个文本框来显示滚动条所在位置的数字。步骤如下:
1. 声明窗口句柄,在初始化中定义;设定滚动条的取值上下限范围,设定滑块停止的位置!
2. 在WM_HSCROLL消息处理函数中实现a. 进/退1条; b. 进/退1页; 手动滑块移动
HWND hScroll;
hScroll = GetDlgItem(hwnd, IDC_SCROLL);
ScrollBar_SetRange(hScroll, 0, 10, TRUE); //设置上下限范围
ScrollBar_SetPos(hScroll, 0, TRUE); //设置位置
case WM_HSCROLL:
{
int i = ScrollBar_GetPos(hScroll); //先获取位置
SetDlgItemInt(hWnd, IDC_TEXT, i, TRUE);
switch(LOWORD(wParam))
{
case SB_LINEUP: //端点箭头
ScrollBar_SetPos(hScroll, i - 1, TRUE); //设置位置
break;
case SB_LINEDOWN:
ScrollBar_SetPos(hScroll, i + 1, TRUE);
break;
case SB_PAGEUP: //空白处
ScrollBar_SetPos(hScroll, i - 3, TRUE);
break;
case SB_PAGEDOWN:
ScrollBar_SetPos(hScroll, i + 3, TRUE);
break;
case SB_THUMBPOSITION: //拖动滑块位置
int n = HIWORD(wParam);
ScrollBar_SetPos(hScroll, n, TRUE);
break;
}
break;
}
其中,需要注意几点:
1. 垂直滚动条上下与大小是反的;
2. 尽量不要在滚动条中设定负数的范围,会比较麻烦,因为wParam是无符号的,还需要转换;如果不转换那么手动滑块位置的响应就会出现错误了。
这是我们第一次遇到~后面我们还会接触到许多不在WM_COMMAND的消息处理中进行的控件,比如树控件等。