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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2022, 10:43   #1
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию Подгон окна под строку текста.

И снова, здравствуйте! Интересует такой вопрос: Допустим я хочу чтобы строка/слово текста точно умещалось в окно заданного размер, я задаю размеры окна в главной функции окна, в блоке сообщения WM_CREATE я пытаюсь вычислить ширину символа так cxChar =cxClient / nCharas т.е. отношение ширины окна(в пикселах) к количеству символов в строке(не в пискелах). Далее вычисляю высоту символа cyChar = -MulDiv(cxChar, GetDeviceCaps(hdc, LOGPIXELSY), 72); всё бы ничего, но окно не вмещает всех символов, один символ не хочет помещаться в окне. Наверняка есть более оптимальный способ, но на данный момент я делаю так. Чего не хватает в расчётах, и как довести до ума то, что уже есть, и сделать так, чтобы при увеличении/уменьшении окна текст так же оставался в окне, производить перерасчёт размеров символов в wm_size:...
Окно3.jpg
apofioz вне форума Ответить с цитированием
Старый 20.10.2022, 07:51   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

apofioz,
как узнать размеры текста, выведенного на конкретный HDC с конкретным HFONT
GetTextExtentPoint32

как подогнать клиентскую часть окна
AdjustWindowRect
Алексей1153 вне форума Ответить с цитированием
Старый 20.10.2022, 08:34   #3
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
apofioz,
как узнать размеры текста, выведенного на конкретный HDC с конкретным HFONT
GetTextExtentPoint32

как подогнать клиентскую часть окна
AdjustWindowRect
И что, я именно так и делаю т.е. AdjustWindowRect я применяю, до этого я вычисляю ширину и высоту символа, которые позволят мне уместить текст в окне, затем перед вызовом SetWindowPos() я вызываю функцию AdjustWindowRect.
apofioz вне форума Ответить с цитированием
Старый 20.10.2022, 08:41   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

apofioz, код показывай тогда
Алексей1153 вне форума Ответить с цитированием
Старый 20.10.2022, 08:54   #5
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
apofioz, код показывай тогда
Код:
case WM_CREATE:
	{
		_tcscpy_s(lf.lfFaceName, 32, TEXT("Times New Roman Cyr"));
		lf.lfWeight = FW_NORMAL;
		lf.lfCharSet = DEFAULT_CHARSET;
		lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
		lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
		lf.lfQuality = DEFAULT_QUALITY;
		lf.lfPitchAndFamily = DEFAULT_PITCH;
		
		RECT rcClient;

		//SIZE sz = { };

		GetClientRect(hwnd, &rcClient);
		GetWindowRect(hwnd, &rcWnd);
		int cxWindow = (rcWnd.right - rcWnd.left) - rcClient.right;
		int cyWindow = (rcWnd.bottom - rcWnd.top) - rcClient.bottom;


		HDC hdc = GetDC(hwnd);

		lf.lfWidth = (rcClient.right / (_tcslen(szTextRus)));
		lf.lfHeight = -MulDiv(lf.lfWidth, GetDeviceCaps(hdc, LOGPIXELSY), 72);
		
		//int Extra = GetTextCharacterExtra(hdc);
		HFONT hFont = CreateFontIndirect(&lf);
		HFONT hOldFont = (HFONT)SelectObject(hdc, hFont);

		//GetTextExtentPoint32(hdc, szTextRus, _tcslen(szTextRus), &sz);
		SelectObject(hdc, hOldFont);
		DeleteObject(hFont);

		ReleaseDC(hwnd, hdc);

		
		int right = 0, i;
		
		for (i = 0; ; ++i)
		{
			if ((right + lf.lfWidth) > rcClient.right)
				break;
			right += lf.lfWidth;
		}
		
		int cxNewWnd = _tcslen(szTextRus) * lf.lfWidth + cxWindow;
		int cyNewWnd = (abs(lf.lfHeight << 1)) + cyWindow;
		rcClient.right = cxNewWnd;
		rcClient.bottom = cyNewWnd;
		rcClient.left = rcWnd.left;
		rcClient.top = rcWnd.top;

		const UINT dpi = GetDpiForWindow(hwnd);
		AdjustWindowRectExForDpi(&rcClient, WS_OVERLAPPEDWINDOW, FALSE, 0, dpi);
		SetWindowPos(hwnd, 0, 0, 0, rcClient.right, rcClient.bottom,
			SWP_NOMOVE | SWP_NOOWNERZORDER);
		
		return 0;
	}
apofioz вне форума Ответить с цитированием
Старый 20.10.2022, 09:02   #6
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

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

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
так в твоём коде нет использования GetTextExtentPoint32
Я её закомментировал так как толку от неё мало, окно становится больше, а результат всё тот же, как на скриншоте, одна буква не помещается в окно.
apofioz вне форума Ответить с цитированием
Старый 20.10.2022, 09:20   #8
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

apofioz, обычно она работает чётко, просто что-то не так делаешь.

Я бы пересчёт размера вынес в обработчик WM_TIMER 250мс

объект шрифта можно сделать полем класса и создать один раз. Или вообще назначить шрифт окну, чтобы каждый раз не назначать для HDC
Алексей1153 вне форума Ответить с цитированием
Старый 20.10.2022, 09:31   #9
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Я бы пересчёт размера вынес в обработчик WM_TIMER 250мс
Я не знаю как это делать, не изучал.


Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
обычно она работает чётко, просто что-то не так делаешь.
Вот в этом и вопрос: Что именно?
apofioz вне форума Ответить с цитированием
Старый 20.10.2022, 09:33   #10
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

apofioz, прицепи проект в ZIP архиве. Если время будет - я попробую поковырять. Или кто-то другой успеет уже
Алексей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