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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2022, 09:53   #11
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
прицепи проект в ZIP архиве. Если время будет - я попробую поковырять. Или кто-то другой успеет уже
Хорошо, если не сделаю, то прикреплю, пока что получается так, если в WM_PAINT lf.lfWidth -= 40;, то выводится тютелька в тютельку, но если начать менять размер окна, тогда строка от границы как бы убегает, короче говоря размер окна гораздо больше, чем текст.

Последний раз редактировалось apofioz; 20.10.2022 в 10:02.
apofioz вне форума Ответить с цитированием
Старый 20.10.2022, 10:48   #12
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Что и до сих пор никто не сказал, что если шрифт не моноширинный, то нельзя просто умножать кол-во символ на константу для длины?
p51x вне форума Ответить с цитированием
Старый 20.10.2022, 11:24   #13
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Что и до сих пор никто не сказал, что если шрифт не моноширинный, то нельзя просто умножать кол-во символ на константу для длины?
И? Как в таком случае поступить? GetCharWidth32 - тут не поможет?
apofioz вне форума Ответить с цитированием
Старый 20.10.2022, 11:27   #14
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

p51x, это вроде и так очевидно Я же не зря про GetTextExtentPoint32 воздух сотрясаю
Алексей1153 вне форума Ответить с цитированием
Старый 20.10.2022, 11:37   #15
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
это вроде и так очевидно
Кому?

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Я же не зря про GetTextExtentPoint32 воздух сотрясаю
Ясно, что ничего не ясно... Если шрифт зарегистрировать в WM_CREATE, затем в WM_SIZE: вычисляется новый размер окна, а как GetTextExtentPoint32 поможет подогнать шрифт под изменившееся окно? И как сделать так, чтобы после изменения размера окна, текст заполнял всё окно не перерегистрируя шрифт?

Последний раз редактировалось apofioz; 20.10.2022 в 11:41.
apofioz вне форума Ответить с цитированием
Старый 20.10.2022, 11:59   #16
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

apofioz, аа, так тебе нужно, чтобы текст как бы заливал окно, переносясь, доходя до края, на следующую строку ?
Я не так понял проблему, значит.

В этом случае придётся действовать обратно - известен размер клиентской области. Текст разбираем по отдельным символам, набираем сумму ширин каждой литеры, пока набор влазит в ширину. Затем переходим к новой строке (к "курсору" добавляется высота шрифта). Вот так, вручную

но этим функционалом уже наделены статик-контрол и едит-контрол. Может, проще контрол растягивать в размер окна, а текст туда просто закинуть + шрифт нужный задать ?
Алексей1153 вне форума Ответить с цитированием
Старый 20.10.2022, 12:04   #17
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
аа, так тебе нужно, чтобы текст как бы заливал окно, переносясь, доходя до края, на следующую строку ?
Нет, не так, нужно чтобы, если окно сжимается, то и текст уменьшался, если расширяется, то текст должен с окном расширяться, как будто последняя буква прилипла к правой стороне(краю) окна, может так будет понятнее.
apofioz вне форума Ответить с цитированием
Старый 20.10.2022, 12:09   #18
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

apofioz, тогда нужно плясать всё равно от клиентского размера, после чего в WM_SIZING делать проверку при помощи GetTextExtentPoint32 на выход текста за край, а затем выполнять подгонку, уменьшая кегль на единичку на каждой итерации
Алексей1153 вне форума Ответить с цитированием
Старый 20.10.2022, 12:26   #19
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
тогда нужно плясать всё равно от клиентского размера, после чего в WM_SIZING делать проверку при помощи GetTextExtentPoint32 на выход текста за край, а затем выполнять подгонку, уменьшая кегль на единичку на каждой итерации
Что за кегль?
Т.е. WM_SIZE не нужен нужен WM_SIZEING? Ну так как текст константный, в данном случае, количество символов не меняется, то как это должно выглядеть:
Код:
case WM_SIZING:
	{
		RECT rcWnd = *(LPRECT)lParam;
		
				SIZE iTextRus = { };
				int i;
				HDC hdc = GetDC(hwnd);
				GetTextExtentPoint32(hdc, szTextRus, lstrlen(szTextRus), &iTextRus);
                                dip = GetDeviceCaps(hdc, LOGPIXELSY);
				ReleaseDC(hwnd, hdc);
				for (i = iTextRus.cx; ; --i)
				{
					if (i < rcWnd.right)
						break;
				}
                                lf.lfWidth = i / lstrlen(szTextEng);
				lf.lfHeight = -MulDiv(lf.lfWidth, dip, 72);
		}
		return 0;
	}
Что-то в этом духе?

Последний раз редактировалось apofioz; 20.10.2022 в 12:39.
apofioz вне форума Ответить с цитированием
Старый 20.10.2022, 12:47   #20
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Что за кегль
https://ru.wikipedia.org/wiki/%D0%9A...B3%D0%BB%D1%8C

менять нужно только lfHeight - инкрементом/декрементом

Цитата:
Сообщение от apofioz Посмотреть сообщение
return 0;
нужно вызывать обработчик по умолчанию, а не просто выходить
Алексей1153 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Win API 32. Открытие окна при нажатии на строку листбокса Dark_Tarakan Помощь студентам 0 20.10.2016 20:52
Открытие окна при нажатии на строку листбокса Dark_Tarakan Win Api 0 19.10.2016 18:16
подгон компонентов под размер окна brutalis Qt и кроссплатформенное программирование С/С++ 1 22.09.2013 11:42
Как считать строку из диалогового окна (не консольного) Elloriane Общие вопросы C/C++ 6 06.03.2013 21:59
Подгон текста по размеру Jakethefish JavaScript, Ajax 1 07.03.2011 15:05