6494|13

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

EVC画图,图片从上往下刷的问题 [复制链接]

void CUserLoginDlg::DrawBitmap(int Name,int x,int y,int nWidth,int nHeight)
{
        CWindowDC        dc(this);
        CBitmap                bk_bmp, *p_old_bmp;
        CDC                        bmp_dc;       
        CBrush brush(RGB(0,0,0));
        bmp_dc.CreateCompatibleDC(&dc);
        //dc.FillRect(CRect(x,y,nWidth,nHeight ),&brush);
        bk_bmp.LoadBitmap(Name);
        p_old_bmp = (CBitmap *)bmp_dc.SelectObject(&bk_bmp);
        dc.BitBlt( x, y, nWidth, nHeight, &bmp_dc, 0, 0, SRCCOPY );
        bmp_dc.SelectObject(p_old_bmp);
        bk_bmp.DeleteObject();
}

见代码,我画一幅大一点的800*480的图,我总是可以看见图是从上往下刷的一个过程(也就是从上往下一行一行刷下来,至整个屏幕),我试过了CxImage,和双缓存,效果还是一样,请问一下是什么原因?
会不会不是代码的问题?

最新回复

OnEraseBkgnd返回TRUE,所有的事情在OnPaint中做  详情 回复 发表于 2009-11-21 23:38
点赞 关注

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
1,建立一个缓存MEMDC,在初始化initdiag时就,包含图片
2,dc.BitBlt( x, y, nWidth, nHeight, &MEMDC, 0, 0, SRCCOPY );
   这样就不会刷了,
以上是经验总结,请测试!
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
LS的方法 可行。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
如果只是显示的过程,不应该会有LZ所说的问题,特别是采用双缓冲技术后。

如果还慢,则可能是 系统的显示驱动有问题
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
应用不懂,帮你顶。。。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
应用不懂,帮你顶。。。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 1 楼 yudong54 的回复:
1,建立一个缓存MEMDC,在初始化initdiag时就,包含图片
2,dc.BitBlt( x, y, nWidth, nHeight, &MEMDC, 0, 0, SRCCOPY );
? 这样就不会刷了,
以上是经验总结,请测试!



双缓存我试过了,其实就是第一次onpaint()的时候效果比较明显,会看到CPaintDC dc(this);这代码显示的窗体白色背景,再来刷图的,所以会很明显,但是第二次调用就没那么明显了
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 3 楼 91program 的回复:
如果只是显示的过程,不应该会有LZ所说的问题,特别是采用双缓冲技术后。

如果还慢,则可能是 系统的显示驱动有问题

谢谢
再问一下91:开机启动显示桌面的时候,会停顿一下然后将桌面图标一个一个显示出来,这个过程也很明显,这是否也是显示驱动的问题
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

9
 
你可以看看整个onpaint()消耗的时间是多少,如果时间需要几百毫秒的话,那么你怎么双缓冲也解决不了这个问题了。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

10
 
因为你的分辨率很高.这种情况很可能是你的BitBlt花费的时间过长,你可以算一算这个函数上花的时间.
不知道你是用的什么CPU,如果显示驱动中没有对BitBlt作硬件加速的话很可能是这样的。
另外,你用的是800*480的图,看上去你的屏幕是做过旋转的,这样情况下显示驱动的性能很差的。如果能不做旋转尽量不要做旋转。
 
 
 

回复

59

帖子

0

TA的资源

禁止访问

11
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

78

帖子

0

TA的资源

五彩晶圆(初级)

12
 
引用 10 楼 91program 的回复:
引用 6 楼 hudaweikevin 的回复:
引用 1 楼 yudong54 的回复:
1,建立一个缓存MEMDC,在初始化initdiag时就,包含图片
2,dc.BitBlt( x, y, nWidth, nHeight, &MEMDC, 0, 0, SRCCOPY );
? 这样就不会刷了,
以上是经验总结,请测试!


双缓存我试过了,其实就是第一次onpaint()的时候效果比较明显,会看到CPaintDC dc(this);这代码显示的窗体白色背景,再来刷图的,所以会很明显,但是第二次调用就没那么明显了


白色背景,是因为擦除背景的关系,可以处理OnEraseBK(擦除背景消息,记不太清楚了),直接返回TRUE。

对,一定要OnEraseBK,返回TRUE!
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

13
 
我记得好像是两种可能性:
一种就是楼上说的,系统在刷新界面的时候,先刷成白色,再按照你要绘制的在界面上绘出,导致变慢;
第二种,我记得好像微软的broadcast里面好像有说部分刷新的方法,就是每次刷新不是把整个界面刷新,而只是刷新部分界面。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

14
 
OnEraseBkgnd返回TRUE,所有的事情在OnPaint中做
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表