Вопрос № 100345: Здравствуйте. Сделал прозрачный фон на надписях (static), но при изменении значения - текст накладывается один на другой. Пытаюсь исправить функцией InvalidateRect, но вручную RECT получать не хочется, т.к. много надписей а следующий код находит RECT...
Вопрос № 100.345
Здравствуйте. Сделал прозрачный фон на надписях (static), но при изменении значения - текст накладывается один на другой. Пытаюсь исправить функцией InvalidateRect, но вручную RECT получать не хочется, т.к. много надписей а следующий код находит RECT не там где нужно а правее и ниже, подскажите как исправить?
Приложение:
Отправлен: 31.08.2007, 12:56
Вопрос задал: Geograph (статус: 1-ый класс)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Aristos
Здравствуйте, Geograph!
Подскажу как разобраться с координатами RECT'a.
Функция GetWindowRect возвращает значение RECT в экранной системе координат. А InvalidateRect принимает координаты в оконной (относительно hwndMain). Необходимо преобразовать из экранной в оконную с помощью функции MapWindowPoints, которая преобразует оконные координаты от одного окна к другому. Применительно к вашему коду:
ps: Здесь мы пользуемся тем, что координаты для HWND_DESKTOP совпадают с экранными, а так же тем, что RECT это 2 точки - (left, top) и (right,bottom) - и их можно преобразовать одним вызовом функции.
Ответ отправил: Aristos (статус: 5-ый класс)
Ответ отправлен: 31.08.2007, 13:26 Оценка за ответ: 5 Комментарий оценки: Aristos огромное спасибо за подробный, внятный ответ и особенно за пример! Все работает.
Отвечает: Shurka
Hi! Geograph!
Думаю проще и быстрее сделать надпись ненадолго непрозрачной,
а потом прозрачной снова.
Ответ отправил: Shurka (статус: 2-ой класс)
Ответ отправлен: 31.08.2007, 15:41 Оценка за ответ: 3 Комментарий оценки: Да действительно я тоже пытался сначала так сделать. Делал SetBkMode(hwnd,TRANSPARENT); потом SetBkMode(hwnd,OPAQUE); но ничего не вышло надписи превратились в полностью булые прямоугольники. Хотя может я что-то не правильно сделал :)