一个DC拷贝到内存DC上。

1. 创建一个创建内存DC与HBitmap 对象
    HDC hMemDC;
    HBITMAP  hBitmap, hOldBitmap;  // 位图句柄
    HDC hdc = ::GetDC(m_hWnd); // 得到屏幕DC
    
    hMemDC = ::CreateCompatibleDC(hdc); // 兼容内存区域
    hBitmap = ::CreateCompatibleBitmap(hdc, rc.Width(), rc.Height()); // 建议兼容的HBitmap
    hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); //选择对象

 

2.将CGpsCtrl组件中的DC拷贝到这个hMemDC上

STDMETHODIMP CGpsCtrl::DrawToDC(long hDC)
{
 // draw all cars
 HBITMAP hOldImageBMP;
 HBITMAP hImageBMP = CreateCompatibleBitmap((HDC)hDC,m_iMaxTileSize, m_iMaxTileSize); //创建兼容位图

    HBITMAP hOldMaskBMP;
 HBITMAP hMaskBMP = CreateBitmap(m_iMaxTileSize, m_iMaxTileSize,1,1,NULL); //创建单色掩码位图

    HDC hImageDC = CreateCompatibleDC((HDC)hDC);
    HDC hMaskDC = CreateCompatibleDC((HDC)hDC);
   
 hOldImageBMP = (HBITMAP)SelectObject(hImageDC,hImageBMP);  
 hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC,hMaskBMP);  
 
 //-- 0
 // 将源DC中的位图拷贝到临时DC中(因为可能会伸缩,所以用StretchBlt而不是BitBlt)
 StretchBlt(hImageDC,0,0,m_iMaxTileSize,m_iMaxTileSize,m_hBackDC,0,0,m_iMaxTileSize, m_iMaxTileSize,SRCCOPY);

 //-- 1
    //设置透明色, 原来为
    SetBkColor(hImageDC,GetPixel(m_hBackDC,0,0));
   
    //生成透明区域为白色,其它区域为黑色的掩码位图
    BitBlt(hMaskDC,0,0,m_iMaxTileSize, m_iMaxTileSize,hImageDC,0,0,SRCCOPY);

    //-- 2
    //生成透明区域为黑色,其它区域保持不变的位图
    SetBkColor(hImageDC,RGB(0,0,0));
    SetTextColor(hImageDC,RGB(255,255,255));
 // 这里有两步,首先:单色位图转换成彩色位图:1->BkColor ; 0->TextColor
 //             其次:第一步转出来的彩色位图 AND hImageBMP
 // 最终结果是:目标位图hImageBMP的透明区域为黑色(0),显示区域保持不变

    BitBlt(hImageDC,0,0,m_iMaxTileSize, m_iMaxTileSize,hMaskDC,0,0,SRCAND);

    //-- 3
    //透明部分保持屏幕不变,其它部分变成黑色
    SetBkColor((HDC)hDC,RGB(255,255,255));
    SetTextColor((HDC)hDC,RGB(0,0,0));
 // 也是两步,同上。
 // 最终结果是:hdcDest上被打了个洞,洞的大小正是目标位图显示区域大小,洞里的颜色是黑色(0)
    BitBlt((HDC)hDC,0,0,m_iMaxTileSize, m_iMaxTileSize,hMaskDC,0,0,SRCAND);
    //-- 4
 // OR运算,(hole in hdcDest) | (hImageBMP)
    //"或"运算,生成最终效果
    BitBlt((HDC)hDC,0,0,m_iMaxTileSize, m_iMaxTileSize,hImageDC,0,0,SRCPAINT);
   
    //清理、恢复   
    SelectObject(hImageDC,hOldImageBMP);
    DeleteDC(hImageDC);
    SelectObject(hMaskDC,hOldMaskBMP);
    DeleteDC(hMaskDC);
    DeleteObject(hImageBMP);
    DeleteObject(hMaskBMP);

 return S_OK;
}

3.将动态GPS的DC输出来内存DC上,屏幕位图的句柄,保存到文件

m_pGPSView->DrawToDC((long)hMemDC);

 //得到屏幕位图的句柄,保存到文件
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);//得到屏幕位图的句柄
SaveBmp(hBitmap,strPathName);
    
SelectObject(hMemDC,hOldBitmap);
    
 //清除
DeleteDC(hMemDC);

::ReleaseDC(m_hWnd, hdc);

你可能感兴趣的:(null)