Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/48: Рейтинг темы: голосов - 48, средняя оценка - 4.71
3 / 3 / 0
Регистрация: 22.02.2011
Сообщений: 15

Вывод текста на Aero Glass (dwmapi)

22.02.2011, 04:15. Показов 9854. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно вывести текст на стекле. Функция DrawThemeTextEx я так понял. Атрибуты страшны как ядерная война. Просто не имею опыта использования библиотек Windows. MSDN мне не слишком помог. Пожалуйста помогите разобраться с атрибутами.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.02.2011, 04:15
Ответы с готовыми решениями:

Glass-effect dwmapi. Кнопки.
Выручайте. При использовании модуля DMWAPI кнопки на форме (hwnd) не хотят нормально отображаться. Как исправить? library isAero; ...

[C#] Aero Glass
как реализовать эффект Aero Glass на C# WinForms пробовал вот так public static extern int DwmExtendFrameIntoClientArea( ...

Aero Glass - как выключить
Скачал какую-то сборку с включеным Aero Glass(размытие рамок окон), как увидел - сразу захотел выключить. Но незнаю как. У кого...

36
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.02.2011, 04:59
Вам - лекцию, или вы сами скажете, что не понятно ?
Если лекцию - то не сюда . Или вы еще ничего не делали, а хотите так, для общего развития ?
Добавление прозрачности в Vista к вашему приложению

Говорит Тим Снит, «евангелист» Windows Vista. Отходя от привычных мне рассказов о Windows Presentation Foundation , хочу написать ряд технических статей об использовании новых интерфейсных возможностей Windows Vista через управляемый код...

Начну, пожалуй, с инструкций по добавлению прозрачности к уже имеющимся приложениям.

Что я подразумеваю под добавлением прозрачности? Как известно, Windows Vista включает новую тему Aero. Один из ее аспектов – прозрачные границы окон, что реализуется посредством Desktop Window Manager. Есть и другие аспекты, которые придают объем окну – это тени от окон, эффекты при развертывании, сворачивании и закрытии окон, подсветка кнопок – это не просто 50% прозрачность на скорую руку в Photoshop.

На готовых к Vista машинах, каждое окно получает прозрачную границу (даже Командная строка в их числе!). Но некоторые приложения расширяют прозрачность на область функций; примером может служить WMP11, у которого прозрачность имеется на пространстве управления воспроизведения. Ваше приложение может также получить такую расширенную прозрачность.

Но это все не игрушки – большие объемы прозрачности требуют больше усилий системы на рендеринг, поэтому не используйте это как фон для вашего окна (хм, когда автор последний раз смотрел на окно добавления гаджетов в SideBar в 5308 / 5342? – прим. пер.). С другой стороны, это замечательная возможность сделать ваше приложение органичным с новой системой.

В этой первой части я расскажу, как добавлять прозрачность в приложения Windows Forms; в будущих статьях, расскажу о других частях, таких как прорисовку текста на прозрачности, использовании прозрачности в WPF-приложениях и применении эффекта размытия.

Единственный запрос API, который и производит всю нудную и грязную работу, следующий:
C++
1
2
3
4
5
[DllImport("dwmapi.dll")]
public static extern int DwmExtendFrameIntoClientArea(
   IntPtr hWnd,
   ref MARGINS pMarInset
);
Запрос имеет несколько параметров, основной это определение насколько DWM должен прорисовать прозрачность вокруг сторон окна:
C++
1
2
3
4
5
6
7
8
[StructLayout(LayoutKind.Sequential)]
public struct MARGINS
{
   public int cxLeftWidth;
   public int cxRightWidth;
   public int cyTopHeight;
   public int cyBottomHeight;
}
Одна из проблем использования glass-прозрачности, то, что с ней некорректно работает alpha-blending. Проблема в GDI, который не понимает alpha-blending. Немного лучше дело обстоит с GDI+. В ваших Windows Forms приложениях просто укажите TransparencyKey параметр для соответствующего цвета (я использовал цвет Gainsboro, почему, объясню позже). Затем вы можете создать несколько панелей прикрепленных к краям вашей формы и присвоить им цвет фона, присвоенный для TransparencyKey. Теперь, когда вы будете запрашивать DwmExtendFrameIntoClientArea, на фоне прозрачности будет отображаться все, что должно.

Вот пример использования API, о чем шла речь ранее:
C++
1
2
3
4
5
6
7
8
MARGINS margins = new MARGINS();
margins.cxLeftWidth = 0;
margins.cxRightWidth = 0;
margins.cyTopHeight = 45;
margins.cyBottomHeight = 0;
 
IntPtr hWnd = this.Handle;
int result = DwmExtendFrameIntoClientArea(hWnd, ref margins);
Итак, вы должны увидеть прозрачность в вашем приложении. Вы можете теперь перетащить туда кнопки, ярлыки или другие средства управления, и пока их фоновый цвет будет прозрачным, вы увидеть их интегрированными в вашу прозрачность. Вот пример такого приложения:



Есть только один неприятный нюанс, касающийся сглаживания текста, которое не работает хорошо. Так как используется прозрачный фоновый цвет, и вы выбрали этот цвет слишком ярким и броским, скажем Fuchsia, вы будете видеть небольшой некрасивый ореол вокруг теста. Но если вы выберите более подобающий прозрачности цвет (именно поэтому я выбрал Gainsboro) этот эффект почти неприметен.

Есть и более сложный путь удаления этого эффекта. Win32 проводит для этой ситуации практичный DrawThemeTextEx, который заставляет отображать текст правильно даже на прозрачности.

Но об этом, и многом другом, мы поговорим в следующей статье. А пока предлагаю вам скачать типично обсуждаемое нам приложение и его исходный код, для тестирования всего того, о чем говорилось выше.

Источник: http://blogs.msdn.com/
Миниатюры
Вывод текста на Aero Glass (dwmapi)  
0
3 / 3 / 0
Регистрация: 22.02.2011
Сообщений: 15
22.02.2011, 05:30  [ТС]
Эх, лекцию было бы замечательно =) Объясняю что конкретно непонятно.
C++
1
2
3
4
5
6
7
8
9
10
11
HRESULT DrawThemeTextEx(
  __in     HTHEME hTheme,
  __in     HDC hdc,
  __in     int iPartId,
  __in     int iStateId,
  __in     LPCWSTR pszText,
  __in     int iCharCount,
  __in     DWORD dwFlags,
  __inout  LPRECT pRect,
  __in     const DTTOPTS *pOptions
);
hTheme - понял так, что это собственно на каком объекте будет выведен текст, только для чего тогда hdc. Заношу в него результат выполнения OpenThemeData
C++
1
hTheme = OpenThemeData (Handle, L"Thople_main_form");
Если первый атрибут, предполагаю, есть указатель на окно (инициализация в билдере автоматом при создании формы наверно), второй понять не смог, чего только не передавал.

