C# winform 当移动窗口的时候,绘图就会改变,怎么使移动窗口的时候,不触发Paint事件呢? 谢谢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# winform 当移动窗口的时候,绘图就会改变,怎么使移动窗口的时候,不触发Paint事件呢? 谢谢相关的知识,希望对你有一定的参考价值。

移动窗体的时候,这些线路就没有了,不能通过重绘,因为里边的图形在变化的时候,我移动的窗体,不知道移动窗体的时候绘制图形到什么地步了。 如果有不理解的地方,我qq:2227646653

在移动事件中先记录原有控件的坐标,移动结束后恢复原有坐标,再次重绘 参考技术A 使移动窗口的时候,不触发Paint事件这一做法本来就有问题吧?
如果移动窗体图像就消失了。那你的绘图应该是CreateGraphics方法获取Graphics后绘制的。
所以只要换个一方法就好了。直接响应Paint事件或者重写OnPaint方法,在里面进行图像绘制就好了,然后用数据保存当前的绘制情况。追问

移动窗口的时候,组织触发Paint事件,没法实现吗?

追答

你试试吧。
bool draw = true;
protected override void WndProc(ref Message m)

if (m.Msg == 0x0112 && m.WParam == (IntPtr)0xF012) //响应到窗体移动事件
draw = false;
else if (m.Msg == 0x000F && (!draw)) //绘图事件

return;

base.WndProc(ref m);

但是要恢复响应绘图事件,需要手动把draw设为true。

追问

我试了这个方法,但是不可行,我觉得当移动窗体时,不能阻止Paint发生,你觉得是这样的吗? 谢谢

追答

貌似移动中改动了draw,但是任然绘制,但是最大化或者最小化后再拖动图像就不再绘制。
具体怎么样不清楚。但是一开始这样做就应该是有问题的。

追问

移动窗体的时候,C#默认会触发Form_Paint事件,能不能通过一种方法,在移动窗体的时候不触发Form_paint事件? 不是在移动窗体事件中,将Form_paint return; 而是在移动窗体的底层中组织Form_Paint事件触发? 谢谢

追答

winform程序的最基本的事件处理函数就是WndProc。在这里阻止的方法就像我上面给出的代码,如果m.Msg==0x000F,就直接return,不调用base.WndProc。这里也没法成功在移动过程中阻止。
另外有个IMessageFilter接口,其PreFilterMessage方法,可以再消息调度前过滤消息,但是我试过了。。这里也没有用。

参考技术B 移移动都得触发paint事件,不过可以屏蔽,这样在移移动时窗口的内容将是一片空白.
你是要达到这种效果吗:
平移时窗口一片空白,或者是画面在原地不动
当松开鼠标时瞬间在所在位置显示出画面追问

移动时怎么屏蔽Paint事件,给个例子写一下,谢谢

追答

可以根据鼠标的动作判断,然后判别画是不画..
看看这个:
http://blog.csdn.net/soarandy/article/details/5038644

说得挺明白..

参考技术C 那你更做的时保存这些路线,在 Paint 事件里对这些路线绘制,而不是想法跳过这个事件追问

那就是在移动的时候没法跳过Paint事件?

参考技术D 其实,你可以通过C#控制C++的GDI画图,这样画的又快,又不会出发Paint事件,很给力的

C# winform 父窗口子窗口按钮控制

首先,父窗口有按钮调出不同的子窗口,没子窗口中有“修改”“保存”按钮,当点击“修改”后,父窗口中所有关于打开子窗口的按钮的值全部变为fasle。之后点击“保存”按钮,父窗口的按钮值又全部变为true。求解决办法。需要添加什么事件,和代码?

在父窗体内中添加一全局方法,查找到你要禁用的按钮,设置为不可用;
在子窗体的修改按钮中调用这一方法;

话说有必要吗?直接将子窗体打开为模式窗体,只能操作当前子窗体,在子窗体没关闭前不能操作父窗体不简单些吗?追问

因为设定是只要没点击“修改”,就仍然可以操作父窗口。

追答

那就是前面说的,定义一个全局的方法,再调用,或者把父窗体中打开子窗体的按钮设为全局的,在子窗体中操作它

追问

冒昧的问一下,这个全局方法该怎么写。。。。 没用过 举个例子也可以

追答

假设你的父窗口叫frmMain,添加方法:
public static void SettingButton()

foreach(Control control in Controls) //这里你自己改下,在哪个范围内查找

if(control is Button) //如果是按钮,就禁用它
control.Enable=false;


在子窗体按钮事件中调用:
frmMian.SettingButton();
基本就是这样,手打未验证过,细节你自己改下

参考技术A 在子窗体中修改的事件中,加上 如:buttion pass= 子窗体.FindControl("父窗体中buttion控件名"); pass.visible=fasle; 追问

错误 1 “WindowsApplication6.Form2”并不包含“FindControl”的定义
求解决方法

以上是关于C# winform 当移动窗口的时候,绘图就会改变,怎么使移动窗口的时候,不触发Paint事件呢? 谢谢的主要内容,如果未能解决你的问题,请参考以下文章

c# winform 窗口控件多,就会加载很慢???

C# (winform)如何改变控件形状

c# winform 关于绘图的问题,如何定义一个Graphics g作为全局变量

C#关于winforms窗体大小边框移动动画等属性

Qt绘图学习

求教:C#中winform 并未使用任何图片,但报错”GDI+ 中发生一般性错误“