使用GDI +,如何在指定的坐标处绘制边框阴影或投影阴影?我并不想将阴影附加到任何东西上,我只需要从x40,0px到x140px,0px绘制阴影即可。我无法找到有关此的任何信息,并且我开始认为这是不可能的。
我的意图是在控件底部的某个位置绘制阴影,但我不希望它成为控件的整个宽度,这就是为什么我特别询问仅在指定位置绘制的原因。
这是一段代码,可以帮助您入门。
该drawShadow
方法沿绘制给定颜色和深度的阴影GraphicsPath
。
使用GraphicsPath
可以绘制比单纯形状更复杂的阴影Rectangles
。
阴影是用颜色矢量绘制的,该颜色从阴影逐渐变为背景颜色,并向右和向下移动。(您可以通过更改阴影矢量来改变方向。值大于1将需要较大的Pen宽度!(*))
为了演示该例程,我添加了一个getRectPath
函数,该函数GraphicsPath
从中创建一个,Rectangle
然后单击一个Button来调用绘图例程。
当然,在生产代码中,您必须将其附加到Paint
事件上!
void drawShadow(Graphics G, Color c, GraphicsPath GP, int d)
{
Color[] colors = getColorVector(c, this.BackColor, d).ToArray();
for (int i = 0; i < d; i++)
{
G.TranslateTransform(1f, 0.75f); // <== shadow vector!
using (Pen pen = new Pen(colors[i], 1.75f ) ) // <== pen width (*)
G.DrawPath(pen, GP);
}
G.ResetTransform();
}
List<Color> getColorVector(Color fc, Color bc, int depth)
{
List<Color> cv = new List<Color>();
float dRed = 1f * (bc.R - fc.R) / depth;
float dGreen = 1f * (bc.G - fc.G) / depth;
float dBlue = 1f * (bc.B - fc.B) / depth;
for (int d = 1; d <= depth; d++)
cv.Add(Color.FromArgb(255, (int) (fc.R + dRed * d),
(int) (fc.G + dGreen * d), (int) (fc.B + dBlue * d) ));
return cv;
}
GraphicsPath getRectPath(Rectangle R)
{
byte[] fm = new byte[3];
for (int b = 0; b < 3; b++) fm[b] = 1;
List<Point> points = new List<Point>();
points.Add(new Point(R.Left, R.Bottom));
points.Add(new Point(R.Right, R.Bottom));
points.Add(new Point(R.Right, R.Top));
return new GraphicsPath(points.ToArray(), fm);
}
private void button1_Click(object sender, EventArgs e)
{
using (Graphics G = this.CreateGraphics())
drawShadow(G, Color.Black, getRectPath(new Rectangle(111, 111, 222, 222)), 17);
}
编辑:我已经更改了解决方案,以允许复杂的阴影和任意阴影矢量,而不会因alpha通道的重叠而产生难看的伪影。假设背景具有统一的颜色!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句