Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GDI+ Нарисовать тень по пути, Как в Win7 вокруг окон 
V
    Опции темы
artsb
Дата 15.12.2011, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 5
Всего: 64



Всем привет!

Нарисовал скруглённый прямоугольник и тень вокруг него. Но, что-то мне не нравится эта тень smile
user posted image
Во-первых, какой-то косяк слева вверху: нет куска тени.
Во-вторых, она не равномерная: слева - бледная; сверху - слишком тёмная (как-будто два раза нарисована); справа и снизу - то что нужно.

Делаю так:
Код

       Gdiplus::Graphics gGraphics(this->Canvas->Handle);
       Gdiplus::GraphicsPath gpPath, gpPath2;
       Gdiplus::Color clrBlack(0, 0, 0),
                   clrInnerGlow(90, 255, 255, 255),
                   clrBackground(127, 40, 40, 40);
       Gdiplus::Pen pnPen(clrBlack , 1);
       Gdiplus::SolidBrush brshBackground(clrBackground);
     
       Gdiplus::Color clrColors[] = {
          Gdiplus::Color(0,   0, 0, 0),
          Gdiplus::Color(255, 0, 0, 0),
          Gdiplus::Color(255, 0, 0, 0)};
     
       float fPos[] = {0.0f, 0.1f, 1.0f};
     
       float X = 50.f, Y = 30.f;
       float radius = 9.5f, height = 200.f, width = 300.f;
       float _X = X - 8.f, _Y = Y - 8.f;
       float _radius = radius + 1.f, _height = height + 16.f, _width = width + 16.f;
     
       gpPath2.AddLine(_X + _radius, _Y, _X + _width - (_radius * 2.f), _Y);
       gpPath2.AddArc(_X + _width - (_radius * 2.f), _Y, _radius * 2.f, _radius * 2.f, 270.f, 90.f);
       gpPath2.AddLine(_X + _width, _Y + _radius, _X + _width, _Y + _height - (_radius * 2.f));
       gpPath2.AddArc(_X + _width - (_radius * 2.f), _Y + _height - (_radius * 2.f), _radius * 2.f, _radius * 2.f, 0.f, 90.f);
       gpPath2.AddLine(_X + _width - (_radius * 2.f), _Y + _height, _X + _radius, _Y + _height);
       gpPath2.AddArc(_X, _Y + _height - (_radius * 2.f), _radius * 2.f, _radius * 2.f, 90.f, 90.f);
       gpPath2.AddLine(_X, _Y + _height - (_radius * 2.f), _X, _Y + _radius);
       gpPath2.AddArc(_X, _Y, _radius * 2.f, _radius * 2.f, 180.f, 90.f);
       gpPath2.CloseFigure();
     
       gpPath.AddLine(X + radius, Y, X + width - (radius * 2.f), Y);
       gpPath.AddArc(X + width - (radius * 2.f), Y, radius * 2.f, radius * 2.f, 270.f, 90.f);
       gpPath.AddLine(X + width, Y + radius, X + width, Y + height - (radius * 2.f));
       gpPath.AddArc(X + width - (radius * 2.f), Y + height - (radius * 2.f), radius * 2.f, radius * 2.f, 0.f, 90.f);
       gpPath.AddLine(X + width - (radius * 2.f), Y + height, X + radius, Y + height);
       gpPath.AddArc(X, Y + height - (radius * 2.f), radius * 2.f, radius * 2.f, 90.f, 90.f);
       gpPath.AddLine(X, Y + height - (radius * 2.f), X, Y + radius);
       gpPath.AddArc(X, Y, radius * 2.f, radius * 2.f, 180.f, 90.f);
       gpPath.CloseFigure();
     
       gpPath2.AddPath(&gpPath, TRUE);
     
    // gGraphics.DrawPath(&pnPen, &gpPath2);
     
       gGraphics.FillPath(&brshBackground, &gpPath);
       gGraphics.DrawPath(&pnPen, &gpPath);
     
       Gdiplus::PathGradientBrush pgbGradientBrush(&gpPath2);
       pgbGradientBrush.SetWrapMode(Gdiplus::WrapModeClamp);
       pgbGradientBrush.SetInterpolationColors(clrColors, fPos, 3);
     
       gGraphics.FillPath(&pgbGradientBrush, &gpPath2);
     
       gpPath.Reset();
     
       X++;
       Y++;
       radius -= 1.5f;
       height -= 2.f;
       width -= 2.f;
     
       gpPath.AddLine(X + radius, Y, X + width - (radius * 2.f), Y);
       gpPath.AddArc(X + width - (radius * 2.f), Y, radius * 2.f, radius * 2.f, 270.f, 90.f);
       gpPath.AddLine(X + width, Y + radius, X + width, Y + height - (radius * 2.f));
       gpPath.AddArc(X + width - (radius * 2.f), Y + height - (radius * 2.f), radius * 2.f, radius * 2.f, 0.f, 90.f);
       gpPath.AddLine(X + width - (radius * 2.f), Y + height, X + radius, Y + height);
       gpPath.AddArc(X, Y + height - (radius * 2.f), radius * 2.f, radius * 2.f, 90.f, 90.f);
       gpPath.AddLine(X, Y + height - (radius * 2.f), X, Y + radius);
       gpPath.AddArc(X, Y, radius * 2.f, radius * 2.f, 180.f, 90.f);
       gpPath.CloseFigure();
     
       pnPen.SetColor(clrInnerGlow);
       gGraphics.DrawPath(&pnPen, &gpPath);

ИМХО, что-то не чисто с объединением путей. До этого ещё хуже всё отрисовывалось. Хотя если раскомментировать закомментированную строку, то линии рисуются правильно. А вот с заливкой этих путей кистью, что-то не так.

ЗЫ Может, кстати, подскажете другой способ нарисовать такую тень.
ЗЗЫ Ещё я не совсем разобрался с Interpolation Colors у PathGradientBrush (код тупо содрал из MSDN'а smile). Объясните если не сложно.

Спасибо!


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Dem_max
Дата 16.12.2011, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



нормальная тень


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
artsb
Дата 18.12.2011, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 5
Всего: 64



Цитата(Dem_max @  16.12.2011,  11:33 Найти цитируемый пост)
нормальная тень 

"нормально" - меня не устраивает smile
а вот так действительно лучше:
user posted image


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Dem_max
Дата 19.12.2011, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



выложи код, что то у тебя с радиусом тени не то, радиус тени явно не пропорционален радиусу кона.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0772 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.