hdc - пишу
C++
1
hdc = GetDC (Handle);
iPartId - пишу ноль, ибо пока не разобрался, дефолтовые настройки меня устраивают. Я так понимаю это айди стиля.

iStateId - тоже пишу ноль. Тоже вроде настройки стиля.

pszText - Сам текст в Юникоде. Пишу L"Hello!".

iCharCount - Количество символов текста к выводу. Пишу -1, ибо справка говорит, что тогда вывдены будут все. (Хм, наверное атрибут используется для ограничения строк, и выхода за рамки предусмотренные дизайнером).

dwFlags - Пишу uFormat, в котором содержится:
C++
1
UINT uFormat = DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_NOPREFIX
. Так как подумал, что это настройки форматирования текста. Типа центрирование, переносов строки и прочего. Писать пробовал много чего.

pRect - тут вроде все понятно. Область вывода в локальных координатах окошка. Пишу:
C++
1
2
3
4
5
6
  tagRECT *rec;
  rec = new tagRECT ();
  rec->left=10;
  rec->right=100;
  rec->top=10;
  rec->bottom=30;
и передаю его функции.

pOptions - тут тоже должно быть все понятно. Параметры вывода, эффекты и прочее. Пишу:
C++
1
2
3
4
5
  DTTOPTS dttOpts;
  dttOpts.dwFlags = DTT_COMPOSITED | DTT_TEXTCOLOR | DTT_GLOWSIZE;
  dttOpts.dwSize = 20;
  dttOpts.crText = 1;
  dttOpts.iGlowSize = 10;
