【转】C# 中 由OnPaint()和Paint引发的思考

MFC 关于OnPaint绘图的一些经验 阅读详情

    (一)重绘时候经常会用到OnPaint()和Paint,它们有什么区别呢?

    1.OnPaint方法是对一个控件来说的;而Paint事件是对一个控件对象来说的。它们中前者相当于是类的一个成员函数,而后者相当于是类的一个函数指针类型的变量(会因对象的不同而不同)。    
    2.OnPaint方法引发Paint事件,所以重写OnPaint方法,一定要调用base.OnPaint,否则就不会引发Paint事件了。OnPaint原形应该类似以下形式(从中便可以看出):
        protected virtual void OnPaint(PaintEventArgs e)
        {
            if (this.Paint != null)
            {
                this.Paint(this,e);
            }
        }

    3.从实例中观察二者调用顺序

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            test t = new test();
            t.AntiAlias = true;
            t.SetColor(test.eShapeColor.Circle1FillColor, Color.DarkCyan);
            e.Graphics.DrawImageUnscaled(t.Image, 10, 10);
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);//引发Paint事件处理(处理该事件时候调用Form1_Paint方法)
            ..........
        }

     Form1_Paint()只是处理Paint事件的方法,也可将它的四行代码在OnPaint方法中写,此时可以不写base.OnPaint(e),即不引发事件处理,也可达到同样的效果。


 

    (二)那么应分别在什么情况下使用它们呢?
    1.如果想对所有控件都按照某种固定的方式显示,如:自己写控件时,则需要修改重载控件的OnPaint方法;而如果仅仅在某个环境下,对某个对象要做不同的显示,则只需在其的Paint事件中做即可。

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

 

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

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

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

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

 

原文地址:

http://blog.sina.com.cn/s/blog_5b101dbf0100g4u7.html?retcode=0

c#窗体绘图2】picturebox的refresh方法paint方法 前文介绍到c#窗体绘图实质上都是在画布上进行工作,本节课原本是要介绍如何创建一个画布以及如何使用,但是念一想,在这之前,需要先介绍一下picturebox的refresh方法以及paint方法,uu们才能更加理解后续内容,如果有着急的uu不想看这节也可以直接跳过。 阅读详情

相关推荐

用GDI学习C语言,控制台也能画图

#include #include #include // 获取控制台窗口句柄 微软官方网站的程序 直接拿来用了 HWND GetConsoleHwnd(void) { #define MY_BUFSIZE 1024 // Buffer size for console window titles. HWND hwndFound; // This is what

Pillar——与其等待还不如拼命的挣扎! 8943

MFC中改变对话框背景的几个消息函数OnEraseBkgnd、 OnPaint、 OnCtlColor的调用顺序

设置对话框背景颜色及背景图片可在OnCtlColor(),OnEraseBkgnd(),OnPaint()里设置,对话框初始化完毕,显示时调用OnSize()->OnEraseBkgnd(),->OnPaint()->OnCtlColor(), 若想改变对话框大小,比如全屏显示ShowWindow(SW_SHOWMAXIMIZED);UpdateWindow(); 其中 S...

weixin_34033624的博客 959

如何用Python实现SPEI指数计算?从数据准备到结果可视化完整指南

本文提供了一份完整的Python实现SPEI指数计算指南,涵盖从数据准备、潜在蒸散量计算到结果可视化的全流程。详细介绍了使用Thornthwaite方法计算PET、拟合三参数log-logistic分布以及标准化换的核心算法,并提供了模块化代码可视化方案,帮助用户构建可复用的干旱分析工具。

cola5的博客 250

关于OnPaint函数的工作原理(很详细,很实用)

https://blog.csdn.net/foreverhuylee/article/details/21889025

C++ 爱好者 make_it_simple888 686

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

  句柄 : 句柄,是整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄。    重写 : 当一个子类继承一父类,而子类中的方法与父类中的方法的名称,参数个数、类型都完全一致...

weixin_34153893的博客 572

WM_PAINT介绍及OnPaint()函数的作用原理

* WM_PAINT是窗口每次重绘都会产生的一个消息。 * MFC中 OnPaint()是对这个消息的反应函数(mfc 的 CWnd::OnPaint() 没做什么,只是丢给系统处理,下面就是介绍它在系统中的处理流程) 关于 WM_PAINT消息 系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出...

积累点滴,保持自我 1200

C#paint()Onpaint()的区别

paint是事件onpaint方法onpaint方法是调用paint事件的,用哪一个,效果是一样,就看那一个方便了内部是这样实现的: 复制代码 代码如下: protected virtual OnPaint(PaintEventArgs e) { if(paint != null) { paint(this,e); } } 如果直接重写onpain

