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);