Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在窗体上的任何位置绘制阴影?_C#_.net_Winforms_Drawing_Gdi+ - Fatal编程技术网

C# 如何在窗体上的任何位置绘制阴影?

C# 如何在窗体上的任何位置绘制阴影?,c#,.net,winforms,drawing,gdi+,C#,.net,Winforms,Drawing,Gdi+,使用GDI+,如何在指定坐标处绘制边框阴影或放置阴影?我不想把阴影附加到任何东西上,我只需要画一个从x40,0px到x140px,0px的阴影。我还没有找到任何关于这方面的信息,我开始认为这是不可能的 我的意图是在控件底部的某个位置绘制阴影,但我不希望它是控件的整个宽度,这就是为什么我特别要求只在指定位置绘制阴影的原因。下面是一段代码,可以帮助您开始 drawShadow方法沿GraphicsPath绘制给定颜色和深度的阴影 使用GraphicsPath可以绘制比单纯的矩形更复杂形状的阴影 阴影

使用GDI+,如何在指定坐标处绘制边框阴影或放置阴影?我不想把阴影附加到任何东西上,我只需要画一个从x40,0px到x140px,0px的阴影。我还没有找到任何关于这方面的信息,我开始认为这是不可能的


我的意图是在控件底部的某个位置绘制阴影,但我不希望它是控件的整个宽度,这就是为什么我特别要求只在指定位置绘制阴影的原因。

下面是一段代码,可以帮助您开始

drawShadow
方法沿
GraphicsPath
绘制给定颜色和深度的阴影

使用
GraphicsPath
可以绘制比单纯的
矩形更复杂形状的阴影

阴影是用颜色向量绘制的,颜色向量从阴影逐渐变为背景色,并向右和向下移动。(您可以通过更改阴影向量来更改方向。大于1的值将需要更大的笔宽!(*))

为了演示该例程,我添加了一个
getRectPath
函数,该函数从
矩形创建一个
GraphicsPath
,并单击一个按钮调用绘图例程

当然,在生产代码中,您必须将其附加到
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);
}
void drawShadow(图形G、颜色c、图形SPATH GP、int d)
{
Color[]colors=getColorVector(c,this.BackColor,d).ToArray();
对于(int i=0;iG.TranslateTransform(1f,0.75f);//这里有一段代码可以帮助您开始

drawShadow
方法沿
GraphicsPath
绘制给定颜色和深度的阴影

使用
GraphicsPath
可以绘制比单纯的
矩形更复杂形状的阴影

阴影是用颜色向量绘制的,颜色向量从阴影逐渐变为背景色,并向右和向下移动。(您可以通过更改阴影向量来更改方向。值大于1将需要更大的笔宽!(*))

为了演示该例程,我添加了一个
getRectPath
函数,该函数从
矩形创建一个
GraphicsPath
,并单击一个按钮调用绘图例程

当然,在生产代码中,您必须将其附加到
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);
}
void drawShadow(图形G、颜色c、图形SPATH GP、int d)
{
Color[]colors=getColorVector(c,this.BackColor,d).ToArray();
对于(int i=0;iG.平移变换(1f,0.75f);//我很想知道为什么你希望在winform上出现一个看起来“随机”的阴影?你想达到什么效果?完全控制阴影的绘制位置。我能找到的唯一解决方案是从控件的左下角一直到右下角绘制阴影。我需要更多地控制阴影的绘制位置重新定义阴影的起点和终点。现有解决方案“解决了不同的问题”不允许对阴影的起点和终点进行任何进一步的控制。您现在如何绘制阴影以及阴影有什么问题?阴影不是需要控制的东西。您想为阴影设置动画还是什么?在图形中,放置阴影的成本很高。因此大多数解决方案都针对实时操作进行了优化(假阴影)。用物理的话来说,你也不能直接控制阴影,你可以控制物体、灯光、距离等,阴影是基于这些产生的。你对阴影的定义有点混淆:从x40,0px到x140px,0px的阴影。是谁投下的?你能创建一个草图或屏幕截图来直观地描述问题吗?创建一个t的png图像他画了一个阴影,然后在你想画的地方画了一部分。我想知道为什么你想在你的winform上画一个看起来“随机”的阴影?你想达到什么效果?完全控制阴影的绘制位置。我能找到的唯一解决方案是从左下角一直画到右下角控制。我需要更多地控制阴影的开始和结束。现有的解决方案“解决了不同的问题”不允许对阴影的起点和终点进行任何进一步的控制。您现在如何绘制阴影以及阴影有什么问题?阴影不是需要控制的东西。您想为阴影设置动画还是什么?在图形中,放置阴影的成本很高。因此大多数解决方案都针对实时操作进行了优化(假阴影)。用物理的话来说,你也不能直接控制阴影,你可以控制物体、灯光、距离等,阴影是基于这些产生的。你对阴影的定义有点混淆:从x40,0px到x140px,0px的阴影。是谁投下的?你能创建一个草图或屏幕截图来直观地描述问题吗?创建一个t的png图像他画出阴影,然后在你想要的地方画出这幅图的一部分