Элемент «Слайдер» (Румянцев - Азбука программирования в Win32 API, c.148)

Клоном линейки прокрутки является ползунок (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. Диалоговое окно со спином и трекбаром

Попробуйте изменить положение спина. При этом изменится положе­ние слайдера на трекбаре. Аналогично, если изменить положение слайде­ра с иомошью мыши, то изменится значение в окне редактирования, которое является приятельским окном спина.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: