如何从另一个事件/类中为整个面板调用无效

用户

我有一个绘画事件,看起来像这样:

private void panel1_Paint(object sender, PaintEventArgs e)
{
    Rectangle rec = new Rectangle(2, 2, 820, 620);
    Pen pi = new Pen(Color.Black, 2);
    e.Graphics.DrawRectangle(pi, rec);

    Rectangle rec2 = new Rectangle(Convert.ToInt32((410 + 2500 * GlobaleVariablen.IstWerte[0])), Convert.ToInt32(310 + 1875 * GlobaleVariablen.IstWerte[1]), 2, 2);
    e.Graphics.DrawRectangle(pi,rec2);
}

我有一个来自串行端口的数据流,每次接收数据时,我都想使rec2无效,而不是使整个表格无效。我能够通过以下方式在Datareceived事件中使整个表单无效:

panel1.Invalidate();

但是我不知道如何才能使我的rec2无效,因为如果您始终使用数据流使整个表单无效,那么它会像疯了似的闪烁,而且看起来确实不是很好。

阿德里亚诺·雷佩蒂(Adriano Repetti)

Invalidate()具有Rectangle您要使其无效的重载版本

panel1.Invalidate(GetRect2());

其中GetRect2()(请选择一个更好的名称)是这样的:

static Rectangle GetRect2() {
    int x Convert.ToInt32((410 + 2500 * GlobaleVariablen.IstWerte[0]));
    int y = Convert.ToInt32(310 + 1875 * GlobaleVariablen.IstWerte[1]);

    return new Rectangle(x, y, 2, 2);
}

在绘画事件处理程序中,您首先需要检查无效区域是否与您要编写的每个对象相交(示例很简单,因为您使用的是矩形,并且填充速度并不慢)。

在代码中进一步损害性能的是,实际上您正在Pen为每个绘制操作创建一个新代码您必须绝对避免这种情况:必须重用扩展的本机资源最终代码可能类似于:

private Pen _pen = new Pen(Color.Black, 2);
private void panel1_Paint(object sender, PaintEventArgs e)
{
    var rec = new Rectangle(2, 2, 820, 620);
    if (e.ClipRectangle.IntersectsWith(rec))
        e.Graphics.DrawRectangle(_pen, rec);

    var rec2 = GetRect2();
    if (e.ClipRectangle.IntersectsWith(rec2))
        e.Graphics.DrawRectangle(pi, rec2);
 }

现在,您的代码已稍作优化,但仍可能会闪烁。为避免这种情况,您必须为面板启用双重缓冲。从您自己的类派生Panel并添加其构造函数:

SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

重构代码并在单独的类中移动某些绘制逻辑(但不是面板本身)也是一个很好的机会。请参考MSDN以获得您可能需要使用的其他标志(例如AllPaintingInWmPaint)。

最后说明:您对坐标进行了硬编码,除非您有固定大小的面板(带有或不带有滚动),否则这不是一个好习惯,因为它无法随着将来的更改很好地缩放,并且在许多情况下(一旦您将代码将比虚构示例稍微复杂一些)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用java中另一个类的另一个面板更改面板的内容

来自分类Dev

如何在按钮单击事件中从另一个类调用方法?

来自分类Dev

jQuery Mobile:如何从另一个页面调用一个页面中的面板

来自分类Dev

jQuery Mobile:如何从另一个页面调用一个页面中的面板

来自分类Dev

如何使用方法调用在另一个面板中显示特定面板?

来自分类Dev

如何从另一个类中迅速调用另一个方法?

来自分类Dev

在Typescript中,我如何从同一类中的另一个方法(称为事件处理程序)中调用一个类方法

来自分类Dev

如何在另一个类中调用一个类的main()方法?

来自分类Dev

CardLayout:如何在另一个类的ActionListeners中显示一个类中的面板?

来自分类Dev

如何使一个事件在另一个类中触发

来自分类Dev

如何在类中调用函数以在php中调用另一个类?

来自分类Dev

Java按钮事件调用另一个类中的方法

来自分类Dev

如何从另一个类调用JavaFX类?

来自分类Dev

通过单击另一个类中的按钮从面板内的事件处理程序关闭 wx.Dialog

来自分类Dev

如何从另一个控件调用另一个控件的LostFocus事件

来自分类Dev

如何从另一个.java文件中的另一个类调用方法?

来自分类Dev

对另一个类中的事件进行承诺

来自分类Dev

如果从另一个类中调用它,为什么我的ArrayList为空?

来自分类Dev

如何在同一个类的另一个方法中调用一个方法?

来自分类Dev

如何在一个类中从另一个调用一个函数(方法)?

来自分类Dev

从另一个类(在另一个模块中)调用自变量

来自分类Dev

如何在Jframe表单类中调用另一个类?

来自分类Dev

如何知道在odoo中从哪个类调用了另一个类的方法

来自分类Dev

如何在我的主类的另一个类中调用方法?

来自分类Dev

如何使用JMenuItem调用另一个类到我的主菜单类中?

来自分类Dev

如何在JavaScript中从另一个类中调用一个类?(初学者的问题)

来自分类Dev

您如何在一个类中从另一个类中调用方法?

来自分类Dev

我如何快速从另一个类中调用一个类中的协议?

来自分类Dev

如何从另一个类调用@selector方法

Related 相关文章

  1. 1

    如何使用java中另一个类的另一个面板更改面板的内容

  2. 2

    如何在按钮单击事件中从另一个类调用方法?

  3. 3

    jQuery Mobile:如何从另一个页面调用一个页面中的面板

  4. 4

    jQuery Mobile:如何从另一个页面调用一个页面中的面板

  5. 5

    如何使用方法调用在另一个面板中显示特定面板?

  6. 6

    如何从另一个类中迅速调用另一个方法?

  7. 7

    在Typescript中,我如何从同一类中的另一个方法(称为事件处理程序)中调用一个类方法

  8. 8

    如何在另一个类中调用一个类的main()方法?

  9. 9

    CardLayout:如何在另一个类的ActionListeners中显示一个类中的面板?

  10. 10

    如何使一个事件在另一个类中触发

  11. 11

    如何在类中调用函数以在php中调用另一个类?

  12. 12

    Java按钮事件调用另一个类中的方法

  13. 13

    如何从另一个类调用JavaFX类?

  14. 14

    通过单击另一个类中的按钮从面板内的事件处理程序关闭 wx.Dialog

  15. 15

    如何从另一个控件调用另一个控件的LostFocus事件

  16. 16

    如何从另一个.java文件中的另一个类调用方法?

  17. 17

    对另一个类中的事件进行承诺

  18. 18

    如果从另一个类中调用它,为什么我的ArrayList为空?

  19. 19

    如何在同一个类的另一个方法中调用一个方法?

  20. 20

    如何在一个类中从另一个调用一个函数(方法)?

  21. 21

    从另一个类(在另一个模块中)调用自变量

  22. 22

    如何在Jframe表单类中调用另一个类?

  23. 23

    如何知道在odoo中从哪个类调用了另一个类的方法

  24. 24

    如何在我的主类的另一个类中调用方法?

  25. 25

    如何使用JMenuItem调用另一个类到我的主菜单类中?

  26. 26

    如何在JavaScript中从另一个类中调用一个类?(初学者的问题)

  27. 27

    您如何在一个类中从另一个类中调用方法?

  28. 28

    我如何快速从另一个类中调用一个类中的协议?

  29. 29

    如何从另一个类调用@selector方法

热门标签

归档