首页 新闻 搜索 专区 学院

windows mobile 双缓冲失效

0
悬赏园豆:100 [已解决问题] 解决于 2010-08-29 16:21

最近开发一个基于windows mobile 6.5的小程序,需在要一个自定义控件上绘制线条,采用了双缓冲的方法 ,但是程序运行时,发现滚动屏幕时,这根线条还是在闪烁,请看下面的代码

 

protected override void OnPanit(PaintEventArgs e)

{

       Bitmap bmp = new Bitmap(this.width,this.height);

        Graphic g = Graphics.FromImage(bmp);

        g.Clear(Color.White);

        g.DrawLine(Pens.Black, 2, 2, 100, 100);

        e.Graphic.DrawImage(bmp);

        bmp.Dispose();

}

请大家指点一下这段代码有什么问题

jassonzhang的主页 jassonzhang | 初学一级 | 园豆:100
提问于:2010-08-28 11:32
< >
分享
最佳答案
0

把 e.Graphic.DrawImage(bmp); 换成

this.CreateGraphics().DrawImage(bmp);

在你的控件初始化的时候添加下面的代码:

this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
this.UpdateStyles();

收获园豆:100
Launcher | 高人七级 |园豆:45045 | 2010-08-28 16:39
谢谢你的回答,不过你指出两个方法,我以前都试过. this.CreateGraphics().DrawImage(bmp); 方法用过之后,整个控件的背景色变成黑色,同时闪烁依然存在. this.setstyle 在windows mobile 里面根本没有这个方法
jassonzhang | 园豆:100 (初学一级) | 2010-08-28 21:40
@jassonzhang:没看过WM的控件,不过你可以找找WM控件中的相关事件和属性,首先就是要禁止系统自己擦除背景,这从MFC时代开始就一直是这样, 我想在WM中,也会有该事件 WM_ERASEBKGND ,如果没有对应的事件处理程序,你可以通过重载控件的WinProc函数来拦截该事件,始终返回 FALSE,以禁止擦除背景。 另外,DrawImage 性能不是很好,你可以用GDI的 BitBlt 替换它.Bitmap和Graphic创建为成员变量,虽然这是一个比较小的优化。 回头,我还是写个Windows Mobile程序测试下。
Launcher | 园豆:45045 (高人七级) | 2010-08-28 23:39
此问题已大致解决,多谢Galactica指点. 这个解决的方法,一 在程序中增加一把刷子SolidBrush sbh = new SolidBrush(); sbh.Color = Color.White; 在画线条前,先用刷子设置Graphics 的背景色 g.FillRectangle(sbh, 0, 0, this.Width, this.Height); 再绘制线条. 同时要重载OnPaintBackgrounp 方法,但里面不写任何代码就可以了 但是这个只能是大致解决问题,它只能减少闪烁现象,达到有轻微的闪烁.但不能完全没有闪烁
jassonzhang | 园豆:100 (初学一级) | 2010-08-29 16:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册