mfc 图片显示的重绘问题

trytochange 2014-05-27 11:42:44
现在做的是在一个对话框的picture控件里显示图片,然后有下一张按钮,用来显示另一张图片。现在的问题是,在下一张按钮对应的函数里,加载图片后,调用Invalidate(FALSE),会有上一张图片的残留;用Invalidate(TRUE)的话,图片无法显示出来,要移动对话框或者最小化才能显示出来。请问,我该怎么办?谢谢!!!
...全文
284 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
trytochange 2014-05-27
  • 打赏
  • 举报
回复
引用 2 楼 Jarrylogin 的回复:
正常应是Invalidate(TRUE) void CxxxxDlg::OnClickedButton1()里这样写: Invalidate(TRUE); 如果你嫌界面闪烁,就这样: CRect rcStatic; GetDlgItem(IDC_YOURPICTURE)->GetWindowRect(&rcStatic); ScreenToClient(&rcStatic); InvalidateRect(rcStatic);
你好,我是在OnPaint里面绘图 按钮对应的函数里面只是加载图片数据,然后在OnPaint里面用那个函数显示出来。(加载数据那些操作略去了)( 这样的结果是,点下一张按钮,什么都不显示,移动一下,就可以了。参数改成FALSE的话,就有上一张的残留。 请问,这个问题可能出在哪?谢谢!!!
trytochange 2014-05-27
  • 打赏
  • 举报
回复
引用 1 楼 cvbtvbwu 的回复:
picture控件里显示图片出现问题.正常是调用 Invalidate(TRUE).

可以使用GDI+在对话框OnPaint来绘制你想绘制在图片,而绘制图片的区域为你的Picture控件区域


你好,我是在OnPaint里面绘图
按钮对应的函数里面只是加载图片数据,然后在OnPaint里面用那个函数显示出来。(加载数据那些操作略去了)(

这样的结果是,点下一张按钮,什么都不显示,移动一下,就可以了。参数改成FALSE的话,就有上一张的残留。
请问,这个问题可能出在哪?谢谢!!!
Jarrylogin 2014-05-27
  • 打赏
  • 举报
回复
正常应是Invalidate(TRUE) void CxxxxDlg::OnClickedButton1()里这样写: Invalidate(TRUE); 如果你嫌界面闪烁,就这样: CRect rcStatic; GetDlgItem(IDC_YOURPICTURE)->GetWindowRect(&rcStatic); ScreenToClient(&rcStatic); InvalidateRect(rcStatic);
叶恭介叶恭介 2014-05-27
  • 打赏
  • 举报
回复
picture控件里显示图片出现问题.正常是调用 Invalidate(TRUE). 可以使用GDI+在对话框OnPaint来绘制你想绘制在图片,而绘制图片的区域为你的Picture控件区域
schlafenhamster 2014-05-27
  • 打赏
  • 举报
回复
“双缓存可以解决不” 可以, 不过 也要 派生。
trytochange 2014-05-27
  • 打赏
  • 举报
回复
嗯,我先试下你们二位的方法。
lyingbo 2014-05-27
  • 打赏
  • 举报
回复
引用 6 楼 u012430943 的回复:
[quote=引用 5 楼 schlafenhamster 的回复:] 对话框OnPaint中 先 CDialog::OnPaint();这句 是 保证 对话框里的 控件 都 收到 Invalidate。 然后 m_Pic。UpdateWundow();// 保证 Pic 客户区 有效。 然后 你的 原代码。
还真是这样的,解决了!!!不过会图片闪烁了,有什么好方法解决?谢谢!!!![/quote] 双缓存可以解决不?
schlafenhamster 2014-05-27
  • 打赏
  • 举报
回复
“不过会图片闪烁了” 是擦除 背景 引起的。 1. 派生 pic, EraseBackGround 中, return TRUE。 2. 对话框 响应 WM_CTLCOLOR 是 pic 时 返回 NULL Brush
trytochange 2014-05-27
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
对话框OnPaint中 先 CDialog::OnPaint();这句 是 保证 对话框里的 控件 都 收到 Invalidate。 然后 m_Pic。UpdateWundow();// 保证 Pic 客户区 有效。 然后 你的 原代码。
还真是这样的,解决了!!!不过会图片闪烁了,有什么好方法解决?谢谢!!!!
schlafenhamster 2014-05-27
  • 打赏
  • 举报
回复
对话框OnPaint中 先 CDialog::OnPaint();这句 是 保证 对话框里的 控件 都 收到 Invalidate。 然后 m_Pic。UpdateWundow();// 保证 Pic 客户区 有效。 然后 你的 原代码。

15,978

社区成员

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

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