PaintEvent 不过度绘制

2023-12-02

我有一个 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 条线。

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

EDIT

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

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);
  }

}

Use an 继承面板打开 DoubleBuffer 属性以避免闪烁。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PaintEvent 不过度绘制 的相关文章

随机推荐

  • 如何在 Inno Setup 中编辑和检索 JSON 文件的子部分的值

    我正在创建一个安装程序 我需要编辑和检索 JSON 文件中的值 要检索并编辑值Section 2工作正常 问题是编辑和检索子部分的值Section 1 下面我们可以看到一个例子 Section 1 children 1 children 1
  • 直接设置字典元组值

    是否可以做类似的事情 dictTupleTest key Item1 toggle 在以下情况下 Dictionary
  • 如何在空手道中为 json 数组设置动态值

    我有一个 json 文件 每个 post 请求都需要 uniq 值 uniqId 55555 对于所有 uniq id 我需要传递相同的 uniqId 到目前为止 我只能设置 endtoEndid 无法设置invoiceNum 和txnVa
  • JobIntentService 的 onHandleWork() 的最大作业执行时间是多少?

    我遇到了一个SecurityException在 Android 8 上崩溃targetSDK 26使用时JobIntentService 这是来自 JobIntentService 文档 那么最大作业执行时间限制是多少 如果超过它 是否可
  • 测试使用 PersistentEntityResourceAssembler 的自定义 RepositoryRestController

    我有一个RepositoryRestController公开一些持久性实体的资源 我的控制器上有一个方法 需要PersistentEntityResourceAssembler帮助我自动生成资源 RepositoryRestControll
  • 使用块将数据传递回视图控制器

    我在看这个问题 答案之一展示了如何使用块向后传递数据查看prepareForSegue方法 我的理解是这种方法确实应该用于向前传递数据 而不是向后传递数据 我想尝试为此目的进行阻止 将数据传递回另一个 viewController 我的问题
  • 在Python中的文件末尾声明函数[重复]

    这个问题在这里已经有答案了 是否可以在不完全定义函数的情况下调用该函数 当尝试这样做时 我收到错误 函数名未定义 我有 C 背景 所以这个问题困扰着我 在工作之前声明该函数 def Kerma return energy mass prin
  • 如何启用 Core Plot 饼图中的某个部分的触摸选择?

    我正在使用 Core Plot 框架来绘制饼图 并且在绘制饼图本身时没有任何问题 但是 我需要饼图本质上是交互式的 即 如果我点击饼图中的任何特定部分 它应该触发导航到显示该特定部分的详细信息的页面 我尝试使用该方法 void pieCha
  • Android 在应用程序中集成 google+

    任何人都可以在 Android 应用程序中使用 Google 吗 我搜索了同样的事情 但什么也没找到 如果有人有任何想法或相关代码 请在此发布 Thanks 目前还没有公共 API 但您可以在此处注册更新 https services go
  • 如何将行追加到 R 数据框

    我查看了 StackOverflow 但找不到特定于我的问题的解决方案 该解决方案涉及将行附加到 R 数据框 我正在初始化一个空的 2 列数据框 如下所示 df data frame x numeric y character 然后 我的目
  • 浮点固定长度数字格式化c#

    我想在 C 中按如下方式格式化浮点数 以便 C 中浮点数的整个宽度是固定长度 python 等效格式说明符 6 2f 我不希望它在左侧填充 0 但是用空白填充 100 00 90 45 7 23 0 00 到目前为止我已经尝试过什么 str
  • 如何使用 Firemonkey 显示 Android 内存中的可用文件

    在 Delphi for Windows 中 有TOpenDialog和命令如FindFirst 在 Firemonky Android 中没有 TOpenDialog but according to many forumsFindFir
  • 从回调和内联自调用函数访问父函数变量

    我相信乍一看这两个自调用函数是相同的 它们之间的唯一区别是在第一个函数中我传递回调函数 然后通过参数对象执行 而在第二个函数中通过使函数自调用来做同样的事情 现在来访问第一个示例中的父变量 名称是 undefined 而在第二个示例中 它是
  • Java WeakHashMap什么时候会清理null key?

    在下面的代码中nameRef get 为 null 之后name null and System gc import java lang ref WeakReference public class Main public static v
  • 内部服务器错误 - Azure 应用服务自定义控制器

    我有一个 Azure 移动应用服务 不是旧的移动服务 带有多个自定义控制器 并且流程运行完美 今天发生了一个错误 关于Internal Server Error 我附加了调试器并逐步执行代码 控制器到达末尾没有任何错误并返回Ok 因此我一直
  • 样式占位符文本的颜色在 Firefox 中被静音

    我已经使用相关供应商前缀更改了占位符的颜色 并且它在其他浏览器中正确显示 但由于某种原因 Firefox 使颜色稍微静音 moz placeholder input moz placeholder color Black 我都用过 moz
  • Selenium VBA - 退出子进程而不关闭浏览器窗口

    如何在不关闭浏览器窗口的情况下退出子 宏 代码完成后 Chrome 浏览器会自动关闭 例如我有 Sub test Dim driver As New ChromeDriver driver Get http www google com E
  • 有没有办法让使用服务器发送的事件持久化?

    我需要运行一个每秒更新一次用户浏览器的脚本 我的需要是从服务器到客户端的单向通信 为此 我实施了服务器发送的事件从我的服务器轮询到用户的客户端 问题是允许用户 通过打开多个浏览器选项卡 打开与服务器的多个连接 这是一个问题 因为它增加了服务
  • 如何在 Xcode 8 中使用 CoreData?

    我正在尝试使用 CoreData 但是当我将其添加到我的项目中时 我只得到两种新方法 NSPersistentContainer persistentContainer and void saveContext 现在我无法使用旧方法Core
  • PaintEvent 不过度绘制

    我有一个 C 语言的 Windows 窗体应用程序 带有绘图面板和一个用于绘制线条的按钮 单击该按钮时 可以为 2 个随机点绘制一条线 Pen p new Pen Color Black 5 point for start Point ps