C# 另一个图片框顶部的透明图片框不工作。如何解决这个问题?
我想创建两个重叠的图片框。 第一个Picturebox用作背景,即屏幕的图片。 使用此方法: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,
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:你能给我一个我可以联系的电子邮件地址吗。我将发送我创建的源代码。也许这会更容易给出注释部分,为了使代码正常工作,应该对其进行改进。如果你能抽出一点宝贵的时间来看,我将不胜感激。