Вывод текста с прозрачным фоном

Тема в разделе "WASM.BEGINNERS", создана пользователем da-007, 29 сен 2006.

Статус темы:
Закрыта.
  1. da-007

    da-007 New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    13
    Добрый день.

    Люди добрые, мы сами не местные, помогите решить проблему. Ситуация: есть окно. На нем, для оформления, создано несколько дочерних окон, которым назначены bmp-картинки (назовем это скинами) - это все в порядке, это все работает. Проблема вот в чем: нужно несколько раз в секунду выводить на это окно текстовую информацию, не "портя" скинов. Т.е. у текста должен быть прозрачный фон. Вот тут, собственно и затык... Информации у меня мало, подскажите пожалуйста, как правильные программисты решают этот вопрос? Пытался создать дочернее окно, на нем "SetBkMode (hDC,TRANSPARENT);", но уперся в то, что не могу очистить контекст после предыдущего рисования... Пытался сперва вывести на дочернее окно кусочек фона, а потом текст, уперся в то, что DrawText не выводит (?) текст на контекст в памяти, которому уже назначена (SelectObject) картинка (что, в общем, логично). В-общем, единственное, чего я добился: сперва выводим на контекст окна кусочек фона, а потом на него же выводим текст. И в итоге получаем мерцание :dntknw:

    И попутно два вопроса:

    1. Как я понял MSDN,

    "ValidateRect (hWnd,false);"

    и

    "BeginPaint (hWnd,PaintStruct);
    EndPaint (hWnd,PaintStruct);"

    это полностью одинаковые "вещи", т.е. обе делают одно и то же: говорят винде, что наше окно полностью перерисовалось. Нет?

    2. Если я создаю контекст в памяти с помощью "CreateCompatibleDC", его по окончании нужно "ReleaseDC" или "DeleteDC"? Я-то всю жизнь делал второе, а надысь в одном исходнике увидел первое....
     
  2. Pretorian

    Pretorian New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    33
    Адрес:
    Russia
    Что бы не было мерцания нужно после вывода фона и строки делать задержку до следующего выводимого кадра на мониторе, например частота мерцания телека 50Hz значит и задержка 1/50 секунды, от чего как вы думаете такой плавный был скролинг строк на spectrum.
     
  3. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    AFAIK нужно создать пустой BRUSH (стиль BS_HOLLOW или BS_NULL), выбрать его в контекст нужного дочерного окна, а потом уже выводить текст.
     
  4. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Это случайно не то, что называется "On-screen display"? Если да, то просто получаешь hDC экрана и рисуешь на нем все, что хошь. Стирание нарисованного - простой InvalidateRect.
     
  5. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    CyberManiac
    Челу нужен прозрачный фон у текста при выводе, для этого перед выводом надо выбрать в контекст прозрачный BRUSH
     
  6. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    SetBkMode (HDC, TRANSPARENT);

    Пара BeginPaint/EndPaint может быть использована только в ответе на WM_PAINT и нигде больше. ReleaseDC() только после GetDC() и нигде больше. Правильно освобождать контекст взятый с CreateCompatibleDC() - через DeleteDC().

    Кстати, в твоём случае надо сперва очищать фон а затем (прозрачно) рисовать техт. Иначе предыдущий текст сольётся со следующим. Лучше всего через CreateCompatibleDC(), но не делать это каждое обновление, а держать его (HDC) в памяти. Потом, когда надо рисовать - просто InvalidateRect()/UpdateWindow() того прямоугольника(ков) где произойдёт изменение - значительно быстрее.

    Ещё забыл сказать: уменьшить мерцание можно ответив "return TRUE;" на WM_PAINT. В стиле класса (когда регистрируешь) указать NULL в поле hrbBackground. Рисуем фон (скины) прямо в WM_PAINT.
     
  7. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    http://www.wasm.ru/forum/viewtopic.php?id=15309
     
  8. da-007

    da-007 New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    13
    Всем спасибо, вроде получилось, тока как-то непонятно для меня. Но об этом чуть ниже.

    Bohdan200:

    "FAIK нужно создать пустой BRUSH (стиль BS_HOLLOW или BS_NULL), выбрать его в контекст нужного дочерного окна, а потом уже выводить текст."

    Не помогло =( Заливает черным цветом... А мне надо... "залить прозрачным цветом" =)

    AsmGuru62:

    Спасибо, именно благодаря твоему (Вашему? =) сообщению заработало =)

    ---------------

    Теперь о непонятке.... Т.е. оно работает, но для меня не совсем понятно =)

    Общая идея была такая: при инициализации программы создаем дочерние окна, создаем растры, создаем картинки... Так вот, моя ошибка была в том, что в последовательности CreateCompatibleDC - SelectObject (hMemDC, hBmpBackground) контекст не очищался. Почему так происходит - я так и не понял....

    В итоге я имею такую обработку WM_PAINT: cоздаем совместимый контекст, создаем картинку на основании растра, назначаем совместимому контексту нашу картинку, затем на этот контекст выводим текст, и копируем все это дело на контекст окна. И результат - именно тот, что мне нужен... Тока он мне непонятный =) Непонятно вот что: почему приходися каждый раз создавать картинку? Если вынести создание картинки в блок инициализации - то оно не работает, контекст не очищается... В принципе, "оно работает, да и бог с ним", но... если можно (а скорее всего, нужно) что-то поправить - буду рад выслушать.

    Еще раз всем спасибо =)
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    da-007
    Предупреждение за кросспостинг.
     
Статус темы:
Закрыта.