首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

WinForm 你为什么这么闪?该如何处理

2011-12-31 
WinForm 你为什么这么闪?主页面使用了背景图和带图片的按钮6个,在运行和重绘时背景图上的按钮都是一个一个

WinForm 你为什么这么闪?
主页面使用了背景图和带图片的按钮6个,在运行和重绘时背景图上的按钮都是一个一个重绘,整个软件重绘时如同百叶窗一样!找了N多资料,也使用了                         this.DoubleBuffered   =   true;
                        this.SetStyle(ControlStyles.UserPaint   |   ControlStyles.AllPaintingInWmPaint   |   ControlStyles.OptimizedDoubleBuffer,   true);

但是问题依然!!请教个位大侠如何解决这个问题!!

                protected   override   void   OnPaint(PaintEventArgs   e)
                {

                }

如何重写重绘事件可以解决这个问题1!

[解决办法]
1.用双缓冲

2.局部重绘
[解决办法]
主要是背景图片的问题,试试用一个Picturebox Fill整个窗体,再设置PictureBox的Image为你想显示的背景图

BackGroundImage显示比Image显示刷新慢
[解决办法]
比如说百叶窗,第一次变宽度的10%,你就重绘这10%的页面
第二次变10~20 你就重绘这一部分
这样可以提高效率减轻闪烁
[解决办法]
界面上的控件尽量的少是关键!
[解决办法]
OnPaint事件只有在窗体Resize的时候或者重新Load的时候或者调用Invalidata()的时候才会触发,知道了这个原则你就检查你的代码吧!
[解决办法]
每个子控件变化,父控件就要重绘一下,所以就慢了

应该在设置一些属性前, SuspendLayout(),最后ResumeLayout();

控件里面:

const int WM_SETREDRAW = 0xB;

[DllImport( "User32 ")]
static extern bool SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);

private void SetRedraw(IntPtr handle, bool on)
{
SendMessage(handle, WM_SETREDRAW, on ? 1 : 0, 0);
}


SetRedraw(MyControl.Handle, false);

SetRedraw(MyControl.Handle, true);
[解决办法]
具体怎么写要看你的代码要怎么绘了...
[解决办法]
float percent;

Rectangle newValueRect = this.ClientRectangle;
Rectangle oldValueRect = this.ClientRectangle;

percent = (float)(val - min) / (max - min);
newValueRect.Width = (int)((float)newValueRect.Width * percent);

percent = (float)(oldVal - min) / (float)(max - min);
oldValueRect.Width = (int)((float)oldValueRect.Width * percent);

Rectangle updateRect = new Rectangle();

if (newValueRect.Width > oldValueRect.Width)
{
updateRect.X = oldValueRect.Size.Width;
updateRect.Width = newValueRect.Width - oldValueRect.Width;
}
else
{
updateRect.X = newValueRect.Size.Width;
updateRect.Width = oldValueRect.Width - newValueRect.Width;
}

updateRect.Height = this.Height;

this.Invalidate(updateRect);
[解决办法]
同病相怜!我想有没有简单一点的方法?比如,等整个窗口绘制完成以后,再显示出来?
[解决办法]
怪不得WPF开始把显示任务全交给显卡上的GPU了。


[解决办法]
遇到一模一样的问题,关注中。
[解决办法]
up
[解决办法]
用这个api,hwndLock为窗口句柄,完成后传null参数而解除锁定

[DllImport( "user32.dll ", EntryPoint= "LockWindowUpdate ")]
public static extern int LockWindowUpdate (
IntPtr hwndLock
);

[解决办法]
如果你的按钮继承自System.Windows.Forms.Button ,设置button.DoubleBuffered = true
因为是保护属性,继承一下再设置。
[解决办法]
慢,是.NET的特点,除了慢还是他吗的慢.WIN方面简直是失败中的失败.
[解决办法]
不如自己做个控件
在内部自己画,用drawfromImage之类的东西,把你要的这批加进去。
比较省资源,也比较快
[解决办法]
mark
[解决办法]
关注ing
[解决办法]
up


[解决办法]
不知道能否这样,用PictureBox替代按钮,每次的绘制都在内存上绘制。如何绘制到屏幕就无所谓了。也就是这样
1。构造的时候,创建一个和控件一样尺寸的Bitmap对象,用这个对象作为PictureBox的Image属性。
2。Graphics.FromImage(BitmapObject).Draw....
3。执行控件.OnPaint或者发送消息给控件(WM_PAINT)
[解决办法]
up

热点排行