2 iamoatil iamoatil 于 2013.10.18 11:10 提问

求高手解答:C# winform中protected 的OnPaint被谁调用?

winform中控件的绘制都是通过OnPaint它来完成的。因为OnPaint是Protected的,所以,它必然是在本类、子类中被调用的。根据控件的继承结构,最后知道在System.Windows.Forms.Control中应该有一个逻辑调用OnPaint。

查找这一个逻辑,发现WndProc中有处理消息的机制,其中调用WmPaint,本以为在其中会调用OnPaint的,结果没有。

在查找其他可能的地方,都没有发现。

实质上C++中也是调用OnPaint来绘制界面的,记得里面说的是发出WM_Paint消息后系统自动调用OnPaint的。我猜测Winform中也是一样的。但是“系统自动调用OnPaint”,到底怎么调用的?在Control中人家本来是一个Protected,你就在外面总是调用不了吧。肯定是还是间接的调用一个Public,然后这public调用OnPaint吧。反正,我没有找到源头。

求高手解答!万分感激。

1个回答

hz932
hz932   2015.10.09 18:00

控件的Invalidate()方法,告诉系统这个控件需要重绘,然后系统会调用OnPaint方法。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C#中Form的Paint事件响应方法与重载虚方法OnPaint()的区别
Form_Paint()方法是Paint事件的响应方法,OnPaint是可重载的虚方法,OnPaint方法是调用Paint事件的,用哪一个,效果是一样,就看那一个方便了内部是这样实现的: protected virtual OnPaint(PaintEventArgs e) { if(paint != null) { paint(this,e);
C# 重写空间 Onpaint事件
我们无法直接在窗体的代码中重写控件的OnPaint事件,只能重写窗体的OnPaint事件。 重写控件的OnPaint事件,必须创建一个新的控件。这个控件继承Windows的控件,然后在创建的控件中重写控件的OnPaint事件。 以PictureBox为例: //定义一个新的控件,继承PictureBox控件 public cl
c# 如何重写控件的OnPaint事件
使用OnPaint事件可以随时绘制图形 调用窗体的OnPaint事件protected override void OnPaint(PaintEventArgs e){    base.OnPaint(e);    //绘图} 但是如何重写控件的OnPaint事件呢?比如说绘图是在PictureBox中绘制的,那么如何重写PictureBox的OnPaint事件?
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
Winform重写CreateParams实现控件的透明显示(Panel为例)
前阵子做GIS,要实现图层的显示效果,尝试将2个PictureBox叠在一起,将上面的一张图片的BackColor设为Color.Transparent,并不加载任何图片,希望能看见下面一张图片的内容,但始终无法实现,然后得知道Winform默认情况下是不支持透明通道的,所以查阅了相关知识后,尝试继承并重写Winform中控件的一些属性和方法,实现自定义的PictureBox并支持透明通道 现在
关于窗体(Windows Form)的CreateParams(属性或参数)的一点总结!
我们如果使用过MFC的人都知道,其实CreateParams是封装创建控件时需要的信息,也就是它是CreateWindowEx的参数,重写它就可以设置控件创建时的样式.由此很多人在开发时不满足当前窗体的样式时,往往就想到要重写这个了,有过MFC或MFC项目经验的同学都知道,创建一个窗体里有一个受保护(protected)的属性(CreateParams,这个属性一般被封装保护的),由此当不满足Mi
收藏,C# WinForm 用override CreateParams 来重载窗体的一些特性(慎用!!!)
窗体和控件的属性CreateParams(这真的是一个属性)很神奇,因为通过它你能够很方便的控制窗体或控件诸如边框、最大化最小化关闭按钮的隐藏、窗体的模式化弹窗模式等的一些特性。虽然,CreateParams有者如此巨大的潜力,但是在使用时要相当慎重,如果你不了解CreateParams这个属性的话,反而会是你在编写其他代码的时候非常疑惑。 引用MSDN中对CreateParams的说明:
关于private成员、protected成员、public成员调用问题
头文件Person: #include using namespace std; class Person { public: Person(); ~Person(); void eat(); protected: string m_strName; private: int m_iAge; }; 源文件Person: #include #include "Pe
C# 绘图中的图片闪烁问题解决方法的使用结果
我编写的是Windows应用程序用 OnPaint 进行实时绘图的protected override void OnPaint(PaintEventArgs e){        base.OnPaint(e);        Graphics dc = e.Graphics;        //以下是绘图内容}由于每秒需要重绘一次图片,所以出现严重的闪烁问题。 
不要在OnPaint()中使用Invalidate()来刷新窗口
我从CEdit类派生了一个子类CMyEidt,然后在CMyEidt::中绘图,并使用了Invalidate()来使编辑框进行重绘。但却导致CPU的占用率很高,并且,如何没有采用双缓冲机制,图片还会不停的闪烁。如下图 注释掉Invalidate()后CPU占用恢复正常: 但是我在主对话框中调用Invalidate()却不会导致CPU出现这种情况,这是为什么? 谁能给