opencv笔记(三十五)——MFC中如何刷新static控件

在MFC中用缓存技术进行绘图完全可以做到不闪烁,下面是在对话框应用程序OnPaint函数else分支中的代码,显示一行文本,仅用来测试:


CWnd * pWndShow;
CDC * pDCShow;
pWndShow = GetDlgItem(IDC_STC_DRAW); // static text控件ID
pDCShow = pWndShow->GetDC();

CDC memDC;
CRect rect;
CBitmap memBmp, *pOldBmp;
pWndShow->GetClientRect(rect);
memDC.CreateCompatibleDC(pDCShow);
memBmp.CreateCompatibleBitmap(&memDC, rect.Width(), rect.Height());
pOldBmp = memDC.SelectObject(&memBmp);

// 更新窗口
pWndShow->UpdateWindow();
// 背景用白色填充
memDC.FillSolidRect(rect, RGB(255,255,255));
// 设置为透明模式
memDC.SetBkMode(TRANSPARENT);
memDC.TextOut(100, 100, 不能打双引号了);
// 将内存DC中的内容拷贝到设备DC中
pDCShow->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);

// 清理
memDC.SelectObject(pOldBmp);
memBmp.DeleteObject();
memDC.DeleteDC();
pWndShow->ReleaseDC(pDCShow);

在你需要刷新的地方调用对话框的函数Invalidate(FALSE);就行了。例如你的程序可以设置一个一秒定时器在里面刷新窗口就行了。
对于其他控件闪烁的情况,由于只在缓存中绘制了static text控件的部分,所以应该只重写static text控件。在定时器中改为调用对话框的InvalidateRect函数,第一个参数用static text控件在对话框中的位置,第二个参数同样用FALSE,具体用法请参看MSDN或百度百科

转自:https://wenda.so.com/q/1373595399063351

猜你喜欢

转载自blog.csdn.net/qq_37764129/article/details/83344712