Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2022, 13:01   #1
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию Числовые значения в "edit".

Здравствуйте! Хотелось бы получить ответ вот на какой вопрос: Возможно ли в элементе управления "edit" работать с числовыми значениями? Поясню, про флаг ES_NUMBER я знаю, но возможно ли читать, как это делается при чтении строк, числа, допустим, unsigned int? И так же записывать. SendMessage(hEdit, EM_GETLINE, 0, &Val)

SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)Val);
Так как подобных сообщений я не нашёл можно предположить, что так работать нельзя, возможно, только вводить числовые значения в "edit". Но всё же хочу уточнить.
apofioz вне форума Ответить с цитированием
Старый 24.09.2022, 13:18   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Нельзя. Но вам ни кто не мешает объявить свои функции чтения и записи в edit принимающие на вход число и возвращающие считанное число.
macomics вне форума Ответить с цитированием
Старый 24.09.2022, 13:53   #3
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Это как?

Код:
void SetIntValue(hEdit, int val)
{
	//...
}

int GetIntValue(hEdit)
{
	return iValue;
}
Мне по условию нужно чтобы "edit" при запуске в нём отображался нуль

Цитата:
"Создать строку ввода с числом 0 и справа от неё - маленькую вертикальную полосу прокрутки. Под ними кнопки "Выход" и "Да". При нажатии на верхнюю кнопку полосы число в строке ввода увеличить на единицу, а на нижнюю кнопку - уменьшить на единицу. При нажатии кнопки "Да" отобразить содержимое строки ввода, а кнопки "Выход" - завершить работу."
здесь насколько я понял точно нужна текстовая переменная.
Я сделал, но мне кажется мой вариант не оптимальным т.к. я на каждый клик мыши по полосе прокрутки
1)Получаю строковое представления числа.
2)Конвертирую его в целое и увеличиваю или уменьшаю, соответственно.
3)Полученное число вновь преобразую, но теперь в строку.
4)Отправляю в редактор.
Если бы с числами возможно было работать, то эта последовательность исчезла бы.
apofioz вне форума Ответить с цитированием
Старый 24.09.2022, 13:58   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Если бы с числами возможно было работать, то эта последовательность исчезла бы
Не исчезла бы. Просто ее бы выполняла за вас система. На экране все числа могут быть отображены только после перевода их в текстовое представление. Для простоты перерисовки и универсальности функционирования системные компоненты edit работают только со строками, а преобразования выполняют прикладные программы.
macomics вне форума Ответить с цитированием
Старый 24.09.2022, 20:14   #5
Алексей1153
фрилансер
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,018
По умолчанию

apofioz, GetDlgItemInt / SetDlgItemInt
Алексей1153 вне форума Ответить с цитированием
Старый 24.09.2022, 20:35   #6
Алексей1153
фрилансер
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,018
По умолчанию

apofioz, кстати, глянь этот контрол Spin Controls
Алексей1153 вне форума Ответить с цитированием
Старый 24.09.2022, 20:52   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Если ему кажется долгим преобразование туда сюда int <-> string, то перечисление всех дочерних окон для поиска хэндла с нужным ID это наверное еще менее оптимальнее. А тем более, что это так же не изменит необходимости этого преобразования.
macomics вне форума Ответить с цитированием
Старый 25.09.2022, 06:04   #8
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Не исчезла бы. Просто ее бы выполняла за вас система. На экране все числа могут быть отображены только после перевода их в текстовое представление. Для простоты перерисовки и универсальности функционирования системные компоненты edit работают только со строками, а преобразования выполняют прикладные программы.
Это я понимаю, что на экране отображаются только символы, я про обработку в блоке "scrollbar", если в этом блоке увеличивать/уменьшать некое число, а после отправлять команду на обновление, где и происходит преобразование целочисленного значения в строковый тип и вывод в "edit". Тогда из "scrollbar"-а исчезли бы преобразования, а это уже что-то.

Объявить статическую переменную присвоить ей изначально нуль.
в секции "scrollbar" выполнять над ней арифметику, перед выходом из секции, послать сообщение о том, что данные изменились и их нужно обновить.
В секции "обновления" преобразовать переменную в строку и вывести/обновить значение в "edit".

