Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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#_Winforms_Image_Paint_Picturebox - Fatal编程技术网

C# 另一个图片框顶部的透明图片框不工作。如何解决这个问题?

C# 另一个图片框顶部的透明图片框不工作。如何解决这个问题?,c#,winforms,image,paint,picturebox,C#,Winforms,Image,Paint,Picturebox,我想创建两个重叠的图片框。 第一个Picturebox用作背景,即屏幕的图片。 使用此方法: public void BckShow() { Rectangle rect = Screen.GetBounds(this); gBackImg = Graphics.FromImage(bBackImg); gBackImg.CopyFromScreen(0,0,0,0, Screen.PrimaryScreen.Bounds.Size,

我想创建两个重叠的图片框。 第一个Picturebox用作背景,即屏幕的图片。 使用此方法:

public void BckShow()
{
     Rectangle rect = Screen.GetBounds(this);
     gBackImg = Graphics.FromImage(bBackImg);
     gBackImg.CopyFromScreen(0,0,0,0,
               Screen.PrimaryScreen.Bounds.Size,
               CopyPixelOperation.SourceCopy);
}
第二个picturebox位于第一个picturebox的上方,这是一个可以使用此鼠标事件绘制的透明图片框:

public void Draw(bool draw, Point sp, Point ep)
        {
            if (draw)
            {
                gCanvas.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                pen = new Pen(new SolidBrush(ColorName), BrushSize);
                if (toolPen.Checked)
                {
                    gCanvas.DrawLine(pen, sp, ep);
                }
                else if (toolEreser.Checked)
                {
                    Rectangle rect = new Rectangle(ep.X, ep.Y, BrushSize*5, BrushSize*5);
                    gCanvas.DrawEllipse(pen, rect);
                    gCanvas.FillEllipse(new SolidBrush(ColorName), rect);
                }
                bCanvas.MakeTransparent(Color.White);
                pbxCanvas.Refresh();
                dirty = true;
                toolSave.Enabled = true;
            }
        }

        private void pbxCanvas_MouseDown(object sender, MouseEventArgs e)
        {
            sp = e.Location;
            if (e.Button == MouseButtons.Left)
            {
                ActivePaint = true;
            }
        }

        private void pbxCanvas_MouseUp(object sender, MouseEventArgs e)
        {
            ActivePaint = false;
        }

        private void pbxCanvas_MouseMove(object sender, MouseEventArgs e)
        {
            ep = e.Location;
            Draw(ActivePaint, sp, ep);
            sp = ep;
        }
但是当我运行程序时,当鼠标事件被触发时,第二个PictureBox不会绘制任何内容。我怎样才能解决这个问题

我这样做是因为我只想将图像保存在第二个图片框中。与PrintScreen不同,它似乎在屏幕上做笔记,并将图像与屏幕图像分开保存

还有别的办法吗?与使用图片框以外的控件类似,或者可以直接使用屏幕作为背景,但仍可以将图像单独保存在透明的PictureBox中

这就是我想要实现的示例:

绘制时:

结果存储图像:

我希望你们都能帮我解决这个问题。对不起,解释得不好

有关详细信息,请参见“文档大纲”窗口:

刷新可能会使曲面透支。您应该跟踪要绘制的内容,然后在图片框的
Paint
事件中绘制。这样,你就会得到一个
图形
对象,每次刷新,你都在画画

当然,这是假设您首先拥有一个有效且正确的
Graphics
对象


顺便说一句:将表单作用域变量传递给
绘图
会让人困惑,只需使用它。

检查gCanvas初始值设定项,如果它是从Paint event(例如Graphics)中使用的,则调用Refresh()方法时更改将丢失。Refresh()会触发一个新的绘制事件,创建一个新的图形对象,从而使您的图形对象无效。 从PictureBox的图像创建一个新的图形对象,以永久保存更改

private List<Point> points = new List<Point>();

private void pbxCanvas_MouseDown(object sender, MouseEventArgs e) {
    if (e.Button == MouseButtons.Left) {
        ActivePaint = true;
    }
}

private void pbxCanvas_MouseUp(object sender, MouseEventArgs e) {
    ActivePaint = false;
    points.Clear();
}

private void pbxCanvas_MouseMove(object sender, MouseEventArgs e) {
    if (ActivePaint) {
        points.Add(e.Location);
        Refresh();
    }
}

private void pbxCanvas_Paint(object sender, PaintEventArgs e) {
    using (var graphics = Graphics.FromImage(pbxCanvas.Image)) {
        for (int i = 0; i < points.Count - 1; i++) {
            graphics.DrawLine(Pens.Black, points[i], points[i + 1]);
        }
    }
}
private List points=new List();
私有void pbxCanvas_MouseDown(对象发送方,MouseEventArgs e){
if(e.Button==MouseButtons.Left){
ActivePaint=true;
}
}
私有void pbxCanvas_MouseUp(对象发送方,MouseEventArgs e){
ActivePaint=false;
点。清除();
}
私有void pbxCanvas_MouseMove(对象发送方,MouseEventArgs e){
if(活性油漆){
添加点(如位置);
刷新();
}
}
私有void pbxCanvas_Paint(对象发送器,PaintEventArgs e){
使用(var graphics=graphics.FromImage(pbxCanvas.Image)){
对于(int i=0;i
但当我不使用透明的图片框并使用白色(非透明)背景时,使用上述方法进行绘图可以很好地工作。当然,我还必须消除此代码
bCanva.MakeTransparent(Color.White)
。使透明(颜色为白色)。那么我如何才能在一个透明的图片盒上画画呢?我今天尝试了这个解决方案,但似乎对我不起作用。顶部的透明图片框仍然不接收鼠标事件或绘制任何图像。如果你已经尝试过了,而且它对你有用吗?你会使用一种特殊的图片盒吗?我昨天在System.Windows.Forms.PictureBox上尝试了这段代码不,我只使用了一个常规的2重叠PictureBox。我想画的picturebox在上面,有一个透明的背景色属性。你能添加一个文档大纲窗口的截图吗。这显示了您的PictureBox在表单上的对齐方式。@woni:是的,您当然可以在上面看到它。如果您的PictureBox停靠在其父容器中,请尝试在左上角绘制并检查事件是否已触发。我怎么知道?当从左上角绘图时,我无法制作它接收鼠标事件的PictureBox。@woni:你能给我一个我可以联系的电子邮件地址吗。我将发送我创建的源代码。也许这会更容易给出注释部分,为了使代码正常工作,应该对其进行改进。如果你能抽出一点宝贵的时间来看,我将不胜感激。