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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2023, 14:28   #1
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию Диалоговые окна. вывод текста в static функцией TextOut.

Здравствуйте! Возможно ли в стандартный объект windows "static" выводить текст функцией TextOut()?
Если да, то как и вообще возможно ли сделать следующее, допустим, у меня есть listbox со списком параметров выравнивания: по левому краю, по правому краю, по центру, при выборе одного из этих пунктов я хочу в объекте "static" отобразить пример результата, вывести некий текст для визуализации того, что должно получиться в итоге при выводе текста. Короче говоря если я выбрал "Выравнивание по центру", то нужно чтобы текст в объекте статик был по центру. Хочется верить, что объяснил довольно ясно.

P.S.
Возможно, здесь лучше использовать однострочный "edit".
apofioz вне форума Ответить с цитированием
Старый 23.02.2023, 14:39   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А не проще у окна static устанавливать флаги SS_LEFT/SS_CENTER/SS_RIGHT, вместо перерисовки текста вручную?
macomics вне форума Ответить с цитированием
Старый 23.02.2023, 14:43   #3
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Как это делать?
apofioz вне форума Ответить с цитированием
Старый 23.02.2023, 14:49   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Получаете старый стиль Static
Код:
staticStyle = GetWindowLong(hStatic, GWL_STYLE);
staticStyle &= ! (SS_LEFT | SS_CENTER | SS_RIGHT);
Устанавливаете один из флагов
Код:
SetWindowLong(hStatic, GWL_STYLE, staticStyle | SS_LEFT);
Код:
SetWindowLong(hStatic, GWL_STYLE, staticStyle | SS_CENTER);
Код:
SetWindowLong(hStatic, GWL_STYLE, staticStyle | SS_RIGHT);

Последний раз редактировалось macomics; 23.02.2023 в 15:37.
macomics вне форума Ответить с цитированием
Старый 23.02.2023, 14:55   #5
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Может быть так было бы проще, но у меня текст не выводится вообще. Или имеется ввиду выводить текст при помощи функции SetWindowText()... Хотя так тоже ничего не выводится.
apofioz вне форума Ответить с цитированием
Старый 23.02.2023, 14:57   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Да. Достаточно использовать Static как обычное окно и не рисовать ничего вручную. Устанавливать текст в окне через SetWindowText
Тогда может быть дело не в этих функциях, а в самом Static. Вы его отобразили (WS_VISIBLE) или может он не по тем координатам?
Чтобы увидеть Static добавьте к его стилю бордюр WS_BORDER

Последний раз редактировалось macomics; 23.02.2023 в 14:59.
macomics вне форума Ответить с цитированием
Старый 23.02.2023, 15:05   #7
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Вы его отобразили (WS_VISIBLE)
Да, конечно.


Цитата:
Сообщение от macomics Посмотреть сообщение
или может он не по тем координатам?
Какие координаты указывал при создании шаблона диалогового окна те и остались, ничего не перемещал.


Цитата:
Сообщение от macomics Посмотреть сообщение
Чтобы увидеть Static добавьте к его стилю бордюр WS_BORDER
Тоже самое, этот стиль я указал при создании класса.
apofioz вне форума Ответить с цитированием
Старый 23.02.2023, 15:08   #8
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Код:
switch(HIWORD(wParam))
			{
				case LBN_SELCHANGE:
				{
					
					int idx = SendMessage(hList, LB_GETCURSEL, 0, 0L);
					if(idx == LB_ERR)
					{
						return FALSE;
					}
					int nChar = SendMessage(hList, LB_GETTEXT, 
							  idx, (LPARAM)szBuf);
					if(nChar == 0 || nChar == LB_ERR)
					{
						return FALSE;
					}
					szBuf[nChar] = '\0';
					//UINT align = WhatIsAlign(szBuf);
					HWND hStatic = GetDlgItem(hDlg, ID_STATIC_ALIGN);

					SetWindowLong(hStatic, GWL_STYLE, SS_CENTER);

					HDC hdc = GetDC(hStatic);
					//UINT OldAlign = SetTextAlign(hdc, align);
					
					SetWindowText(hStatic, szStr);
					RECT rc;
					GetWindowRect(hStatic, &rc);
					rc.right -= rc.left;
					rc.bottom -= rc.top;

					//InvalidateRect(hStatic, NULL, TRUE);
					//TextOut(hdc, rc.left, rc.top, szStr, _tcslen(szStr));
					

					//SetTextAlign(hdc, OldAlign);
					ReleaseDC(hStatic, hdc);
					return TRUE;
				}
			}
apofioz вне форума Ответить с цитированием
Старый 23.02.2023, 15:35   #9
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
SetWindowLong(hStatic, GWL_STYLE, SS_CENTER);
Так вы обнулили все остальные стили у Static. Я зачем указал, что старые стили надо сначала получить и сбросить флаги SS_LEFT, SS_CENTER и SS_RIGHT перед тем как добавить один из них и установить его.

SetWindowLong(hWnd, GWL_STYLE, wndStyle) устанавливает (изменяет) значение, которое передавалось при создании окна как wndStyle (третий параметр CreateWindow)

Последний раз редактировалось macomics; 23.02.2023 в 15:41.
macomics вне форума Ответить с цитированием
Старый 23.02.2023, 21:41   #10
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Код:
DWORD lStyle = 0;
lStyle = GetWindowLong(hStatic, GWL_STYLE);
lStyle &= !(SS_LEFT | SS_RIGHT | SS_CENTER);

SetWindowLong(hStatic, GWL_STYLE, lStyle | SS_CENTER);
SetWindowText(hStatic, szStr);
Сделал так, как вы описали, но результат, почему то, тот же.
Dialog3.png

Странно, но, если я диалоговое окно перетаскиваю, то объект "static" просто исчезает. Кто отвечает за перерисовку в диалоговом окне? Разве не ОС....

Последний раз редактировалось apofioz; 23.02.2023 в 22:22.
apofioz вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Canvas.TextOut вывод текста от средины к краям Женя32 Общие вопросы Delphi 9 07.10.2019 20:31
Зависают диалоговые окна Shkolota Windows 14 01.09.2013 12:00
Не редактируются диалоговые окна -_- Alovar Visual C++ 0 29.11.2011 21:07
Диалоговые окна. AnnJoy Помощь студентам 0 15.06.2011 19:16
Вывод строки текста в Static Text через код skiffter Visual C++ 4 01.10.2010 17:08