MFC中对话框使用双缓冲绘图闪烁的问题

zhangqinli 2014-12-09 11:10:48
在对话框中有一个picture控件,会在该控件上进行画图操作,除picture控件之外,对话框上还有edit控件,用来做结果的显示,是动态刷新的,对话框整体有一个背景
现在我为了保存picture控件中的画图,采用了兼容DC绘图的方式,在OnPaint中对其进行初始化,在每次绘图完成之后,调用StretchBlt使其刷新,picture控件中的图片显示不会闪烁了
对于edit控件的刷新,我用的是InvalidateRect,因为edit控件和picture控件的更新并不是在同一个缓冲区,导致更新的时候,edit控件会出现闪烁,OnEraseBkgnd中我已经返回TRUE啦
请教各位大牛,这种问题应该怎么解决呀
...全文
381 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
聚义舔刀 2015-01-13
  • 打赏
  • 举报
回复
已经在用双缓冲了,干脆edit要显示的内容也用DC去TextOut出来。免去edit控件
worldy 2015-01-13
  • 打赏
  • 举报
回复
引用 楼主 zhangqinli 的回复:
在对话框中有一个picture控件,会在该控件上进行画图操作,除picture控件之外,对话框上还有edit控件,用来做结果的显示,是动态刷新的,对话框整体有一个背景 现在我为了保存picture控件中的画图,采用了兼容DC绘图的方式,在OnPaint中对其进行初始化,在每次绘图完成之后,调用StretchBlt使其刷新,picture控件中的图片显示不会闪烁了 对于edit控件的刷新,我用的是InvalidateRect,因为edit控件和picture控件的更新并不是在同一个缓冲区,导致更新的时候,edit控件会出现闪烁,OnEraseBkgnd中我已经返回TRUE啦 请教各位大牛,这种问题应该怎么解决呀
对话框上放置控件,必须设置裁剪属性,名字我忘记了,楼主看一下属性表就知道了
捕鲸叉 2015-01-13
  • 打赏
  • 举报
回复
edit不要调用invalidate 直接调用 Setwindowtext () 就可以了
向立天 2015-01-10
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
zhangqinli 2014-12-10
  • 打赏
  • 举报
回复
引用 8 楼 wxhxj0268 的回复:
Edit控件内容不需要使用InvalidateRect刷新吧,CEdit是CWin的派生类,直接使用成员函数写入就已经完成刷新了。
我感觉是因为我的对话框的背景图片是一个自己载入的图片,OnEraseBkground中返回了TRUE,就不会自动更新了
zhangqinli 2014-12-10
  • 打赏
  • 举报
回复
引用 7 楼 hushoubo 的回复:
线程收到数据缓存,然后发消息到对话框,在消息响应里面操作Edit控件, 也就是线程里面只有pDlg->PostMessage(WM_UPDATE_MESSAGE,0,0); 然后在 LRESULT CUWB_CoordinateDlg::OnUpdateMessage(WPARAM wParam, LPARAM lParam)里面执行 tempStr.Format(_T("%d"),x); pDlg->GetDlgItem(IDC_Distance1)->SetWindowText(tempStr); tempStr.Format(_T("%d"),y); pDlg->GetDlgItem(IDC_Distance2)->SetWindowText(tempStr); tempStr.Format(_T("%d"),z); pDlg->GetDlgItem(IDC_Distance3)->SetWindowText(tempStr); UpdateData(false);
还是不可以呢,必须InvalidateRect才可以更新,我估计是因为我的对话框的背景图片是一个自己载入的图片,OnEraseBkground中返回了TRUE,就不会自动更新了,必须InvalidateRect,但是InvalidateRect会造成闪烁的呢
笨笨仔 2014-12-10
  • 打赏
  • 举报
回复
Edit控件内容不需要使用InvalidateRect刷新吧,CEdit是CWin的派生类,直接使用成员函数写入就已经完成刷新了。
hushoubo 2014-12-10
  • 打赏
  • 举报
