c# - 另一个图片框上方的透明图片框不起作用。如何解决这个问题?

标签 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,
               CopyPixelOperation.SourceCopy);
}

第二个图片框在第一个图片框上方,是一个可以使用此鼠标事件绘制的透明图片框:

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中。

这是我要实现的例子:

绘图时: enter image description here

结果存储图片:

enter image description here

希望大家帮我解决这个问题。抱歉解释不当。

此文档大纲窗口可获取更多详细信息: enter image description here

最佳答案

很可能你的表面被刷新 overdraw 了。您应该跟踪要绘制的内容,然后在图片框的 Paint 事件中绘制它。这样,您将获得一个 Graphics 对象,并且每次刷新时,您都在绘制。

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

顺便说一句:将表单范围变量传递给 Draw 会造成混淆,只需使用它即可。

关于c# - 另一个图片框上方的透明图片框不起作用。如何解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22154524/

相关文章:

c# - 如何以高效的方式从 RenderTargetBitmap 创建媒体剪辑?

c# - 不能在 Dapper 查询中使用自定义类型作为参数插入 SQLite 数据库

c# - ASP.net 页面中的“System.Threading.ThreadAbortException”

c# - 检索任何窗口的所有控件及其类型和值

javascript - 将图像数据设置到输入文件标签中

c# - OData v4 自定义函数

c# - MessageBox.Show 会导致跨线程异常吗?

c# - 如何在C#中截取滚动窗口的屏幕截图

ios - 在 xcassets 中使用组加载图像数组

css - 警告 404 - GET/detectfiles/sc/skins/standard/images/blank.gif