Всем привет!
Нарисовал скруглённый прямоугольник и тень вокруг него. Но, что-то мне не нравится эта тень 
 Во-первых, какой-то косяк слева вверху: нет куска тени. Во-вторых, она не равномерная: слева - бледная; сверху - слишком тёмная (как-будто два раза нарисована); справа и снизу - то что нужно.
Делаю так:
Код | 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'а ). Объясните если не сложно.
Спасибо! |