zoukankan      html  css  js  c++  java
  • [转]cximage双缓冲绘图 .

    1、起因

    本来是想用gdi绘图的,但是一想到用gdi+libpng,还要自己处理一些比如alpha的效果之类的巨麻烦(而且涉及到处理每一个像素点的计算,一般都很耗时),我对自己处理像素点的能力一直持有怀疑态度。。so,先用cximage将就着,不知道是否可以跨平台。。

    2、用cximage绘制png到屏幕上面确实很容易,简单的就几行代码

    参考:http://blog.csdn.net/zengraoli/article/details/8635225

    3、但是简单的在WM_PAINT消息进行重绘的时候,加入缓冲绘图,会发现背后出现黑色的区域-------------因为是在内存中使用了HBITMAP造成的,实例代码:

    
    
    1. case WM_PAINT:  
    2.     hdc = BeginPaint(hWnd, &ps);  
    3.   
    4.     // TODO: 在此添加任意绘图代码...   
    5.     /*      hdc= GetDC(hWnd);*/  
    6.     hMemDC  = CreateCompatibleDC(hdc);  
    7.     hbitmap = CreateCompatibleBitmap(hdc, m_pCxImage->GetWidth(), m_pCxImage->GetHeight());  
    8.     oldBmp = (HBITMAP)SelectObject(hMemDC, hbitmap);  
    9.     m_pCxImage->Draw(hMemDC, 0, 0);   
    10.     BitBlt(hdc, 0, 0, m_pCxImage->GetWidth(), m_pCxImage->GetHeight(), hMemDC, 0, 0, SRCCOPY);  
    11.   
    12.     ReleaseDC(NULL,hdc);  
    13.     EndPaint(hWnd, &ps);  
    14.     break;  

    4、其实去除背后的黑色区域很简单

    可以先把没绘制时候的空白,先拷贝一份在兼容DC(hdcBk)中,在绘制png的时候,先在内存DC(hMemDC)中绘制hdcBk,在用cximage绘制pnghMemDC中,那么背后就是白色的了,就这么简单

    主要代码:

    1. void GetBackImage(HWND hWnd, HDC &hdcBk, int iWidth, int iHeight)  
    2. {  
    3.     HDC hdcParent/*, hdcBk*/;  
    4.     HBITMAP hbitmap;  
    5.     hdcParent = GetDC(hWnd);  
    6.     hdcBk = CreateCompatibleDC(hdcParent);  
    7.     hbitmap = CreateCompatibleBitmap(hdcParent, iWidth, iHeight);  
    8.     SelectObject(hdcBk, hbitmap);  
    9.     BitBlt(hdcBk, 0, 0, iWidth, iHeight, hdcParent, 0, 0, SRCCOPY);  
    10.   
    11.     ReleaseDC(hWnd, hdcParent);  
    12. }  
       

    在消息处理的时候:

    1. case WM_PAINT:  
    2.     hdc = BeginPaint(hWnd, &ps);  
    3.   
    4.     // TODO: 在此添加任意绘图代码...   
    5.     /*      hdc= GetDC(hWnd);*/  
    6.   
    7.     hMemDC  = CreateCompatibleDC(hdc);  
    8.     hbitmap = CreateCompatibleBitmap(hdc, m_pCxImage->GetWidth(), m_pCxImage->GetHeight());  
    9.     oldBmp = (HBITMAP)SelectObject(hMemDC, hbitmap);  
    10.   
    11.     if (hdcBk == 0)  
    12.     {  
    13.         GetBackImage(hWnd, hdcBk, m_pCxImage->GetWidth(), m_pCxImage->GetHeight());  
    14.     }  
    15.       
    16.     BitBlt(hMemDC, 0, 0, m_pCxImage->GetWidth(), m_pCxImage->GetHeight(), hdcBk, 0, 0, SRCCOPY);  
    17.     m_pCxImage->Draw(hMemDC, 0, 0);  
    18.     BitBlt(hdc, 0, 0, m_pCxImage->GetWidth(), m_pCxImage->GetHeight(), hMemDC, 0, 0, SRCCOPY);  
    19.   
    20.     DeleteObject(SelectObject(hMemDC, oldBmp));  
    21.     DeleteDC(hMemDC);  
    22.   
    23.     ReleaseDC(NULL,hdc);  
    24.     EndPaint(hWnd, &ps);  
    25.     break;  
    	 

    得到的效果:

  • 相关阅读:
    浅析Go中的MPG模式(一)
    panic: assignment to entry in nil map
    Golang 新手可能会踩的 50 个坑
    小刘的go面试题
    go 单元测试整理
    go test 测试单个文件和测试单个函数
    mac pro锁屏后没有声音了怎么处理
    go json返回时间字符串处理time.Time类型
    php求一个字符串中不重复的最长子串
    业务订单号生成算法,每秒50W左右,不同机器保证不重复,包含日期可读性好
  • 原文地址:https://www.cnblogs.com/FCoding/p/3208164.html
Copyright © 2011-2022 走看看