Добрый день. Люди добрые, мы сами не местные, помогите решить проблему. Ситуация: есть окно. На нем, для оформления, создано несколько дочерних окон, которым назначены bmp-картинки (назовем это скинами) - это все в порядке, это все работает. Проблема вот в чем: нужно несколько раз в секунду выводить на это окно текстовую информацию, не "портя" скинов. Т.е. у текста должен быть прозрачный фон. Вот тут, собственно и затык... Информации у меня мало, подскажите пожалуйста, как правильные программисты решают этот вопрос? Пытался создать дочернее окно, на нем "SetBkMode (hDC,TRANSPARENT);", но уперся в то, что не могу очистить контекст после предыдущего рисования... Пытался сперва вывести на дочернее окно кусочек фона, а потом текст, уперся в то, что DrawText не выводит (?) текст на контекст в памяти, которому уже назначена (SelectObject) картинка (что, в общем, логично). В-общем, единственное, чего я добился: сперва выводим на контекст окна кусочек фона, а потом на него же выводим текст. И в итоге получаем мерцание И попутно два вопроса: 1. Как я понял MSDN, "ValidateRect (hWnd,false);" и "BeginPaint (hWnd,PaintStruct); EndPaint (hWnd,PaintStruct);" это полностью одинаковые "вещи", т.е. обе делают одно и то же: говорят винде, что наше окно полностью перерисовалось. Нет? 2. Если я создаю контекст в памяти с помощью "CreateCompatibleDC", его по окончании нужно "ReleaseDC" или "DeleteDC"? Я-то всю жизнь делал второе, а надысь в одном исходнике увидел первое....
Что бы не было мерцания нужно после вывода фона и строки делать задержку до следующего выводимого кадра на мониторе, например частота мерцания телека 50Hz значит и задержка 1/50 секунды, от чего как вы думаете такой плавный был скролинг строк на spectrum.
AFAIK нужно создать пустой BRUSH (стиль BS_HOLLOW или BS_NULL), выбрать его в контекст нужного дочерного окна, а потом уже выводить текст.
Это случайно не то, что называется "On-screen display"? Если да, то просто получаешь hDC экрана и рисуешь на нем все, что хошь. Стирание нарисованного - простой InvalidateRect.
CyberManiac Челу нужен прозрачный фон у текста при выводе, для этого перед выводом надо выбрать в контекст прозрачный BRUSH
SetBkMode (HDC, TRANSPARENT); Пара BeginPaint/EndPaint может быть использована только в ответе на WM_PAINT и нигде больше. ReleaseDC() только после GetDC() и нигде больше. Правильно освобождать контекст взятый с CreateCompatibleDC() - через DeleteDC(). Кстати, в твоём случае надо сперва очищать фон а затем (прозрачно) рисовать техт. Иначе предыдущий текст сольётся со следующим. Лучше всего через CreateCompatibleDC(), но не делать это каждое обновление, а держать его (HDC) в памяти. Потом, когда надо рисовать - просто InvalidateRect()/UpdateWindow() того прямоугольника(ков) где произойдёт изменение - значительно быстрее. Ещё забыл сказать: уменьшить мерцание можно ответив "return TRUE;" на WM_PAINT. В стиле класса (когда регистрируешь) указать NULL в поле hrbBackground. Рисуем фон (скины) прямо в WM_PAINT.
Всем спасибо, вроде получилось, тока как-то непонятно для меня. Но об этом чуть ниже. Bohdan200: "FAIK нужно создать пустой BRUSH (стиль BS_HOLLOW или BS_NULL), выбрать его в контекст нужного дочерного окна, а потом уже выводить текст." Не помогло =( Заливает черным цветом... А мне надо... "залить прозрачным цветом" =) AsmGuru62: Спасибо, именно благодаря твоему (Вашему? =) сообщению заработало =) --------------- Теперь о непонятке.... Т.е. оно работает, но для меня не совсем понятно =) Общая идея была такая: при инициализации программы создаем дочерние окна, создаем растры, создаем картинки... Так вот, моя ошибка была в том, что в последовательности CreateCompatibleDC - SelectObject (hMemDC, hBmpBackground) контекст не очищался. Почему так происходит - я так и не понял.... В итоге я имею такую обработку WM_PAINT: cоздаем совместимый контекст, создаем картинку на основании растра, назначаем совместимому контексту нашу картинку, затем на этот контекст выводим текст, и копируем все это дело на контекст окна. И результат - именно тот, что мне нужен... Тока он мне непонятный =) Непонятно вот что: почему приходися каждый раз создавать картинку? Если вынести создание картинки в блок инициализации - то оно не работает, контекст не очищается... В принципе, "оно работает, да и бог с ним", но... если можно (а скорее всего, нужно) что-то поправить - буду рад выслушать. Еще раз всем спасибо =)