• GDI+双缓冲


    网上很多能搜索到的GDI+双缓冲的实现都是有错误的,终于找到了一个正确,分享给大家。


     

    1. CPaintDC dc(this);    
    2. CRect rect;  
    3. GetClientRect(&rect);  
    4. Bitmap bmp(rect.right, rect.bottom);  
    5. SolidBrush  br(Color(255, 0, 0, 255));  
    6. Graphics* graph = Graphics::FromImage(&bmp);  
    7. graph->Clear(Color::White);  
    8. for(int i=0; i<100; i++)  
    9.     {  
    10.     graph->FillEllipse(&br, Rect(0, 10+i, 20+i, 30));  
    11.   
    12.     Graphics graphics(dc.m_hDC);  
    13.   
    14.     graphics.DrawImage(&bmp, rect.left, rect.top, rect.right, rect.bottom);  
    15.     }  
     

    这里是在WM_PAINT消息里面处理的。首先创建一个Bitmap的对象,用来在上面进行画图。接着创建一个与之关联的Graphics对象。注意到上面调用了Graphics对象的Clear来把它刷成白色,至于作用等下再说明。

    这时候就可以用graph进行画画了,这时候其实都只是画到Bitmap对象上去,还没有画到窗口上去,也就是只是先保存到内存中而已。

    接着就创建一个与hdc相关联的Graphics对象了,这时候用graphics所做的操作都会显示到窗口上了。但由于我们之前是先把所有的操作在内存里都做好,再一次性显示到屏幕上,这样就提高了绘图速度。

    但其实现在运行一下程序还是发现在缩放窗口时图片会闪烁,这里的原因是由于在缩放时程序会自动刷新背景,这时候就要在处理WM_ERASEBKGND消息时直接return TRUE。这样就告诉Windows我们会自己进行刷新,但实际上这时我们什么都没做。上面调用了Graphics对象的Clear方法就是来处理背景的刷新,由于这时是在内存中做好的,所以就不会再出现闪烁的问题了。

  • 相关阅读:
    张一鸣:平常心做非常事|字节跳动9周年演讲全文
    实验二:分词
    helm部署EFK收集应用日志,ingress-nginx日志解析。
    Terraform
    Windows 11 下载
    Kubernetes Pod中容器的Liveness、Readiness和Startup探针
    Kubernetes使用Keda进行弹性伸缩
    K8s 部署 Prometheus + Grafana
    CSDN & 博客园
    zipkin,pinpoint和skywalking对比
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318273.html
Copyright © 2020-2023  润新知