用双缓冲绘图为啥不能实时更新呢?

King_hhuang 2011-01-26 11:13:15
我做了一个等待窗口,上面有些文字信息需要实时更新,为啥我用双缓冲更新了信息之后,窗口上的文字并没有实时更新,必须要你切换一下才能更新啊?该代码如下,请问要怎样才能做到输出的信息马上显示在界面上(我目前用RedrawWindow这个Rect可以实现,有没有其他方法呢)


void CWaitWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here
UpdateText(&dc, m_strText, m_TextRect);
// Do not call CWnd::OnPaint() for painting messages
}

void CWaitWnd::UpdateText(CDC *pDC, LPCTSTR lpszText, CRect &TextRect)
{
if (!IsWindow(m_hWnd))
return;

if (TextRect.IsRectEmpty())
return;

ASSERT(lpszText);
if (!lpszText)
return;

BOOL bReleaseDC = FALSE;
if (!pDC)
{
pDC = GetDC();
bReleaseDC = TRUE;
}

// double buffer the drawing
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC, TextRect.Width(), TextRect.Height());
CBitmap *pOldBitmap = dcMem.SelectObject(&bmp);

dcMem.SetBkColor(GetSysColor(COLOR_BTNFACE));
dcMem.SetBkMode(OPAQUE);
CRect rect(0, 0, TextRect.Width(), TextRect.Height());
dcMem.FillSolidRect(&rect, GetSysColor(COLOR_BTNFACE));
CFont *pOldFont = dcMem.SelectObject(&m_font);
dcMem.DrawText(lpszText, -1, &rect, DT_LEFT);

// end double buffering
pDC->BitBlt(TextRect.left, TextRect.top,
TextRect.Width(), TextRect.Height(), &dcMem,
0, 0, SRCCOPY);
dcMem.SelectObject(pOldFont);
dcMem.SelectObject(pOldBitmap);
bmp.DeleteObject();
dcMem.DeleteDC();
if (bReleaseDC)
ReleaseDC(pDC);
}



...全文
130 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
h100037 2011-01-26
  • 打赏
  • 举报
回复
InvalidateRect

第二个参数最好传 FALSE, 不擦除背景
空娴 2011-01-26
  • 打赏
  • 举报
回复
InvalidateRect 用这个可以刷新你想刷新的区域...你切换的时候也是调用这类函数...2楼说的是整体刷新.....也是可以用的....
如果有闪烁的话就响应WM_ERASEBKGND..返回TRUE...
King_hhuang 2011-01-26
  • 打赏
  • 举报
回复
谢谢,调用InValdate()?再UpdateWindow,那整个窗体都要刷新,比edrawWindow这个Rect效果更差
lyingbo 2011-01-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 king_hhuang 的回复:]
我做了一个等待窗口,上面有些文字信息需要实时更新,为啥我用双缓冲更新了信息之后,窗口上的文字并没有实时更新,必须要你切换一下才能更新啊?该代码如下,请问要怎样才能做到输出的信息马上显示在界面上(我目前用RedrawWindow这个Rect可以实现,有没有其他方法呢)


C/C++ code

void CWaitWnd::OnPaint()
{
CPaintDC dc(t……
[/Quote]

调用InValdate()应该也可以实现的
alunlee 2011-01-26
  • 打赏
  • 举报
回复
在你需要更新的时候,直接把缓冲里的数据拷上去。不要调用Invalidate绕来绕去了。
lyingbo 2011-01-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 king_hhuang 的回复:]

谢谢,调用InValdate()?再UpdateWindow,那整个窗体都要刷新,比edrawWindow这个Rect效果更差
[/Quote]

闪烁的话,你需要重载WM_ERASEBKGND消息

15,979

社区成员

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

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