我想创建两个重叠的图片框。 第一个 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中。
这是我要实现的例子:
绘图时:
结果存储图片:
希望大家帮我解决这个问题。抱歉解释不当。
此文档大纲窗口可获取更多详细信息:
最佳答案
很可能你的表面被刷新 overdraw 了。您应该跟踪要绘制的内容,然后在图片框的 Paint
事件中绘制它。这样,您将获得一个 Graphics
对象,并且每次刷新时,您都在绘制。
当然,这是假设您首先拥有一个有效且正确的 Graphics
对象。
顺便说一句:将表单范围变量传递给 Draw
会造成混淆,只需使用它即可。
关于c# - 另一个图片框上方的透明图片框不起作用。如何解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22154524/