вывод текста в прозрачном окне.
От: lord_206  
Дата: 08.11.05 13:20
Оценка:
Создал прозрачное окно pFrame->CreateEx(WS_EX_LAYERED,...) , m_pSetLayeredWindowAttributes(m_hWndLayer, 0, (255 / 150) * 100, LWA_ALPHA). Нужно вывести текст, но он не должен быть прозрачным . Вроде все попробывал и везде поискал даже примеры юзал. Вот моя последняя попытка: Подскажите где собачка зарыта
CPaintDC dc(this); 
  
   CRect client_rect; 
   GetClientRect(client_rect); 


   CString szText; 
   GetWindowText(szText); 


   CFont *pFont, *pOldFont; 
   pFont = GetFont(); 
   pOldFont = dc.SelectObject(pFont); 


#define MAP_STYLE(src, dest) if(dwStyle & (src)) dwText |= (dest) 
#define NMAP_STYLE(src, dest) if(!(dwStyle & (src))) dwText |= (dest) 

   DWORD dwStyle = GetStyle(), dwText = 0; 

   MAP_STYLE(   SS_RIGHT,         DT_RIGHT               ); 
   MAP_STYLE(   SS_CENTER,         DT_CENTER               ); 
   MAP_STYLE(   SS_CENTERIMAGE,      DT_VCENTER | DT_SINGLELINE   ); 
   MAP_STYLE(   SS_NOPREFIX,      DT_NOPREFIX               ); 
   MAP_STYLE(   SS_WORDELLIPSIS,   DT_WORD_ELLIPSIS         ); 
   MAP_STYLE(   SS_ENDELLIPSIS,      DT_END_ELLIPSIS            ); 
   MAP_STYLE(   SS_PATHELLIPSIS,   DT_PATH_ELLIPSIS         ); 

   NMAP_STYLE(   SS_LEFTNOWORDWRAP | 
            SS_CENTERIMAGE | 
            SS_WORDELLIPSIS | 
            SS_ENDELLIPSIS | 
            SS_PATHELLIPSIS,   DT_WORDBREAK            ); 


     dc.SetBkMode(TRANSPARENT); 

    dc.SetTextColor(crRed);

   dc.DrawText(szText, client_rect, dwText); 

   dc.SelectObject(pOldFont);

Поправлено форматирование: пользуйтесь тэгами [ccode] или [c]. — Кодт
08.11.05 16:47: Перенесено из 'C/C++'
Re: вывод текста в прозрачном окне.
От: Кодт Россия  
Дата: 08.11.05 14:14
Оценка:
Здравствуйте, lord_206, Вы писали:

Небольшой оффтопичный комментарий:
_>#define MAP_STYLE(src, dest) if(dwStyle & (src)) dwText |= (dest) 
_>#define NMAP_STYLE(src, dest) if(!(dwStyle & (src))) dwText |= (dest)

Такой код таит в себе опасность.
if(something)
  MAP_STYLE(x,y);
else // этот else будет относиться к if внутри макроса
  MAP_STYLE(z,t);

Простое заворачивание в фигурные скобки — тоже не выход: ';' после макроса окажется лишней (и может сыграть злую шутку)
#define MAP_STYLE(x,y) {.....}

if(something)
  MAP_STYLE(x,y); // ';' закрывает вcю конструкцию if...
else // error: 'else' without 'if'
  .....


Есть несколько выходов из положения:
// 1) сделать ветвление выражением, а не стейтментом
#define IF(cond,onTrue) ( (cond) ? (void)(onTrue) : (void)0 )
// 2) перетащить условие в ветку else
#define IF(cond,onTrue) if(!(cond)) {} else onTrue
// 3) завернуть конструкцию в do-while (правда, в onTrue)
#define IF(cond,onTrue) do{ if(cond) onTrue; }while(false)
Перекуём баги на фичи!
Re[2]: вывод текста в прозрачном окне.
От: lord_206  
Дата: 08.11.05 16:37
Оценка:
За комментарий спасибо но текст все равно прозрачный
Re[3]: вывод текста в прозрачном окне.
От: Андрей Россия  
Дата: 09.11.05 11:24
Оценка:
Здравствуйте, lord_206, Вы писали:

_>За комментарий спасибо но текст все равно прозрачный


Так ты сам пишешь:
  dc.SetBkMode(TRANSPARENT);

попробуй написать:
  dc.SetBkMode(OPAQUE);


Re[4]: вывод текста в прозрачном окне.
От: lord_206  
Дата: 10.11.05 06:54
Оценка:
Здравствуйте, Андрей, Вы писали:

А>Здравствуйте, lord_206, Вы писали:


_>>За комментарий спасибо но текст все равно прозрачный


А>Так ты сам пишешь:

А>
А>  dc.SetBkMode(TRANSPARENT);
А>

А>попробуй написать:
А>
А>  dc.SetBkMode(OPAQUE);
А>


А>



все равно не сработало
Re[5]: вывод текста в прозрачном окне.
От: Андрей Россия  
Дата: 10.11.05 07:04
Оценка:
Здравствуйте, lord_206, Вы писали:

skip

_>все равно не сработало


Тогда
Re[4]: вывод текста в прозрачном окне.
От: Кодт Россия  
Дата: 10.11.05 09:48
Оценка:
Здравствуйте, Андрей, Вы писали:

А>Так ты сам пишешь:

А>  dc.SetBkMode(TRANSPARENT);

А>попробуй написать:
А>  dc.SetBkMode(OPAQUE);

Это относится лишь к тому, заливать фоновым цветом прямоугольник, в который выводится текст, или не заливать.

Рисование в "слоистом" окне автоматически будет учитывать альфа-канал — поэтому в том виде, как сделано сейчас, задача неразрешима.

Выход может быть в том, чтобы создать два окна, одно над другим. Нижнее окно полупрозрачное (WS_EX_LAYERED и т.д.), верхнее — прозрачное (WS_EX_TRANSPARENT) и рисует только текст — но уже без альфа-канала. Важно отключить в верхнем окне заливку фона (обработка WM_ERASEBKGND).
И разумеется, эти окна должны быть не родитель-ребёнок, а два независимых ребёнка, скажем, одного чисто прозрачного родитеhf — т.к. альфа-канал родителя распространяется на ребёнка.

Ещё один выход (довольно злодейский) состоит в прямом рисовании на экранный контекст.
Злодейский — потому, что не учитывает отсечки (и текст нарисуется поверх всех других окон). Впрочем, регион отсечки можно как-то выцарапать из контекста рисования...
Перекуём баги на фичи!
Re[5]: вывод текста в прозрачном окне.
От: lord_206  
Дата: 10.11.05 19:13
Оценка:
Может приведеты основные вырезки из работающего кода, я тогда сам посмотрю или перепишу прогу
Re[5]: вывод текста в прозрачном окне.
От: Pavel Dvorkin Россия  
Дата: 11.11.05 08:30
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Ещё один выход (довольно злодейский) состоит в прямом рисовании на экранный контекст.

К>Злодейский — потому, что не учитывает отсечки (и текст нарисуется поверх всех других окон). Впрочем, регион отсечки можно как-то выцарапать из контекста рисования...

Если шрифт текста не растровый, то можно вывести текст в path, а потом PathToRegion
With best regards
Pavel Dvorkin
Re[6]: вывод текста в прозрачном окне.
От: lord_206  
Дата: 11.11.05 09:28
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Кодт, Вы писали:


К>>Ещё один выход (довольно злодейский) состоит в прямом рисовании на экранный контекст.

К>>Злодейский — потому, что не учитывает отсечки (и текст нарисуется поверх всех других окон). Впрочем, регион отсечки можно как-то выцарапать из контекста рисования...

PD>Если шрифт текста не растровый, то можно вывести текст в path, а потом PathToRegion



А можно пример рабочий или кусочек из него
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.