ну и передаю dttOpts функции.

Вот как-то так. Уверен, что ошибка глупая, просто сложно самому разобраться.

---

LK Спасибо за статью, сейчас прочитаю, надеюсь поможет.

Добавлено через 9 минут
Прочитал статью. Она о добавлении прозрачности окну. С этим я не испытываю трудностей. Окно у меня уже стеклянное. Проблема в выводе текста.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.02.2011, 06:31
ну, держи еще лекцию, здесь попонятней будет .
http://www.codeproject.com/KB/... Intro.aspx
и ты сразу кинулся текст рисовать, или сначала границы прозрачности указал , типа :
C++
1
2
3
4
5
6
7
8
9
10
// в OnCreate
MARGINS *margins = new MARGINS();
margins->cxLeftWidth = 0;
margins->cxRightWidth = 0;
// Add glass to the top of the frame.
margins->cyTopHeight = 145;
// Add glass to the bottom of the frame.
margins->cyBottomHeight = 100;
HWND hWnd = Form1->Handle;
int result = DwmExtendFrameIntoClientArea(hWnd, margins);
?

Ага, не дочитал ...
Как окно стеклянным делал ?

Добавлено через 6 минут
и я не понял , куда ты
Если первый атрибут, предполагаю, есть указатель на окно (инициализация в билдере автоматом при создании формы наверно), второй понять не смог, чего только не передавал.
и все остальное
hdc - пишу ...
пишеш ?
0
3 / 3 / 0
Регистрация: 22.02.2011
Сообщений: 15
22.02.2011, 06:45  [ТС]
Окно стеклянным делал через DwmExtendFrameIntoClientArea и DwmEnableBlurBehindWindow. Разве, что границы при объявлении указал
C++
1
MARGINS margins = {0,0,0,80};
То есть у меня окно с эффектом блюра в клиентской области и стеклянной рамкой.

и я не понял , куда ты
Если первый атрибут, предполагаю, есть указатель на окно (инициализация в билдере автоматом при создании формы наверно), второй понять не смог, чего только не передавал.
и все остальное
hdc - пишу ...
пишеш ?
C++
1
2
3
hdc = GetDC (Form1->Handle);
hTheme = OpenThemeData (Form1->Handle, L"Thople_main_form");
DrawThemeTextEx (hTheme, hdc, 0, 0, L"Hello!", -1, uFormat, rec, &dttOpts);
Плохо понимаю, что туда надо передать. =(

---

Читал эту статью раньше. Не смог вникнуть, не помогло. То переменная которая у автора встречается, но нигде не объявлена, на которую мой компилятор ругается (RAD Studio), то еще что нибудь. Вообщем всю ночь, часов семь подряд пытался вывести текст, перерыл в интернете все, что нашел, не вывел ни буквы. И решил здесь спросить. Можно конечно заменить альфа цвет (имею в виду цвет который в дальнейшем рендерится системой как стекло), но как-то посчитал, что это не по-людски.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.02.2011, 06:53
C++
1
Окно стеклянным делал через DwmExtendFrameIntoClientArea и DwmEnableBlurBehindWindow. Разве, что границы при объявлении указал
- побольше кода бы, что то непрозрачное оно ... и будем смотреть текст.
0
3 / 3 / 0
Регистрация: 22.02.2011
Сообщений: 15
22.02.2011, 07:10  [ТС]
Извиняюсь. ) Писал в OnPaint на всякий случай.
C++
1
2
3
4
5
6
7
8
9
  hople_main_form->Color = 0x000000;
  DWM_BLURBEHIND bb = {0};
  MARGINS margins = {0,0,0,80};
  bb.dwFlags = DWM_BB_ENABLE;
  bb.fEnable = true;
  bb.hRgnBlur = NULL;
  DwmExtendFrameIntoClientArea(Handle,&margins);
  DwmEnableBlurBehindWindow(Handle, &bb);
  main_panel->Color = 0;//У меня панелька на форме, для удобства работы
