关于控件的showwindws显示问题

fangjl9 2014-09-19 03:18:24
我自制了一个切换按钮,作用是在同一个窗口下,点击不同的按钮就将界面上的控件隐藏或移动位置。功能没问题,但我这里有个显示上的问题,我按钮是标题栏贴图,点击下去之后,按下左键,屏幕先显示一次背景,背景里什么也没有,松开后那些控件才会显示出来,这样会造成,点击切换按钮-》显示一次什么控件都没有的背景-》再显示控件。点快了就是闪烁,非常严重。
部分代码:
void CdemoDlg::OnNcLButtonDown(UINT nHitTest, CPoint point){
if (m_RectTitle_Tablectrl.PtInRect(point)&& TabPage !=1){ //!=1 is wrote to prevent program to draw again
TabPage = 1; //tabpage是页面代号
InvalidateRect(CRect(m_rect_axial.left, m_rect_axial.top, m_dig_rect5.right+15, m_dig_rect2.bottom+20), TRUE);
InvalidateRect(CRect(1030, 150, 1270, 800), TRUE); // 这两句都是将背景里的线擦除
previousBtn.ShowWindow(TRUE);
GetDlgItem(IDC_EDIT1)->ShowWindow(TRUE);
}
page2 类似

点击左键它确实是执行了,功能没问题,就是显示控件前会插一个显示窗口的背景,造成闪烁。有啥好办法让控件直接显示而不刷新背景吗?感觉是这个ShowWindow函数闹的。如果能说下控件调用ShowWindow函数时,与之相关的消息的顺序就更好了
...全文
193 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2014-09-22
  • 打赏
  • 举报
回复
加了 WS_CLIPCHIDREN 主界面不会再 擦除 空间的背景, 别的消息 还有。
fangjl9 2014-09-22
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster 的回复:
父窗口 加上 WS_CLIPCHIDREN 看看
太感谢了!!!直接改个属性就完成了困扰我1星期的问题,大牛就是厉害。 效果是有了,但似乎出现了很多问题,直接表现就是子窗口的地方出现了一些没有被重绘的地方。主界面似乎不负责给子窗口传消息了?
schlafenhamster 2014-09-22
  • 打赏
  • 举报
回复
父窗口 加上 WS_CLIPCHIDREN 看看
fangjl9 2014-09-22
  • 打赏
  • 举报
回复
引用 7 楼 wxhxj0268 的回复:
放在绘图区中的控件在屏幕刷新时是会闪烁,除非你刷新时不刷新控件,网上可找到CDC中处理的方法。 我通常不将控件话绘图区,或将控件也通过图形绘制,再用设置控制区域的方法获取鼠标动作
引用 6 楼 happyparrot 的回复:
或者可以重载OnEraseBkgnd,自己画背景,BitBlt贴出来
是的,我之前就是贴图然后自己模拟鼠标动作,老大不让啊,非要我用类创建控件对象,如果不刷新控件界面会很乱的吧。我倒是希望能像双缓冲,把背景跟控件先画好,然后一次性一起显示。不过我知道的双缓冲只能在内存上画图,可以在内存上显示控件吗?还有一种思路,能不能每次都重新创建控件,不用showwindow,这个思路如何。
fangjl9 2014-09-22
  • 打赏
  • 举报
回复
引用 8 楼 dingxz105090 的回复:
因为你用了InvalidateRect,所以会调用OnEraseBkgnd 建议把InvalidateRect的第二个参数设为FALSE试试
多谢建议,我也发现是这个问题,但我的页面2页内容不同,都有控件,不刷新前一页内容的话直接将后一页显示出来,那么两页控件是叠加起来的。不行啊
凌乱哥 2014-09-20
  • 打赏
  • 举报
回复
因为你用了InvalidateRect,所以会调用OnEraseBkgnd 建议把InvalidateRect的第二个参数设为FALSE试试
笨笨仔 2014-09-19
  • 打赏
  • 举报
回复
放在绘图区中的控件在屏幕刷新时是会闪烁,除非你刷新时不刷新控件,网上可找到CDC中处理的方法。 我通常不将控件话绘图区,或将控件也通过图形绘制,再用设置控制区域的方法获取鼠标动作
快乐鹦鹉 2014-09-19
  • 打赏
  • 举报
回复
或者可以重载OnEraseBkgnd,自己画背景,BitBlt贴出来
快乐鹦鹉 2014-09-19
  • 打赏
  • 举报
回复
感觉还是思路上有问题。我也没觉得控件显示隐藏会有导致闪烁的问题。 你可以考虑修改一下背景刷新的方法。Invalidate不推荐。
fangjl9 2014-09-19
  • 打赏
  • 举报
回复
双缓存的方法可以有效改变闪烁,但双缓存牵扯到控件可不可以呢?就是内存环境中放控件,然后bitbit...
fangjl9 2014-09-19
  • 打赏
  • 举报
回复
引用 2 楼 happyparrot 的回复:
那你响应OnNcLButtonUp,执行这个处理,会怎么样呢?
重点是我用showwindow函数,系统显示控件前会调用一次OnEraseBkgnd,然后再把控件显示出来,我就想问能不能控件直接显示。不要在全擦除背景一次再显示控件。
快乐鹦鹉 2014-09-19
  • 打赏
  • 举报
回复
那你响应OnNcLButtonUp,执行这个处理,会怎么样呢?
schlafenhamster 2014-09-19
  • 打赏
  • 举报
回复
上点图,看看 视觉 效果。

15,980

社区成员

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

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