你好 stackoverflow 社区。我已经尝试寻找类似的问题,但我只发现了关于闪烁的问题,这与我遇到的问题不同。
PictureBox
每当我在面板上移动它们时,我都需要帮助防止es 拖尾。我正在制作的应用程序类似于 MS Paint。当我单击 a 时,PictureBox
我可以使用以下命令单击并拖动它:
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
x = e.X;
y = e.Y;
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
pictureBox1.Left += (e.X - x);
pictureBox1.Top += (e.Y - y);
}
}
并且我没有单击的其他图片框被绘制到 DoubleBuffered 面板,使用:
private void panel1_Paint(object sender, PaintEventArgs e)
{
foreach (PictureBox pb in pboxes)
{
if (!pb.Visible)
{
e.Graphics.DrawImage(pb.BackgroundImage, new Rectangle(pb.Location, pb.Size));
}
}
}
出于某种原因,当我拖动PictureBox
它的背景图像时,它会拖过绘制的面板。
奇怪的是,这只发生在 Paint 事件上。如果我要制作面板的背景图像,则移动PictureBox
不会拖尾。只有当我Image
在面板上绘制 s 时才会发生这种情况。
这是一个例子
我将不胜感激任何帮助,谢谢。
我简化了代码,这样更容易理解。(拖尾效应仍然存在)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
int x;
int y;
public Form1()
{
InitializeComponent();
pictureBox1.Show();
pictureBox2.Hide();
pictureBox3.Hide();
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
x = e.X;
y = e.Y;
panel1.Invalidate();
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
pictureBox1.Left += (e.X - x);
pictureBox1.Top += (e.Y - y);
}
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawImage(pictureBox2.BackgroundImage, new Rectangle(pictureBox2.Location, pictureBox2.Size));
e.Graphics.DrawImage(pictureBox3.BackgroundImage, new Rectangle(pictureBox3.Location, pictureBox3.Size));
}
}}
它使用这个 doubleBuffered 面板类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public class DoubleBufferPanel : Panel
{
public DoubleBufferPanel()
{
// Set the value of the double-buffering style bits to true.
this.DoubleBuffered = true;
this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint, true);
this.UpdateStyles();
}
}
}
现在我的代码需要 3PictureBox
和 1DoubleBuffered
面板。
表格被最大化,Panel1.size = (2000, 1200);
并且PictureBox
size = (700, 700)
将每个PictureBox
es背景图像设置为随机的大细节图像。当我移动时会出现拖尾效应,pictureBox1
我每次都可以重现。