前面的窗口滚动条只能出现在父窗口的固定地方,而滚动条控件能出现在父窗口的任何地方。
创建窗口滚动条控件:使用预定义的滚动条类(scrollbar),和两种滚动条样式SBS_VERT和SBS_HORZ。
例如:
case WM_CREATE:
hWndScroll = CreateWindow(L"scrollbar", L"", WS_CHILD | WS_VISIBLE | SBS_VERT, 100, 100, 50, 200, hwnd, nullptr, hInst, 0);
return 0;
这个滚动条的大小由50 200控制,出现的位置由100 100控制.
滚动条控件的尺寸不是固定的,而是可以任意的
如图:
滚动条控件不发送WM_COMMAND消息,而直接发送WM_VSCROLL和WM_HSCROLL消息,而区分窗口滚动条和滚动条控件 的参数是lParam,如果lParam==0就是窗口滚动条,如果等于滚动条窗口句柄就是滚动条控件
例如:
case WM_VSCROLL:
if (lParam == 0)
MessageBox(nullptr,L"滑动了窗口滚动条",L"",0);
else
MessageBox(nullptr, L"滑动了滚动条控件", L"", 0);
break;
如图:
若想创建和窗口滚动条一样的尺寸,可以用如下两个函数获取滚动条大小
//获取水平滚动条的高度
GetSystemMetrics(SM_CYHSCROLL);
//获取垂直滚动条的宽度
GetSystemMetrics(SM_CXVSCROLL);
例如:
case WM_CREATE:
hWndScroll = CreateWindow(L"scrollbar", L"", WS_CHILD | WS_VISIBLE | SBS_VERT, 100, 100
, GetSystemMetrics(SM_CXVSCROLL), 200, hwnd, (HMENU)1, hInst, 0);
return 0;
可以用与窗口滚动条同样的函数来设置滚动条控件的范围和位置,区别是SB_VERT、SB_HORZ改为SB_CTL
例如:
case WM_CREATE:
hWndScroll = CreateWindow(L"scrollbar", L"", WS_CHILD|WS_VISIBLE|SBS_VERT,100,100,GetSystemMetrics(SM_CXVSCROLL), 200, hwnd, (HMENU)1, hInst, 0);
//设置范围
SetScrollRange(hWndScroll, SB_CTL, 0, 200, TRUE);
//设置滑块初始位置
SetScrollPos(hWndScroll, SB_CTL, ipos, TRUE);
break;
case WM_VSCROLL:
switch (LOWORD(wParam))
{
case SB_LINEUP:
ipos -= 1;
break;
case SB_LINEDOWN:
ipos += 1;
break;
//case SB_THUMBPOSITION:
case SB_THUMBTRACK:
ipos = HIWORD(wParam);
default:
break;
}
SetScrollPos(hWndScroll, SB_CTL, ipos, TRUE);
break;
控件的句柄一定要是静态或者全局变量,否则以创建窗口后控件句柄就又被初始化了。