Member 10852608 Ответов: 1

[C++ ] WIN32API trackbar вопрос


Привет
Как получить текущее положение Трекбара и как вызвать функцию при увеличении или уменьшении позиции ?
спасибо

Что я уже пробовал:

switch (HIWORD(wParam))

			{
			case WM_HSCROLL:
			{
				HWND hTrackbar = GetDlgItem(hWnd, TrackBar);

				if (hTrackbar == (HWND)lParam)
				{
					int newPos = SendMessage(hTrackbar, TBM_GETPOS, 0, 0);
					int selStart = SendMessage(hTrackbar, TBM_GETSELSTART, 0, 0);
					int selEnd = SendMessage(hTrackbar, TBM_GETSELEND, 0, 0);

					if (newPos > selEnd)
					{
						
						SendMessage(hTrackbar, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)selEnd);
					}

					else if (newPos < selStart)
					{
						
						SendMessage(hTrackbar, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)selStart);
					}
				}

				break;
			}
			}

1 Ответов

Рейтинг:
7

Jochen Arndt

Внутри обработчика проверьте нижнее слово WPARAM. Он содержит код уведомления (например, TB_LINEDOWN на шаг вправо и TB_LINEUP для шага влево с горизонтальными полосами при использовании клавиатуры). При использовании мыши, TB_THUMBTRACK отправить во время движения с нажатой левую кнопку мыши и TB_THUMBPOSITION отправляется при отпускании кнопки мыши. Видеть О Элементах Управления Trackbar (Windows)[^].

Вы уже знаете, как получить текущую позицию: отправив TBM_GETPOS сообщение.

Однако с помощью TB_THUMBTRACK и TB_THUMBPOSITION уведомления позиция посылается в высоком слове WPARAM. Видеть WM_HSCROLL (Trackbar) код уведомления (Windows)[^].

Это не будет работать так, как ожидалось:

switch (HIWORD(wParam))
{
    case WM_HSCROLL:
// ...
Как было объяснено выше, высокое слово - это позиция с треком и событиями позиции (и ноль со всеми другими событиями прокрутки полосы трека). Оператор switch должен использовать вместо этого код сообщения.