u011555996的博客 2919

java onpaint方法_C#paint()Onpaint()的区别

protected virtual OnPaint(PaintEventArgs e){if(paint != null){paint(this,e);}}如果直接重写onpaint,paint就会失效;这样就不会失效:protected override OnPaint(PaintEventArgs e){base.OnPaint(e); //自己的代码}(一)重绘时候经常会用到OnPaint...

weixin_39661345的博客 184

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

Form_Paint()方法是Paint事件的响应方法,OnPaint是可重载的虚方法,OnPaint方法是调用Paint事件的,用哪一个,效果是一样,就看那一个方便了内部是这样实现的: protected virtual OnPaint(PaintEventArgs e) { if(paint != null) { paint(this,e);

u010909114的专栏 4810

C# OnPaint

要让窗体在载入的时候就显示图像必须重写OnPaint方法 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.T

Godsight的博客 4206

C# 图形显示Onpaint

C#里面有一个Onpaint本来我以为是每一段时间刷新一次,但是不是的,这个事件好像只有界面重写的时候才会调用这个事件,所以需要修改显示的图像信息,通过这个事件就不能直接修改显示信息,必须触发重写事件才能刷新我要显示的图像。1、对Paint事件编程,首先根据Paint事件参数获取无效区域,然后在无效区域中按要求绘制就可以了。无效区域是整个图形的一个部分,一般来说不可能对整个图形进行绘制,而是绘制其

Wandering的博客 4542

C#重绘OnPaint()事件调用机制

与绘制有关的函数 Paint() OnPaint() Invalidate() 一个控件应该什么时候绘制主要有两个 : 一个是 系统来确定 这个控件需要绘制 比如 最小化后在最大化 那么此时 系统会发出WM_PAINT 消息来告知控件 你需要重绘了 另一个就是 人为的调用this.Invalidate()或者this.Invalidate(Rectangle)来自己触发一次重绘 对于第一种 那是系统

似水流年 1万+

OnPaint 与OnDraw的区别

首先我们要知道,OnPaint()是CWnd的类成员函数,负责响应WM_PAINT消息。 其次,在单文档应用程序中,CVIEW派生自CWnd。在对话框应用程序中,CDialog也派生自CWnd。也就是说CVIEWDialog都继承了OnPaint函数(当然进行了重写)。(这里要清除一个误区:我们在单文档应用程序里VIEW类只看到了OnDraw函数,而在对话框应用程序里只看到了OnP...

雅舍小品 3192

【MFC】OnpaintOnDraw的区别

1. OnPaint OnDraw   (1)OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。   (2)OnPaint()是CWnd的类成员,负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,没有响应消息的功能.   (3)当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows发送WM_PAINT消息。该视图的OnPaint 处理函数通过创建CPaintDC类的DC对象来响应该

UniverseLin的博客 1181

OnDraw()OnPaint()兄弟

http://hi.baidu.com/mikenoodle/blog/item/6d2f08b36b3ed1a1d9335afb.html 经常有朋友问雷神这样的问题:我在视图画的图象或者文字,当窗口改变后为什么不见了?OnDraw()OnPaint()两个都是解决上面的问题,有什么不同?雷神在这里一并解答一下吧。OnDraw()OnPaint()好象兄弟俩,因为它们的工作类似。至于不见

深海狂鲨 3009

SAP-ABAP:SAP信贷管理核心:CL_UKM_BUPA_FACTORY类完整解析与实践指南

SAP信贷管理核心类CL_UKM_BUPA_FACTORY解析 CL_UKM_BUPA_FACTORY是SAP信贷管理(UKM)模块的核心类,作为业务伙伴信贷数据的中央控制台,它提供: 统一入口:标准化实例化客户/供应商信贷对象 主要功能: 获取单条/批量业务伙伴数据 安全保存数据变更 封装底层数据访问逻辑 典型应用场景: 信贷主数据批量维护 自动化限额调整 订单信贷实时检查 性能优化建议: 使用批量方法替代循环单条处理 合理设置字段选择 实施缓存策略 该类通过简洁API简化复杂信贷操作,是SAP信贷管理开

baidu_35680696的博客 1181

杨中科老师的全13季视频: C#、Asp.net视频教程BT种子

杨中科老师的全13季 C#、Asp.net视频教程,绝对经典

上一篇: 【转】C#中Validating和Validated事件
下一篇: C#中的#region和#endregion的作用
caixiexin
博客等级 码龄17年 122粉丝 53原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值