gpt4 book ai didi

c# - PaintEvent 不过度绘制

转载 作者:行者123 更新时间:2023-12-02 05:25:38 24 4
gpt4 key购买 nike

我有一个用 C# 编写的 Windows 窗体应用程序,带有绘图面板和一个按钮 - 用于绘制一条线。

当您点击按钮时,您可以为 2 个随机点画一条线。

Pen p = new Pen(Color.Black, 5);
//point for start
Point ps = new Point();
//point for end
Point pe = new Point();

private void drawPanel_MouseDown(object sender, MouseEventArgs e)
{
ps.X = e.X;
ps.Y = e.Y;
pe = ps;
}

private void drawPanel_MouseMove(object sender, MouseEventArgs e)
{
// when button is clicked for drawing draw = true;
if (draw)
{
if (e.Button == MouseButtons.Left)
{
pe = new Point(e.X, e.Y);
}
}
}

private void drawPanel_MouseUp(object sender, MouseEventArgs e)
{
onMouseUpFlag = true;
}

private void drawPanel_Paint(object sender, PaintEventArgs e)
{
Graphics g = drawPanel.CreateGraphics();
if (onMouseUpFlag)
{
g.DrawLine(p, ps, pe);
g.Dispose();
}
}

程序有一些缺陷:

  • 当你画一条线时它会显示它,只有当主窗口被移动时某处(通常当我把它藏起来的时候)
  • 它只能绘制 1 条线。

关于如何修复这些错误有什么建议吗?

编辑

我已经阅读了您的答案并做了一些修改:

Pen p = new Pen(Color.Black, 5); 
Point ps = new Point();
Point pe = new Point();

List<Point> linesStart= new List<Point>();
List<Point> linesEnd= new List<Point>();

private void drawPanel_MouseDown(object sender, MouseEventArgs e)
{
ps.X = e.X;
ps.Y = e.Y;

linesStart.Add(ps);

pe = ps;
}

private void drawPanel_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
pe = new Point(e.X, e.Y);

//adding end point .. actually adds a lot of points
linesEnd.Add(pe);
}
}

bool onMouseUpFlag = false;

private void drawPanel_MouseUp(object sender, MouseEventArgs e)
{
onMouseUpFlag = true;
drawPanel.Invalidate();
}

private void drawPanel_Paint(object sender, PaintEventArgs e)
{
if (onMouseUpFlag)
{
for (int i = 0; i < linesStart.Count; i++)
{
e.Graphics.DrawLine(p, linesStart[i], linesEnd[i]);
}
}
}

现在我正在尝试修复多行的 DrawLine。 Paint 事件可以做多行,但只有起点是好的。不知何故终点不是很正确。在哪里可以准确设置 MouseMove 事件的最后一点?

最佳答案

您必须在面板上调用 Invalidate 方法:

private void drawPanel_MouseUp(object sender, MouseEventArgs e)
{
onMouseUpFlag = true;
drawPanel.Invalidate();
}

此外,使用来自 PaintEvent 的 Graphic 对象:

private void drawPanel_Paint(object sender, PaintEventArgs e)
{
if (onMouseUpFlag)
{
e.Graphics.DrawLine(p, ps, pe);
}
}

对于多条线,您必须将这些点保存在一个集合对象中。

根据您更新的代码,这是我认为您正在尝试做的工作示例:

private class Line {
public Point Starting { get; set; }
public Point Ending { get; set; }

public Line(Point starting, Point ending) {
this.Starting = starting;
this.Ending = ending;
}
}
List<Line> lines = new List<Line>();

private Point downPoint = Point.Empty;
private Point movePoint = Point.Empty;
private bool movingLine = false;

public Form1() {
InitializeComponent();

panel1.Paint += panel1_Paint;
panel1.MouseDown += panel1_MouseDown;
panel1.MouseMove += panel1_MouseMove;
panel1.MouseUp += panel1_MouseUp;
}

void panel1_MouseDown(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
downPoint = e.Location;
}
}

void panel1_MouseMove(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
movingLine = true;
movePoint = e.Location;
panel1.Invalidate();
}
}

void panel1_MouseUp(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
movingLine = false;
lines.Add(new Line(downPoint, e.Location));
panel1.Invalidate();
}
}

void panel1_Paint(object sender, PaintEventArgs e) {
e.Graphics.Clear(Color.White);
foreach (Line l in lines) {
e.Graphics.DrawLine(Pens.Black, l.Starting, l.Ending);
}

if (movingLine) {
e.Graphics.DrawLine(Pens.Black, downPoint, movePoint);
}

}

使用 inherited panel打开 DoubleBuffer 属性以避免闪烁。

关于c# - PaintEvent 不过度绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13129089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com