VS C++ 多缓冲绘图问题

heavyd 2020-05-28 05:03:12
用vs 2015,C++,GDI绘图,三图层+中间缓冲的一个图层,第二图层会不断更新,在自己的电脑没问题,但是换其他电脑就不显示第二图层(其他图层正常显示,更新不多),知道是什么原因吗?如何解决? 谢谢!
...全文
451 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
heavyd 2020-06-01
  • 打赏
  • 举报
回复
引用 13 楼 zgl7903的回复:
大概猜测,刷新的只是刷到了内存DC , 并没有输出到窗口对应的DC上 ?
有的,现在的问题是我的电脑显示没问题,但是其他有的电脑就有问题,无法显示。
zgl7903 2020-06-01
  • 打赏
  • 举报
回复
大概猜测,刷新的只是刷到了内存DC , 并没有输出到窗口对应的DC上 ?
heavyd 2020-06-01
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster的回复:
使用 临界区 锁定 ?
是的,这个会有什么问题吗?
schlafenhamster 2020-06-01
  • 打赏
  • 举报
回复
使用 临界区 锁定 ?
heavyd 2020-06-01
  • 打赏
  • 举报
回复
顶一下,帮忙看看,谢谢了
走好每一步 2020-06-01
  • 打赏
  • 举报
回复
现在XP的就不管了, 一般win7 32 win7 64 win10 64 win10 32
schlafenhamster 2020-06-01
  • 打赏
  • 举报
回复
我感觉 临界区没使用 好。
heavyd 2020-06-01
  • 打赏
  • 举报
回复
引用 15 楼 走好每一步的回复:
[quote=引用 14 楼 heavyd 的回复:] [quote=引用 13 楼 zgl7903的回复:]大概猜测,刷新的只是刷到了内存DC , 并没有输出到窗口对应的DC上 ?
有的,现在的问题是我的电脑显示没问题,但是其他有的电脑就有问题,无法显示。[/quote] 做上位机的,如果没装个虚拟机,搞几个不同版本的windows系统去验证,都不太严谨的 估计大部分还是系统的问题[/quote] 有没有什么经验可以介绍?谢谢!
走好每一步 2020-06-01
  • 打赏
  • 举报
回复
引用 14 楼 heavyd 的回复:
[quote=引用 13 楼 zgl7903的回复:]大概猜测,刷新的只是刷到了内存DC , 并没有输出到窗口对应的DC上 ?
有的,现在的问题是我的电脑显示没问题,但是其他有的电脑就有问题,无法显示。[/quote] 做上位机的,如果没装个虚拟机,搞几个不同版本的windows系统去验证,都不太严谨的 估计大部分还是系统的问题
schlafenhamster 2020-05-30
  • 打赏
  • 举报
回复
上 显示第二层图的 代码
heavyd 2020-05-30
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
上 显示第二层图的 代码
做的激光导航图像显示,多线程的方式,BakMemDC2是全局,画笔什么都设置好了。 做的很粗糙,将就着看,还请帮忙看看: if (!R2000Online) return; R2000Driver::tmpData R2000Head; try { R2000Head = *(R2000Driver::tmpData*)R2000Data; } catch (...) { return; } float angular_increment_real = 360 / (double)R2000Head.num_points_scan; UINT32 distance,x1,y1; char *buffer = R2000Data + 60;// float ang; while (BakMemDC2_Otherwriting)//其他进程在读写就等待 { } BakMemDC2_Restorewriting = true; for (int i = 0; i < R2000Head.num_points_packet; i++) { if (!R2000Online) return; distance = *(UINT32*)(buffer + i * 6); ang = angular_increment_real*i + R2000Head.first_angle / 10000; y1 = distance*cos(ang / 180 * 3.1415926535)/5/mm; x1 = distance*sin(ang / 180 * 3.1415926535)/5/mm; BakMemDC2.Ellipse(599 + x1 + (0 - CenterX), 449 + y1 + (0 - CenterY), 601 + x1 + (0 - CenterX), 451 + y1 + (0 - CenterY)); } BakMemDC2_Restorewriting = false; if (R2000Draw) DrawAll();//将所有图层以透明方式copy合并,然后显示 while (BakMemDC2_Otherwriting) { } BakMemDC2_Restorewriting = true; if(R2000Draw) SetBKBlack(&BakMemDC2);//设置底色,清屏,其实底色不是纯黑色 BakMemDC2_Restorewriting = false;
heavyd 2020-05-29
  • 打赏
  • 举报
回复
引用 6 楼 zgl7903的回复:
试试创建一个全局内存DC,线程中绘制到内存DC上,Invalidate引发重绘, OnPaint中合并图层输出
还是不行,主要我自己的电脑没问题啊,不知道跟系统本身有没有关系?
zgl7903 2020-05-28
  • 打赏
  • 举报
回复
试试创建一个全局内存DC,线程中绘制到内存DC上,Invalidate引发重绘, OnPaint中合并图层输出

heavyd 2020-05-28
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903的回复:
Invalidate 等刷新下
更新操作在哪里完成的? 上具体代码看看
OnPaint也有刷新,也有在线程里刷新,关键自己的电脑没问题,换其他人的电脑有的可以,有的也不行。要贴哪部分?代码好长啊
heavyd 2020-05-28
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903的回复:
Invalidate 等刷新下
更新操作在哪里完成的? 上具体代码看看
OnPaint也有刷新,也有在线程里刷新,关键自己的电脑没问题,换其他人的电脑有的可以,有的也不行。要贴哪部分?代码好长
heavyd 2020-05-28
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903的回复:
Invalidate 等刷新下
更新操作在哪里完成的? 上具体代码看看
OnPaint也有刷新,也有在线程里刷新,关键自己的电脑没问题,换其他人的电脑有的可以,有的也不行。要贴哪部分?代码好长
zgl7903 2020-05-28
  • 打赏
  • 举报
回复
Invalidate 等刷新下
更新操作在哪里完成的? 上具体代码看看

heavyd 2020-05-28
  • 打赏
  • 举报
回复
顶一下,哪位大佬知道?

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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