Миниатюры
Вывод текста на Aero Glass (dwmapi)  
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.02.2011, 07:27
дык, панелька тоже прозрачная, что не есть гуд

Добавлено через 5 минут
и прозрачной дожна быть только область снизу высотой 80, или я чего не понимаю?
0
3 / 3 / 0
Регистрация: 22.02.2011
Сообщений: 15
22.02.2011, 07:30  [ТС]
То есть нужно обойтись без нее? До этого ее не было, текст, аналогично не выводился, ну то есть я что-то не так делал.
Вот код которым я пытаюсь сделать вывод.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
HTHEME htheme = OpenThemeData(Handle,WindowText);
  UINT uFormat = DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_NOPREFIX;
  HDC hdc = GetDC (Handle);
  DTTOPTS dttOpts;
  tagRECT *rec;
  rec = new tagRECT ();
  rec->left=10;
  rec->right=100;
  rec->top=10;
  rec->bottom=30;
  dttOpts.dwFlags = DTT_COMPOSITED | DTT_TEXTCOLOR | DTT_GLOWSIZE;
  dttOpts.dwSize = 20;
  dttOpts.crText = 1;
  dttOpts.iGlowSize = 10;
  DrawThemeTextEx (hTheme, hdc, 0, 0, L"Hello!", -1, uFormat, rec, &dttOpts);
Код очень сумбурный так как переписан урывками по несколько раз, в попытках найти истину. ) Повешен так же на OnPaint.

---

DwmExtendFrameIntoClientArea - Как бы растягивает рамку снизу на 80. "Как-бы" потому-что система "растянутую" рамку считает клиентской областью, а рамку рисует при рендере.

DwmEnableBlurBehindWindow - Вешает эффект размытая на клиентскую область, "блеска стекла" там нет.

Все окно задумывалось прозрачным, сверху на панельку накладываются Image в которые грузятся png.
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.02.2011, 07:37
я просто кинул на форму Label красного цвета с размером 18 - она прекрасно видна без всяких телодвижений, только имеет ту же прозрасность, что и форма , в чем и проблема

