C#中 paint()与Onpaint()的区别

转载 2018年04月16日 08:13:51

Paint()和OnPaint()事件是用来重绘

一:二者区别

1.OnPaint方法是对一个控件来说的;而Paint事件是对一个控件对象来说的。它们中前者相当于是类的一个成员函数,而后者相当于是类的一个函数指针类型的变量(会因对象的不同而不同)。    

2.OnPaint方法引发Paint事件,所以重写OnPaint方法,一定要调用base.OnPaint,否则就不会引发Paint事件了。OnPaint原形应该类似以下形式(从中便可以看出):

二:使用场景

1.如果想对所有控件都按照某种固定的方式显示,如:自己写控件时,则需要修改重载控件的OnPaint方法;而如果仅仅在某个环境下,对某个对象要做不同的显示,则只需在其的Paint事件中做即可。

2.在实现派生类的时候,遵循 C# 原则35:选择重写函数而不是使用事件句柄。

许多.net类库中的类都提供了两种不同的处理事件句柄的方法。既可以为其添加事件,也可以重写其基类的事件抽象方法。在实现派生类的时候,更好的选择是重写基类中的抽象方法。

因为这样,一旦事件句柄抛出异常,不会再有其他的事件句柄被调用。这避免了一些错误代码继续被调用而引发的问题。通过重写受保护的虚方法,我们的句柄可以 第一个被调用。基类中虚函数负责其他相关句柄的调用。这意味着如果需要调用那些事件句柄(一般来说是需要的),就要调用基类的虚函数。在有些特殊情况下我 们需要替换基类的默认行为,可能不需要调用任何原有的事件句柄。虽然我们不能保证所有的事件句柄都被执行,因为其可能会抛出异常,但是我们可以保证派生类 的行为是正确的。

使用override比添加事件句柄高效的多。在 条款 22中展示了System.Windows.Forms.Control类是如何存储句柄时间并将其对应到每一个事件的。这种事件机制由于要检查事件句柄将造成更多的消耗。事件句柄列表中的每个方法都需要执行。相比重写虚方法,通过事件处理会消耗更多的时间。

此外,重写虚方法只需要维护一个函数就可以达到检查和修改的目的,代码更清晰。而事件机制需要两个维护点:事件句柄函数和事件绑定代码。其中任何一点都可能造成整体功能上的失败。一个函数显然要简单些。


C#中的‘集合’案例

ArrayList的基本介绍、ArrayList优点、ArrayList定义和初始化、ArrayList元素访问和遍历、ArrayList常见方法、ArrayList案例演示、ArrayList缺陷探讨。List基本介绍、List定义和初始化、List常见方法讨论、List综合案例应用
  • 2017年05月22日 09:49

对话框的OnPaint函数的两种写法的区别

对话框的OnPaint函数的两种写法的区别。
  • clever101
  • clever101
  • 2010-07-28 23:11:00
  • 6722

MFC OnPaint()函数中最先调用CDialog::OnPaint()和最后调用CDialog::OnPaint()的巨大区别

OnPaint()函数中最先调用CDialog::OnPaint()和最后调用CDialog::OnPaint()的巨大区别,如果没有注意这个问题就会出现无厘头式的绘图问题-- 效果就是出不来!在经过...
  • qq2399431200
  • qq2399431200
  • 2014-01-01 22:10:25
  • 3500

MFC中OnDraw与OnPaint的区别

OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。 OnPaint()是CWnd的类成员,负责响应WM_P...
  • xiexievv
  • xiexievv
  • 2011-03-23 15:27:00
  • 14343

关于对话框OnPaint 不调用基类CDialog::OnPaint方法CPU消耗很大达到70%以上问题

基于对话框的程序(mfc默认生成),重载OnEraseBkgnd函数,其它不动,若在OnPaint函数中不调用其基类的OnPaint函数,即注释掉CDialog::OnPaint();,代码如下:...
  • lixiang987654321
  • lixiang987654321
  • 2014-05-27 20:43:06
  • 2230

OnPaint不停刷新的问题

自定义控件响应WM_PAINT消息,在OnPaint中,默认有CPaintDC dc(this); 如果注释掉CPaintDC dc(this);则程序不停地刷新(计数器不停地飞涨!!),可是如果保留...
  • wuzoujing
  • wuzoujing
  • 2009-12-04 20:42:00
  • 3807

C#中Form的Paint事件响应方法与重载虚方法OnPaint()的区别

Form_Paint()方法是Paint事件的响应方法,OnPaint是可重载的虚方法,OnPaint方法是调用Paint事件的,用哪一个,效果是一样,就看那一个方便了内部是这样实现的: p...
  • u010909114
  • u010909114
  • 2016-07-25 14:44:41
  • 2025

重绘控件中OnPaint、OnDraw、OnDrawItem和DrawItem的区别

====================================================================================================...
  • ssslpk
  • ssslpk
  • 2013-11-14 18:01:13
  • 1299

c# 如何重写控件的OnPaint事件

使用OnPaint事件可以随时绘制图形 调用窗体的OnPaint事件protected override void OnPaint(PaintEventArgs e){    base.OnPaint...
  • daming_ocean
  • daming_ocean
  • 2008-11-26 11:46:00
  • 10012

C#中控件Control的Paint事件和OnPaint虚函数的区别

句柄 : 句柄,是整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按...
  • u011555996
  • u011555996
  • 2017-09-17 21:47:51
  • 242
收藏助手
不良信息举报
您举报文章:C#中 paint()与Onpaint()的区别
举报原因:
原因补充:

(最多只允许输入30个字)