Задать вопрос
@azamat747

Как при изменение размеров окна удержать выведенный текст?

Добрый день.
Я пытаюсь выводить каждый раз при изменении размеров окна строку в случайном положении и цвете, при этом сохраняя предыдущий вывод. Строка в новом цвете и положении выходит, а вот предыдущий текст теряется при вызове WM_PAINT

Вот код ветки оконного обработчика сообщений
case WM_PAINT:
		{ 
			InvalidateRect(hwnd, NULL, FALSE);

			hdc = BeginPaint(hwnd, &ps);
			old_text_color = SetTextColor(hdc, RGB(rand() % 256, rand() % 256, rand() % 256));
			old_bk_color = SetBkColor(hdc, NULL);
			old_bk_mode = SetBkMode(hdc, TRANSPARENT);

			TextOut(hdc, rand() % 40, rand() % 40, L"Hello, World!", strlen("Hello, World!"));
			EndPaint(hwnd, &ps);
			ReleaseDC(hwnd, hdc);
			return(0);
		} break;


Также пробовал проверять на изменение в главном цикле приложения, но результат тот же
while (TRUE)
	{
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			if (msg.message == WM_QUIT) break;
			TranslateMessage(&msg);

			if (msg.message == WM_PAINT)
			{
				old_text_color = SetTextColor(hdc, RGB(rand() % 256, rand() % 256, rand() % 256));
				old_bk_color = SetBkColor(hdc, NULL);
				old_bk_mode = SetBkMode(hdc, TRANSPARENT);

				TextOut(hdc, rand() % 40, rand() % 40, L"Hello, World!", strlen("Hello, World!"));
			}
			DispatchMessage(&msg);
		}
		
	}

Заранее спасибо!
  • Вопрос задан
  • 64 просмотра
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Первое, самое главное. WM_PAINT рисует содержимое окна целиком. Если нужны тысяча надписей — или рисуйте их тысячу штук, или отпечатайте на внеэкранный BITMAP, или ещё что-нибудь.

Это экономит память: Win3 хреново, но работала на одном мегабайте, лично видел. Но имеет побочный эффект — если прога перестаёт отвечать, например, в 95 с её вытесняющей многозадачностью, WM_PAINT никак не вызовешь, и будет белое окошко. XP (вроде она) кэширует содержимое окна и выводит его, пока прога не отвечает.

Второе. InvalidateRect в WM_PAINT не имеет смысла. Смысл этого вызова — попросить Windows перерисовать окно, когда получится.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы