zoukankan      html  css  js  c++  java
  • Win32双缓冲讲解

       双缓冲是一种思想,也是一种方法,它可以避免频繁的闪烁问题。如果在画布上直接绘画,由于每次都会重新擦除然后重绘,绘制需要时间,所以肉眼会看到闪烁问题。解决的方法就是在内存中先创建出一个内存dc,然后在内存dc中绘制,绘制结束后,直接“贴”上去就好了。

      具体步骤如下:

        1、声明

         HDC hMemDC;
           HBITMAP hBitmap;

           2、创建相容的内存DC

                hMemDC = CreateCompatibleDC(hdc);

           3、创建位图

               hBitmap = CreateCompatibleBitmap(hdc, rt.right - rt.left, rt.bottom - rt.top);//rt为RECT变量

           4、将位图选入到内存DC中,没有这一步的话,内存DC只能是单色的,置换后才是多彩的

       SelectObject(hMemDC, hBitmap);

           5、绘制

          .....

           6、拷贝到原先内存

              BitBlt(hdc, 0, 0, rt.right - rt.left, rt.bottom - rt.top, hMemDC, 0, 0, SRCCOPY)

           7、释放内存

              DeleteDC(hMemDC);

              DeleteObject(hBitmap);

       EndPaint(hwnd,&ps);

        //解释一下DeleteDC与ReleaseDC的区别,如果是create出来的,请用DeleteDC,如果是get出来的,请用ReleaseDC。

           总结代码如下:

    PAINTSTRUCT     ps; 
        RECT rtClient;
        GetClientRect(hwnd,&rtClient);
        HDC hdc = BeginPaint(hwnd, &ps);  
        HDC hMemDC = CreateCompatibleDC(hdc);
        HBITMAP hBitmap = CreateCompatibleBitmap(hdc, rtClient.right - rtClient.left, rtClient.bottom - rtClient.top);//rt为RECT变量;
        SelectObject(hMemDC, hBitmap);
       FillRect(hMemDC, &rtClient,WHITE_BRUSH);

    BitBlt(hdc,
    0, 0,rtClient.right - rtClient.left, rtClient.bottom - rtClient.top, hMemDC, 0, 0, SRCCOPY); DeleteDC(hMemDC); DeleteObject(hBitmap); EndPaint(hwnd,&ps);
  • 相关阅读:
    phpMyAdmin导入大的sql文件
    mysql错误代码解释
    Sphinx在windows下安装使用[支持中文全文检索]
    Linux查看磁盘分区等命令和相关工具介绍
    webuploader大小限制
    常用的C#正则表达式!
    C# csv.excel导入
    日志
    微信
    winform窗口控件随窗口变化
  • 原文地址:https://www.cnblogs.com/jlyg/p/8431521.html
Copyright © 2011-2022 走看看