回复
线程收到数据缓存,然后发消息到对话框,在消息响应里面操作Edit控件, 也就是线程里面只有pDlg->PostMessage(WM_UPDATE_MESSAGE,0,0); 然后在 LRESULT CUWB_CoordinateDlg::OnUpdateMessage(WPARAM wParam, LPARAM lParam)里面执行 tempStr.Format(_T("%d"),x); pDlg->GetDlgItem(IDC_Distance1)->SetWindowText(tempStr); tempStr.Format(_T("%d"),y); pDlg->GetDlgItem(IDC_Distance2)->SetWindowText(tempStr); tempStr.Format(_T("%d"),z); pDlg->GetDlgItem(IDC_Distance3)->SetWindowText(tempStr); UpdateData(false);
zhangqinli 2014-12-10
  • 打赏
  • 举报
回复
引用 1 楼 allenhiman 的回复:
重复绘制同一个区域就会闪烁 你先想办法避免这个情况的发生
可是我的edit控件中的值的确是需要不断更新的,如果更新的话就要重复绘制edit区域吧,这种情况应该怎么避免呢
zhangqinli 2014-12-10
  • 打赏
  • 举报
回复
引用 3 楼 bigtree_mfc 的回复:
你的问题是edit控件会出现闪烁 你可以通过获取edit的句柄来操作。那就不用刷新了。 对话框句柄->GetDlgItem(编辑框ID)->SetWindowText("数据"); 可能要加UpdateData(false);
我是在一个线程中对edit中的数值进行计算的,计算之后调用了GetDlgItem(编辑框ID)->SetWindowText("数据"); 但是由于线程中不能UpdateData,所以我才在另外一个函数中进行了图形的绘制和edit控件的更新功能,我也有尝试过自己写一个MyUpdateData,然后在线程中PostMessage,但是这样的话,edit控件的值还是没有更新 void WINAPI OnRecv(char* pSouIp, int nSouPort, unsigned char* pData, unsigned int nDataLen) { 。。。 //更新界面数据 tempStr.Format(_T("%d"),x); pDlg->GetDlgItem(IDC_Distance1)->SetWindowText(tempStr); tempStr.Format(_T("%d"),y); pDlg->GetDlgItem(IDC_Distance2)->SetWindowText(tempStr); tempStr.Format(_T("%d"),z); pDlg->GetDlgItem(IDC_Distance3)->SetWindowText(tempStr); pDlg->PostMessage(WM_UPDATE_MESSAGE,0,0); ... } LRESULT CUWB_CoordinateDlg::OnUpdateMessage(WPARAM wParam, LPARAM lParam) { UpdateData(false); return 0; }
zhangqinli 2014-12-10
  • 打赏
  • 举报
回复
引用 2 楼 wxhxj0268 的回复:
InvalidateRect不能放在OnPaint()中刷新
我是把InvalidateRect放到我的图形绘制函数中的,没有放在OnPaint中 void CXX::DrawRoute(CDC * pDC, CPoint oriPoint, CPoint newPoint) { m_dcMem->MoveTo(oriPoint); m_dcMem->LineTo(newPoint); pDC->StretchBlt(0,0,m_recWidth,m_recHeight,m_dcMem,0,0, m_width,m_height,SRCCOPY); //刷新计算结果的显示,使不覆盖 CRect rc; GetDlgItem(IDC_Distance1)->GetWindowRect(&rc); ScreenToClient(&rc); InvalidateRect(rc); GetDlgItem(IDC_Distance2)->GetWindowRect(&rc); ScreenToClient(&rc); InvalidateRect(rc); GetDlgItem(IDC_Distance3)->GetWindowRect(&rc); ScreenToClient(&rc); InvalidateRect(rc); }
zhangqinli 2014-12-10
  • 打赏
  • 举报
回复
引用 11 楼 allenhiman 的回复:
实在无法避免 可以考虑不用edit控件 直接在你的背景上画edit需要显示的文字
哦,感觉好复杂的样子,我再看看,多谢了
allenhiman 2014-12-10
  • 打赏
  • 举报
回复
实在无法避免 可以考虑不用edit控件 直接在你的背景上画edit需要显示的文字
大树学长 2014-12-09
  • 打赏
  • 举报
回复
你的问题是edit控件会出现闪烁 你可以通过获取edit的句柄来操作。那就不用刷新了。 对话框句柄->GetDlgItem(编辑框ID)->SetWindowText("数据"); 可能要加UpdateData(false);
笨笨仔 2014-12-09
  • 打赏
  • 举报
回复
InvalidateRect不能放在OnPaint()中刷新
allenhiman 2014-12-09
  • 打赏
  • 举报
回复
重复绘制同一个区域就会闪烁 你先想办法避免这个情况的发生

15,979

社区成员

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

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