MaxLevs
@MaxLevs

Можно ли в WinApi использовать slider control для получения целочисленного значения в заданном диапазоне?

Доброго времени суток. Подскажите по сабж, пожалуйста.
Пишу курсач. Препод затребовал графику на winapi (хотя предмет про структуры данных :thinking:). Собственно, она и стала камнем преткновения...

В одном из действий требуется узнать у пользователя число. Решил делать это через диалоговое окно. (которое было создано как ресурс в Visual Studio) Выглядит так
5a182738f37a1486884371.png
Мне такой вариант нравится больше всего. Предполагается, что пользователь может выбирать целые числа в диапазоне от 1 до некого MAX >= 1. И ему предлагается сделать это путем перетаскивания ползунка.
Вот только как ни пытался я получить в функции диалогового окна значение положения ползунка, или задать границы его значений, или установить шаг в 1 - ничего не выходит...

Вот одни из нерабочих вариантов реализации
Кодяра
LRESULT CALLBACK AskNumber(
	HWND hDlg,
	UINT Msg,
	WPARAM wParam,
	LPARAM lParam
) {
	HWND slinerBar = GetDlgItem(hDlg, IDC_NUMBER),
		 indicator = GetDlgItem(hDlg, IDC_CHOICE),
		 maxLabel  = GetDlgItem(hDlg, IDC_MAX);

	switch (Msg)
	{
	case WM_INITDIALOG:
		// - Получить максимальное значение (MAX)
		// - Отобразить MAX в текстовом lable
		// - Изменить диапазон ползунка = [1;MAX]
		// - Изменить шаг = 1 ползунка
		// - Отобразить текущее значение ползунка в текстовом поле
		return static_cast<LRESULT>(true);

	case WM_HSCROLL:
		//Перехватывать изменения ползунка
		if (lParam == SB_THUMBPOSITION || lParam == SB_THUMBTRACK) {///????????????????????? Почему не работает??
			nubm = HIWORD(wParam);
			MessageBox(hWnd, L"Значение получено", L"ОМАГАД", MB_OK);  //Не выводится
			// - записать numb в текстовое поле 
		}
		break;

	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case ID_DO_TERN:
			// Записываем выбранное значение в статическую переменную
			EndDialog(hDlg, LOWORD(wParam));
			return static_cast<LRESULT>(true);
			break;
		
		case IDC_NUMBER:
			MessageBox(hWnd, L"Что-то зашевелилось...", L"ОМАГАД", MB_OK); //Не выводится
		}
		break;
	}
	return static_cast<LRESULT>(false);
}



Гуглежка тоже ничего не дала...

Подскажите, можно ли использовать этот ползунок для таких нужд? Или, может, я просто пытаюсь забить гвоздь микроскопом?
  • Вопрос задан
  • 1126 просмотров
Решения вопроса 1
MaxLevs
@MaxLevs Автор вопроса
Вопрос снят. Все-таки смог найти решение. (сложно как-то мне в документации искать: не то все время получаю)

Для начала нужно подключить вот этот файл для получения кодов сообщений для слайдера
#include <Commctrl.h>

Диалог вызывается так
DialogBox(
	hInst,
	MAKEINTRESOURCE(IDD_USER_TERN),
	hWnd, 
	(DLGPROC)(AskNumber)
);


Затем сама процедура обработки диалога
AskNumber
LRESULT CALLBACK AskNumber(
	HWND hDlg,
	UINT Msg,
	WPARAM wParam,
	LPARAM lParam
) {
	
	HWND sliderBar = GetDlgItem(hDlg, IDC_NUMBER));
	switch (Msg)
	{
	case WM_INITDIALOG:
		SendMessage(sliderBar, TBM_SETRANGEMIN	, false, 1);   //минимум
		SendMessage(sliderBar, TBM_SETRANGEMAX, false, 10); //максимум
		SendMessage(sliderBar, TBM_SETTICFREQ	, false, 1);   //шаг
		return static_cast<LRESULT>(true);

	case WM_HSCROLL:
	{
		if (sliderBar == (HWND)lParam) //если речь идет о нашел слайдере
		{
			int curNumb = SendMessage(sliderBar, TBM_GETPOS, 0, 0); // Получаем текущее положение слайдера
			/* Делаем с ним, что хотим */
		}

		break;
	}

	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case ID_DO_TERN:
			int curNumb= SendMessage(sliderBar, TBM_GETPOS, 0, 0);
			wchar_t buff[100];
			wsprintfW(buff, L"%d", curNumb); // Преобразуем число к строке
			MessageBox(hWnd, buff, L"Число!", MB_OK); // Выводим выбранное значение
			EndDialog(hDlg, LOWORD(wParam));
			return static_cast<LRESULT>(true);
			break;
		}
		break;
	return static_cast<LRESULT>(false);
}



Единственная моя проблема - навигация по документации...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы