EVC画图,图片从上往下刷的问题

David_Hu 2009-11-16 11:42:47
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,和双缓存,效果还是一样,请问一下是什么原因?
会不会不是代码的问题?
...全文
204 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
请问 问题解决了吗 谢谢 我也遇到一样的问题 我是在OnEraseBkgnd里也有返回 不过是false
WceUi 2009-11-21
  • 打赏
  • 举报
回复
OnEraseBkgnd返回TRUE,所有的事情在OnPaint中做
mxm1986 2009-11-18
  • 打赏
  • 举报
回复
我记得好像是两种可能性:
一种就是楼上说的,系统在刷新界面的时候,先刷成白色,再按照你要绘制的在界面上绘出,导致变慢;
第二种,我记得好像微软的broadcast里面好像有说部分刷新的方法,就是每次刷新不是把整个界面刷新,而只是刷新部分界面。
yudong54 2009-11-17
  • 打赏
  • 举报
回复
[Quote=引用 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。
[/Quote]
对,一定要OnEraseBK,返回TRUE!
91program 2009-11-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hudaweikevin 的回复:]
引用 1 楼 yudong54 的回复:
1,建立一个缓存MEMDC,在初始化initdiag时就,包含图片
2,dc.BitBlt( x, y, nWidth, nHeight, &MEMDC, 0, 0, SRCCOPY );
  这样就不会刷了,
以上是经验总结,请测试!



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

白色背景,是因为擦除背景的关系,可以处理OnEraseBK(擦除背景消息,记不太清楚了),直接返回TRUE。
ruritanian 2009-11-17
  • 打赏
  • 举报
回复
因为你的分辨率很高.这种情况很可能是你的BitBlt花费的时间过长,你可以算一算这个函数上花的时间.
不知道你是用的什么CPU,如果显示驱动中没有对BitBlt作硬件加速的话很可能是这样的。
另外,你用的是800*480的图,看上去你的屏幕是做过旋转的,这样情况下显示驱动的性能很差的。如果能不做旋转尽量不要做旋转。
giwawe 2009-11-17
  • 打赏
  • 举报
回复
你可以看看整个onpaint()消耗的时间是多少,如果时间需要几百毫秒的话,那么你怎么双缓冲也解决不了这个问题了。
David_Hu 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 91program 的回复:]
如果只是显示的过程,不应该会有LZ所说的问题,特别是采用双缓冲技术后。

如果还慢,则可能是 系统的显示驱动有问题
[/Quote]
谢谢
再问一下91:开机启动显示桌面的时候,会停顿一下然后将桌面图标一个一个显示出来,这个过程也很明显,这是否也是显示驱动的问题
David_Hu 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yudong54 的回复:]
1,建立一个缓存MEMDC,在初始化initdiag时就,包含图片
2,dc.BitBlt( x, y, nWidth, nHeight, &MEMDC, 0, 0, SRCCOPY );
  这样就不会刷了,
以上是经验总结,请测试!

[/Quote]

双缓存我试过了,其实就是第一次onpaint()的时候效果比较明显,会看到CPaintDC dc(this);这代码显示的窗体白色背景,再来刷图的,所以会很明显,但是第二次调用就没那么明显了
congyue123 2009-11-16
  • 打赏
  • 举报
回复
应用不懂,帮你顶。。。
congyue123 2009-11-16
  • 打赏
  • 举报
回复
应用不懂,帮你顶。。。
91program 2009-11-16
  • 打赏
  • 举报
回复
如果只是显示的过程,不应该会有LZ所说的问题,特别是采用双缓冲技术后。

如果还慢,则可能是 系统的显示驱动有问题
Ei 2009-11-16
  • 打赏
  • 举报
回复
LS的方法 可行。
yudong54 2009-11-16
  • 打赏
  • 举报
回复
1,建立一个缓存MEMDC,在初始化initdiag时就,包含图片
2,dc.BitBlt( x, y, nWidth, nHeight, &MEMDC, 0, 0, SRCCOPY );
这样就不会刷了,
以上是经验总结,请测试!

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