Как-то так хотел сделать, но как это реализовать, как отправить сообщение в ID_EDIT: не знаю.(

А зачем тогда вообще стиль ES_NUMBER? Хорошо, ввёл я числа и что, как их считать из "edit", чтобы обработать.

Хотите сказать, такой код оптимален?
Код:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	static HWND hScrollBar, hYesButton, hExitButton, hEdit;
	static int cxButton = 60, cyButton = 30;
	static int nxPos, nxMin, nxMax;
	//static unsigned int Val = 0;
	//unsigned int* pVal = &Val;
	switch (msg)
	{
	case WM_CREATE:
	{
		GetClientRect(hwnd, &rcClient);
		
		int right = 80;
		int bottom = 40;
		int left = (rcClient.right >> 1) - (right >> 1);
		int top = (rcClient.bottom >> 1) - (bottom >> 1);

		hEdit = CreateWindow(szEditClass, TEXT("0"),
			WS_CHILD | WS_VISIBLE |
			/*ES_NUMBER*/  ES_CENTER,
			left, top, right, bottom,
			hwnd, (HMENU)ID_EDIT, hInstance, NULL);
		left += right + 20;
		top -= 40;
		right = 20;
		bottom = 80;
		hScrollBar = CreateWindow(szScrollBarClass, NULL,
			WS_CHILD | WS_VISIBLE |
			SBS_VERT,
			left, top, right, bottom,
			hwnd, (HMENU)ID_VSCROLL,
			hInstance, NULL);
		nxMin = 0;
		nxMax = bottom;
		nxPos = 0;
		SetScrollRange(hScrollBar, SB_CTL, nxMin, nxMax, FALSE);
		SetScrollPos(hScrollBar, SB_CTL, nxPos, TRUE);

		hYesButton = CreateWindow(szButtonClass, TEXT("YES"),
			WS_VISIBLE | WS_CHILD |
			BS_PUSHBUTTON | BS_CENTER,
			0, rcClient.bottom - cyButton,
			cxButton, cyButton,
			hwnd, (HMENU)ID_BUTTON1,
			hInstance, NULL);
		hExitButton = CreateWindow(szButtonClass, TEXT("EXIT"),
			WS_VISIBLE | WS_CHILD |
			BS_PUSHBUTTON | BS_CENTER,
			rcClient.right - cxButton,
			rcClient.bottom - cyButton,
			cxButton, cyButton,
			hwnd, (HMENU)ID_BUTTON2,
			hInstance, NULL);

		SendMessage(hEdit, EM_SETLIMITTEXT, 32, 0L);
		return 0;
	}
	case WM_VSCROLL:
	{
		TCHAR chBuf[32];
		SendMessage(hEdit, EM_GETLINE, 0, (LPARAM)(LPTSTR)&chBuf);
		int val = _ttoi(chBuf);

		switch (LOWORD(wParam))
		{
		case SB_TOP:
			break;
		case SB_LINEUP:
			--nxPos;
			--val;
			break;
		case SB_LINEDOWN:
			++nxPos;
			++val;
			break;
		case SB_PAGEUP:
			nxPos -= 8;
			break;
		case SB_PAGEDOWN:
			nxPos += 8;
			break;
		case SB_BOTTOM:
			nxPos = nxMax;
			break;
		case SB_THUMBPOSITION:
			nxPos = HIWORD(wParam);
			break;
		default:
			break;
		}

		if (nxPos > nxMax)
			nxPos = nxMax;
		if (nxPos < nxMin)
			nxPos = nxMin;
		SetScrollPos(hScrollBar, SB_CTL, nxPos, TRUE);
		_itot_s(val, chBuf, 32, 10);
		SendMessage(hEdit, EM_SETSEL, 0, 4);
		SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)(LPCTSTR)&chBuf);
		return 0;
	}
	case WM_COMMAND:
	{
		switch (LOWORD(wParam))
		{
			case ID_EDIT:
			{
				switch (HIWORD(wParam))
				{
					case EN_ERRSPACE:
					{
						MessageBox(hwnd, TEXT("few memory"),
							TEXT("Memory alloc"),
							MB_OK);
						return 0;
					}
					case EN_CHANGE:
					{
						int TextRange = SendMessage(hEdit, EM_GETLIMITTEXT, 0, 0L);
						return 0;
					}
				}
				return 0;
			}
			case ID_BUTTON1:
			{
				switch (HIWORD(wParam))
				{
					case BN_CLICKED:
					{
						TCHAR chBuffer[32];
						int szLen = SendMessage(hEdit,
							EM_GETLINE,
							0,
							(LPARAM)(LPTSTR)&chBuffer);
						chBuffer[szLen] = TEXT('\0');

						MessageBox(hwnd, chBuffer, TEXT("The Value"), MB_OK);						return 0;
					}
				}
				return 0;
			}
			case ID_BUTTON2:
			{
				DestroyWindow(hwnd);
				return 0;
			}
		}
		return 0;
	}
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd, msg, wParam, lParam);
}

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Да, я об этих функциях читал, но, как я объяснил выше(попытался объяснить) это всё же не совсем то чего я хотел.


Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
кстати, глянь этот контрол
Интересный контрол, но мне нужен, именно, тот, который я изучил. Хотя это выглядит более изящно, что ли, а по функционалу, не знаю, такой же, как "edit", почти такой же.
apofioz вне форума Ответить с цитированием
Старый 25.09.2022, 06:21   #9
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Немного подправил:
Код:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	static HWND hScrollBar, hYesButton, hExitButton, hEdit;
	static int cxButton = 60, cyButton = 30;
	static int nxPos, nxMin, nxMax;
	static unsigned int Val = 0; //Эту переменную буду использовать для увеличения/уменььшения.
	static TCHAR chBuf[32];
	//unsigned int* pVal = &Val;
	switch (msg)
	{
	case WM_CREATE:
	{
		GetClientRect(hwnd, &rcClient);
		
		int right = 80;
		int bottom = 40;
		int left = (rcClient.right >> 1) - (right >> 1);
		int top = (rcClient.bottom >> 1) - (bottom >> 1);

		hEdit = CreateWindow(szEditClass, TEXT("0"),
			WS_CHILD | WS_VISIBLE |
			/*ES_NUMBER*/  ES_CENTER,
			left, top, right, bottom,
			hwnd, (HMENU)ID_EDIT, hInstance, NULL);
		left += right + 20;
		top -= 40;
		right = 20;
		bottom = 80;
		hScrollBar = CreateWindow(szScrollBarClass, NULL,
			WS_CHILD | WS_VISIBLE |
			SBS_VERT,
			left, top, right, bottom,
			hwnd, (HMENU)ID_VSCROLL,
			hInstance, NULL);
		nxMin = 0;
		nxMax = bottom;
		nxPos = 0;
		SetScrollRange(hScrollBar, SB_CTL, nxMin, nxMax, FALSE);
		SetScrollPos(hScrollBar, SB_CTL, nxPos, TRUE);

		hYesButton = CreateWindow(szButtonClass, TEXT("YES"),
			WS_VISIBLE | WS_CHILD |
			BS_PUSHBUTTON | BS_CENTER,
			0, rcClient.bottom - cyButton,
			cxButton, cyButton,
			hwnd, (HMENU)ID_BUTTON1,
			hInstance, NULL);
		hExitButton = CreateWindow(szButtonClass, TEXT("EXIT"),
			WS_VISIBLE | WS_CHILD |
			BS_PUSHBUTTON | BS_CENTER,
			rcClient.right - cxButton,
			rcClient.bottom - cyButton,
			cxButton, cyButton,
			hwnd, (HMENU)ID_BUTTON2,
			hInstance, NULL);

		SendMessage(hEdit, EM_SETLIMITTEXT, 32, 0L);
		return 0;
	}
	case WM_VSCROLL:
	{
		//Преобразование, которое хдесь было, убрал. Осталось
		//только одно преобразование в этом блоке.
		switch (LOWORD(wParam))
		{
		case SB_TOP:
			break;
		case SB_LINEUP:
			--nxPos;
			--val;
			break;
		case SB_LINEDOWN:
			++nxPos;
			++val;
			break;
		case SB_PAGEUP:
			nxPos -= 8;
			break;
		case SB_PAGEDOWN:
			nxPos += 8;
			break;
		case SB_BOTTOM:
			nxPos = nxMax;
			break;
		case SB_THUMBPOSITION:
			nxPos = HIWORD(wParam);
			break;
		default:
			break;
		}

		if (nxPos > nxMax)
			nxPos = nxMax;
		if (nxPos < nxMin)
			nxPos = nxMin;
		SetScrollPos(hScrollBar, SB_CTL, nxPos, TRUE);
		_itot_s(val, chBuf, 32, 10); //ещё бы это преобразование убрать
		SendMessage(hEdit, EM_SETSEL, 0, 4);
		SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)(LPCTSTR)&chBuf);
		return 0;
	}
	case WM_COMMAND:
	{
		switch (LOWORD(wParam))
		{
			case ID_EDIT:
			{
				switch (HIWORD(wParam))
				{
					case EN_ERRSPACE:
					{
						MessageBox(hwnd, TEXT("few memory"),
							TEXT("Memory alloc"),
							MB_OK);
						return 0;
					}
				}
				return 0;
			}
			case ID_BUTTON1:
			{
				switch (HIWORD(wParam))
				{
					case BN_CLICKED:
					{
						int szLen = SendMessage(hEdit,
							EM_GETLINE,
							0,
							(LPARAM)(LPTSTR)&chBuf);

						MessageBox(hwnd, chBuf, TEXT("The Value"), MB_OK);						
						return 0;
					}
				}
				return 0;
			}
			case ID_BUTTON2:
			{
				DestroyWindow(hwnd);
				return 0;
			}
		}
		return 0;
	}
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd, msg, wParam, lParam);
}
apofioz вне форума Ответить с цитированием
Старый 25.09.2022, 11:43   #10
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
А зачем тогда вообще стиль ES_NUMBER?
Этот фильтр ввода нужен для того, чтобы избежать ошибок преобразование string -> int. Без такого фильтра ввода пользователь вместо числа может вводить любой текст и вам перед преобразованием придется проверять строку на возможность преобразования в число или получите ошибку преобразования. С фильтром пользователь просто не сможет ввести символы отличные от цифр.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо написать "таймер", который будет запускаться при нажатии кнопки "Start", приостанавливаться на "Pause", и сбрасываться на "Reset" billiejean78 JavaScript, Ajax 1 03.09.2021 08:58
Убрать папки "Pictures", "Music", "Видео", "Downloads" из "МОЙ КОМПЬЮТЕР" Бахтиёр1916 Windows 1 05.04.2017 12:53
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Возможно ли сделать выделение значения в столбце "факт" в красный цвет шрифта, если оно выходит меньше значения в столбце "план" ? squit Microsoft Office Excel 19 17.01.2015 20:09
исправить это условие чтоб "1" выводилось на терминал даже если $stdat2[9] принимала не числовые значения sergeyfromkomi PHP 5 24.04.2010 10:44