解决方案 »

  1.   

    默认地,放上30个Button并不或者这样。看看你有没有什么“轮询杀手”代码,例如自己写什么Paint、什么定时器,都是很容易被初学者滥用的。你可以在每一个自定义方法内第一行写上类似Debug.Print("------>private void map_SpiritLoaded({0}, {1})", x, y);
    这样的代码。然后当你“用鼠标拖动窗口边框”3秒钟,看看在调试“输出”窗口里打印的程序轨迹,看看哪些方法被疯狂调用。
      

  2.   

    的确,我的代码里面不止定义了窗口paint函数,还有其他一些画图函数,每拉动一次窗口就得重绘,请教一下,这个有没有什么好的解决方法
      

  3.   

    可以使用Anchor属性来实现自适应,效果也许会比你自己在SizeChanged事件里去控制好些。
      

  4.   

    那就是跟ResizeEnd一样了?
    其实也可以动态开个timer,在拖动过程中定时重绘,当ResizeEnd的时候就把它关掉
    这样总不至于即使鼠标移动了1个像素,也要重绘一次
      

  5.   

    WndProc中使用WM_EXITSIZEMOVE,WM_ENTERSIZEMOVE
      

  6.   

    我把画图一些函数注掉之后确实能好一点,这个我可不可以在resizeend再让它重绘
      

  7.   

    的确,我的代码里面不止定义了窗口paint函数,还有其他一些画图函数,每拉动一次窗口就得重绘,请教一下,这个有没有什么好的解决方法那看来你需要判断当前控件是否SuspendLayout决定是否要做你自己重绘了(讨厌的是这个状态只能反射拿到)。具体点,在重写的OnLayoutSuspended里把你绘制好的保存一下,在拖动期间直接帖你保存的这个图,当OnLayoutResuming时再重绘
      

  8.   

    使用Anchor属性,方便有简单。Anchor设置为Top,就表示控件与父容器的上面距离保持不变。
    Anchor设置为Top, Right,就表示控件与父容器的上面和右边的距离保持不变。
    以此类推。可以得到一个很方便的,拉伸效果。
      

  9.   

    现在的问题是拖动过程中卡顿闪烁你自己sizechange里去修改top/left/width/height和用anchor是不一样的。你在resize里写,ui被频繁重绘,这是你闪烁的原因。你换成anchor,效果会好很多。你也可以采纳15楼的建议,总之,就是尽可能减少ui重绘。
      

  10.   

    现在的问题是拖动过程中卡顿闪烁你自己sizechange里去修改top/left/width/height和用anchor是不一样的。你在resize里写,ui被频繁重绘,这是你闪烁的原因。你换成anchor,效果会好很多。你也可以采纳15楼的建议,总之,就是尽可能减少ui重绘。
    我要做的是控件随着窗口大小的改变自动调节它自己的位置和大小,anchor好像实现不了吧,他只是设置按钮距离窗口边缘位置不变,重写layout只保存我画的那部分吗?
      

  11.   

    现在的问题是拖动过程中卡顿闪烁你自己sizechange里去修改top/left/width/height和用anchor是不一样的。你在resize里写,ui被频繁重绘,这是你闪烁的原因。你换成anchor,效果会好很多。你也可以采纳15楼的建议,总之,就是尽可能减少ui重绘。
    我要做的是控件随着窗口大小的改变自动调节它自己的位置和大小,anchor好像实现不了吧,他只是设置按钮距离窗口边缘位置不变,重写layout只保存我画的那部分吗?设置控件到父对象边框之间的距离,如果只制定top、left就可以让他们保持在左上角。相反bottom和right就可以让他们在右下角,相应的全部指定可以随窗口变大缩小。当然无法满足所有情况,但绝大多数情况下足够用了,你的那么多按钮如果大多数都用系统方法重新摆放位置和大小,少数几个才去手工处理,那么效率也会高不少。不一定重写layout,假设你在resize事件里加上一个标志位,你在mouse button up事件里检查这个标志位,如果为true那么就重新计算按钮位置和大小,那么整个resize过程中只有最后鼠标释放的时候才重绘,而不是在resize过程中多次重绘。
      

  12.   

     先禁用重绘
    在启用重绘设置双缓冲也
    不是太管用的const int WM_SETREDRAW = 0xB;
    SendMessage(base.Handle, WM_SETREDRAW, 1, 0); // 禁用
    SendMessage(base.Handle, WM_SETREDRAW, 1, 0); // 启用
      

  13.   

     protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams cp = base.CreateParams;
                    cp.ExStyle |= 0x02000000;////用双缓冲绘制窗口的所有子控件
                    return cp;
                }
            }
      

  14.   

    http://www.cnblogs.com/Charltsing/p/WinFormNoFlicker.html
      

  15.   

    不用试了,不管加什么双缓冲那都骗人的,最多减轻一点,不管怎么样都是会闪烁的,这个是winform设计的问题。
    最有效的办法是使用directUI脏句柄重绘控件,可以达到原生c++的绘图效率。
    P.S我很讨厌2L那装X的样子。明明懂的皮毛一样的却到处装大神。