Клоном линейки прокрутки является ползунок (trackbar или slider). Небольшим отличием трекбара от линейки прокрутки является то, что у ползунка есть шкала, вдоль которой он движется. Честно говоря, мне очень не нравится переводить на русский слова, к которым я уже привык и которые обычно используются в качестве программистского сленга. Поэтому давайте будем в данном случае под словом «трекбар» понимать весь элемент управления, а под словом «слайдер» - указатель, движущийся вдоль шкалы.
К сожалению, для создания трекбара не предусмотрено специальной функции, поэтому создавать его необходимо посредством вызова функции CreateWindowO или CreateWindowEx(). При этом в качестве имени класса следует указать макрос TRACKBAR_CLASS, который описан в commctrl.h.
При создании трекбара могут использоваться стили окна, идентификаторы которых начинаются с TBS_ (TBS_HORZ, TBS_VERT, TBS_BOTTOM и т.д.).
Управление трекбаром осуществляется посредством сообщений, начинающихся с TBM_ (TBM_SETPOS, TBM_SETRANGEMIN, TBM_SETRANGEMAX и т.д.)
При манипуляциях с трекбаром последний посылает родительскому окну сообщения WM_HSCROLL. В младшем слове wParam содержится код нотификации, который определяет характер действия, произведенного с трекбаром. Старшее слово wParam содержит позицию слайдера в момент возникновения сообщения. Дескриптор окна трекбара записывается в lParam.
Теперь, изучив теоретически работу трекбара, мы можем рассмотреть программу, в которой демонстрируются возможности этого элемента управления.
#include <windows.h>
#include <commctrl.h>
#include "trackbar.h"
HINSTANCE hInst;
LRESULT CALLBACK TrackbarWndProc(HWND, UINT, UINT, LONG);
BOOL CALLBACK TrackbarDialogProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hlnstance, H INSTANCE hPrevInstance, LPSTR IpszCmdParam, int nCmdShow)
{ HWND hWnd;
WNDCLASS WndClass;
MSG Msg;
char szClassNamef] = "TrackbarDemo";
hlnst = hlnstance;
/* Registering our window class */
/* Fill WNDCLASS structure */
WndClass.style = CS_HREDRAW | CSVREDRAW;
WndClass.lprhWndProc = TrackbarWndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hlnstance = hlnstancc;
WndClass.Wcon = Loadlcon (NULL.IDLAPPLICATION);
WndClass.hCursor = LoadCursor (NULC IDC_ARROW);
WndClass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
WndClass.lpszMenuName = "TrackbarMenu";
WndClass.lpszClassName = szClassName;
if(!RegisterClass(&WndClass))
{
MessageBox(NULL,"Cannot register cIassn,wError"tMB_OK);
return 0;
}
hWnd = CreateWindow(szClassName, "Trackbar Demo Program",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance,NULL);
if(!hWnd)
{
MessageBox(NULL,"Cannot create window”,"Error",MB_OK);
return 0;
}
InitCommonControls();
/* Show our window */
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
/* Beginning of messages cycle */
while(GetMessage(&Msg, NULL, 0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
LRESULT CALLBACK TrackbarWndProc (HWND hWnd, UINT Message,
UrNT wParam, LONG IParam)
{
switch(Message)
{
case WM_COMMAND:
switch(wParara)
{
case IDM_Exil:
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
case IDMDialog:
DialogBox(hlnst, "TrackbarDialog", hWnd, TrackbarDtalogProc);
break;
} return 0;
case WM_DESTROY:
PostQuitMessage(O);
return 0;
}
return DefWindowProcChWnd.MessagcwParam, IParam);
}
BOOL CALLBACK TrackbarDialogProc(HWND hDIg, UINT Message, WPARAM wParam, LP ARAM IParam)
{
static HWND hEditWnd;
static HWND hSpinWnd;
static HWND hTrackbarWnd;
switch(Message)
{
case WM_INITDIALOG:
liEditWnd = GetDlgltemfliDIg, ID_Edit);
hTrackbarWnd = GetD!gItem(hDlg, IDJTrackbar);
hSpinWnd = CreateUpDownConfrol(WS_CHILD j WSJBORDER | WS_VISIBLE | UDS_SETBUDDYINT | UDS_ALIGNRIGHT, 0,12,50,50, hDlg, IDSpin, hlnst, hEditWnd, 10,0,5);
hTrackbarWnd = CreateWindow(TRACKBAR_CLASS,"Trackbar Demo", WS_CHILD | WS_VISIBLE | WS_TABSTOP | TBS_AUTOTICKS, 4,75" 142,40, hDlg, NULL, hInst, NULL);
SendMessage(hTrackbarWnd, TBM_SETRANGE, TRUE, MAKELONG(0,L0)); SendMessage(hTrackbarWnd, TBM_SETPOS, TRUE, 5);
return TRUE;
case WM_VSCROLL:
SendMessage(hTrackbarWnd, TBM_SETPOS, TRUE, GetDlgItemInt(hDlg, IDEdit, NULL, i));
return TRUE;
case WM_HSCROLL:
SetDlgltemlnUhDIg, ID_Edit, SendMcssage(hTrackbarWnd, TBM_GETPOS, 0,0), TRUE);
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID OK:
EndDialog(hDlg,0);
return TRUE;
}
break;
}
return FALSE;
}
Рис. 14. Диалоговое окно со спином и трекбаром
Попробуйте изменить положение спина. При этом изменится положение слайдера на трекбаре. Аналогично, если изменить положение слайдера с иомошью мыши, то изменится значение в окне редактирования, которое является приятельским окном спина.