关于OnPaint、FormPaint会不停的触发 触发多次的情形---讨论总结

关于OnPaint会不停的一直触发 触发多次的问题,是这样的 首先OnPaint是响应windows的WM_PAINT消息的,你显示器上 能看到的比如说 按钮button, memo什么的 都是画出来的

但是再程序运行的过程中 可能会发生变化,比如 你在代码里 定时把一个button删除 你虽然程序上 删除了 这个button 但是 如何让用户看到 还是 需要 反映再 显示器上的,要想反映在

显示器上 那么就需要 重新 再次 把这个 form画一遍。

举例:两个form 其中一个form2.ShowModal 遮罩住了form1 ,假如form1被完全遮罩了 那么 form1的onPaint事件 就不会被触发 ,是由windows 根据显示器 看到的内容 动态的选择

合适的时机 给程序 发送WM_PAINT消息的,那什么叫 合适的时机呢 就是 你眼 当前看到的内容 或 其它情况 比如当前光标再窗体1上 等等 这个是windows 显示技术的核心 具体我们不清楚。

以下是我师傅的说法:

 实际上是对WM_PAINT消息的响应
实际上,现在的Windows要比早年的,少触发好多次
 原来,你窗口被别的窗体遮盖,别的窗体挪走,就会触发,现在一般不会,Windows的桌面混合器会缓存
所以就不一定触发了 
 你窗口创建完显示时,Windows会发个WM_PAINT消息给程序自绘,你窗体上的控件删除或移动位置时,会调用API来标记某些区域无效,然后Windows会在它认为合适的时间点,发WM_PAINT消息让你的程序重绘显示 
 重绘是一种优先级比较低的消息,而且Windows会合并这个消息 
-----------------------------------------------------------------
综上:凡是自己绘画的代码 最好写在OnPaint事件里 这样 才能让 windows不停的发送重绘消息 重绘 保持 自己的绘画内容 不消失。
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/del88/p/6368128.html

在 WinForms 中,当一个控件需要重绘时,触发其 `OnPaint` 事件。如果你发现 `OnPaint` 事件无限触发,可能是由于以下原因之一: 1. 控件的 `Invalidate` 方法被频繁调用:当调用控件的 `Invalidate` 方法时,触发 `OnPaint` 事件来进行重绘。如果在 `OnPaint` 事件处理程序中再次调用 `Invalidate` 方法,就导致无限循环触发 `OnPaint` 事件。确保在 `OnPaint` 事件处理程序中不要调用 `Invalidate` 方法。 2. 控件的 `OnPaint` 事件处理程序内部发生了无限循环:你可能在 `OnPaint` 事件处理程序中引入了一个无限循环,导致 `OnPaint` 事件不断触发。检查你的代码,确保没有在 `OnPaint` 事件处理程序中引发无限循环。 3. 控件的父容器上也发生了重绘:如果控件的父容器也需要重绘,那么它的 `OnPaint` 事件触发。如果你的控件是嵌套在其他控件中,可能导致多个 `OnPaint` 事件的连锁触发。检查你的控件的父容器,确保没有引发额外的重绘。 4. 控件的属性更改触发了重绘:某些控件属性的更改可能触发控件的重绘。例如,改变控件的大小、位置或背景色等属性可能导致 `OnPaint` 事件触发。检查你对控件属性的更改,确保没有不必要的重绘。 希望以上解释能帮助你找到问题所在。如果问题仍然存在,请提供更多的代码和上下文信息,以便更好地帮助你解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值