Добавлено через 3 минуты
HTHEME htheme
...
DrawThemeTextEx (hTheme,
так должно быть ?
0
3 / 3 / 0
Регистрация: 22.02.2011
Сообщений: 15
22.02.2011, 07:50  [ТС]
Да, чем темнее, тем выше прозрачность. Так как стандартные контролсы DWM'ом не рендеряться, поэтому надо использовать его-же для вывода текста. Далеко не факт что так оно и есть, но я так понял. =)

так должно быть ?
Атат Нет конечно. =) Накидывал код в попытках разобраться отовсюду, и пропустил. Странно но компилятор не ругался на undifined symbol. Может в библиотеках переменная такая-же объявленна? Исправил на совсем другое имя (heme), но это не есть причина ошибки.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.02.2011, 08:15
Ну, пока то, что сделано, достигается просто установкой Form->AlphaBlend = true;
0
0 / 0 / 0
Регистрация: 28.10.2007
Сообщений: 18
22.02.2011, 08:21
......
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.02.2011, 08:29
4renG8, тут дело не в выводе текста - сделал для эксперимента
C++
1
bb.hRgnBlur = CreateRectRgn(100, 100, 100, 100); // NULL;
- реакции ноль.
0
3 / 3 / 0
Регистрация: 22.02.2011
Сообщений: 15
22.02.2011, 08:36  [ТС]
Почему то это меня не радует. =) Мне все-ровно придется разбираться, надо завершить начатое. AlphaBlend это все-таки не то, он ведь не дает бликов, теней, бокс-блюра и прочих вкусностей, и заставлять его работать от цветовой схемы установленной пользователем в системе, дело неблагодарное. Так что все-таки, подобного результата этим к сожалению не добиться. Он ведь в WINapi, который не рассчитан на подобные вещи.
В общем нужно разобраться что конкретно передать первыми двумя аргументами, они непонятны больше всего. Хотя что-то подсказывает, что hdc задан мной верно.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.02.2011, 08:39
аргументами где ? здесь DrawThemeTextEx (hTheme, hdc, 0, 0, L"Hello!", -1, uFormat, rec, &dttOpts); ? ты учитывай, что уже утро
1
3 / 3 / 0
Регистрация: 22.02.2011
Сообщений: 15
22.02.2011, 08:49  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
4renG8, тут дело не в выводе текста - сделал для эксперимента
C++
1
bb.hRgnBlur = CreateRectRgn(100, 100, 100, 100); // NULL;
- реакции ноль.
Попробую покавырять, может чего получиться. Этот параметр отвечает за регион для эффекта размытия. Там надо указать верхнюю левую точку, и правую нижнюю прямоугольника для размытия. Они не могут совпадать. Задал CreateRectRgn(0, 0, 100, 100), все ровно NULL. Наверно нужно сначала инициализировать HRGN.

Добавлено через 2 минуты
Да я тоже всю ночь не спал. =)
аргументами где ? здесь DrawThemeTextEx (hTheme, hdc, 0, 0, L"Hello!", -1, uFormat, rec, &dttOpts); ?
Да именно здесь. )
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.02.2011, 09:07
Да именно здесь. )
пока вродь все правильно, но ...

Добавлено через 6 минут
я подозреваю, что он просто делается прозрачным , вот этого простого
C++
1
Canvas->TextOut(10, 10, "Text");
- тоже нет
0
3 / 3 / 0
Регистрация: 22.02.2011
Сообщений: 15
22.02.2011, 09:11  [ТС]
Меня смущает то, что в одну функцию передается один и тот же Handle два раза. Один раз в hTheme, второй раз в hdc. Это как минимум странно. Во вторых я не могу понять, когда я пишу:
C++
1
hTheme = OpenThemeData (Handle, L"Thople_main_form");
я не знаю что точно должно быть на месте L"Thople_main_form". Пробовал
C++
1
L"hople_main_form"
и
C++
1
WindowText
. В MSDN написано что-то непонятное, я к сожалению не настолько владею английским чтобы уловить суть.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.02.2011, 09:14
посмотри здесь http://www.vistax64.com/aero/2... x-net.html и обрати внимание на Memdc

Добавлено через 56 секунд
В MSDN написано что-то непонятное, я к сожалению не настолько владею английским чтобы уловить суть.
- где именно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.02.2011, 09:14
Помогаю со студенческими работами здесь

Как правильно отрисовывать TextBox при использовании Aero Glass
Научился правильно "рисовать" лейбл -> Но когда на форму с Aero Glass кладу текст-бокс, выходит это -> Как сделать нормальный...

Свойство StartPosition при использовании Aero Glass работает не всегда
Есть форма, на которой используется Aero Glass. В свойстве StartPosition установлен CenterScreen, но иногда он не работает. вот скрин: ...

Подсветка текста на стекле Aero, как в заголовке
сабж заранее спасибо

Как исправить искажение текста на форме со стилем Aero
Нужен совет, как можно решить проблему с отображением контура текста и изображееий на форме, если к ней применитт стиль Aero (Win7) и...

Dwmapi.dll
Приветствую всех. Столкнулся с проблемой в виде файла dwmapi.dll. Браузеры не запускаются, большинство приложений и антивирусы тоже не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Функция установки текстового статуса в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru