当静态文本框更新显示数据速度很快时怎么才能不闪烁???

大树学长 2019-08-19 11:44:01
自绘的静态文本框,
在DrawItem中使用
dc.DrawText(str, rect, DT_EDITCONTROL | DT_WORDBREAK);//str数据,rect区域
来显示静态文本框文字,每次更新数据都是在静态文本框自绘类中调用了InvalidateRect(&rect, TRUE);局部刷新这个函数来刷新静态文本框,如果更新速度很快时就会出现很严重的闪烁现象,有没有什么类似双缓冲的办法解决这种闪烁问题?????


...全文
162 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2019-08-19
  • 打赏
  • 举报
回复
一样操作

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 int wmId, wmEvent;
	
 switch (message) 
 {
  case WM_ERASEBKGND:
  {
   return TRUE;
  }
  case WM_PAINT:
  {
   TCHAR szHello[MAX_LOADSTRING];
   LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

   RECT rtc;
   GetClientRect(hWnd, &rtc);
   int nWidth = rtc.right - rtc.left;
   int nHeight = rtc.bottom - rtc.top;

   RECT rt = {0, 0, nWidth, nHeight};

   PAINTSTRUCT ps;
   HDC hDstDC = BeginPaint(hWnd, &ps);
			  
   HDC hdc = CreateCompatibleDC(hDstDC);
   int nSaveDC = SaveDC(hdc);
   HBITMAP hMemBmp = CreateCompatibleBitmap(hDstDC, nWidth, nHeight);
   HGDIOBJ hOldBmp = SelectObject(hdc, hMemBmp);
        
   //在HDC上绘图
   {
    //填充背景色
    HBRUSH hBkbr = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
    FillRect(hdc, &rt, hBkbr);
    DeleteObject(hBkbr);

    //背景透明
    int nBkMode = SetBkMode(hdc, TRANSPARENT);
    //字体颜色
    int nTxtColor = SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT));
    DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
    //恢复字体颜色
    SetTextColor(hdc, nTxtColor);
    //回复背景属性
    SetBkMode(hdc, nBkMode);
   }

   //贴图到目标区域
   BitBlt(hDstDC, rtc.left, rtc.top, nWidth, nHeight, hdc, 0, 0, SRCCOPY);

   //结束清理
   SelectObject(hdc, hOldBmp);
   DeleteObject(hMemBmp);
   RestoreDC(hdc, nSaveDC);
   DeleteDC(hdc);

   EndPaint(hWnd, &ps);

   return 0;
 }
 return DefWindowProc(hWnd, message, wParam, lParam);
}
大树学长 2019-08-19
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
1 InvalidateRect(NULL, FALSE) 2 WM_ERASEBKGND 直接返回TRUE 3 处理WM_PAINT 双缓冲绘制
1、2都已经用了,WM_PAINT中怎么双缓冲文字?只会双缓冲图片,但是我现在要显示的是文字
zgl7903 2019-08-19
  • 打赏
  • 举报
回复
另外补充一点, 可以保存之前的刷新过的数据,如果当前要刷新的数据一样可以不用 InvalidateRect
zgl7903 2019-08-19
  • 打赏
  • 举报
回复
1 InvalidateRect(NULL, FALSE) 2 WM_ERASEBKGND 直接返回TRUE 3 处理WM_PAINT 双缓冲绘制
schlafenhamster 2019-08-19
  • 打赏
  • 举报
回复
"更新显示数据速度很快时" 快到 一定 速度 时 ,避免不了闪烁, 眼睛也 受不了
走好每一步 2019-08-19
  • 打赏
  • 举报
回复
引用 3 楼 大树学长 的回复:
[quote=引用 1 楼 zgl7903 的回复:] 1 InvalidateRect(NULL, FALSE) 2 WM_ERASEBKGND 直接返回TRUE 3 处理WM_PAINT 双缓冲绘制
1、2都已经用了,WM_PAINT中怎么双缓冲文字?只会双缓冲图片,但是我现在要显示的是文字 [/quote] 都会双缓冲图片了,自绘控件里有一个很出名CMemDc,挺好用的

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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