void DrawImageEx(HDC hdc, Image* pImage, RECT rc)
{
if (pImage)
{
Graphics g(hdc);
ImageAttributes ImgAtt;
ImgAtt.SetWrapMode(WrapModeTileFlipXY);
g.DrawImage(pImage, Rect(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top),
0, 0, pImage->GetWidth(), pImage->GetHeight(),
UnitPixel, &ImgAtt, NULL, NULL);
}
else
{
//绘制背景
HBRUSH hbrush = CreateSolidBrush(GetBkColor(hdc));
::FillRect(hdc, &rc, hbrush);
::DeleteObject(hbrush);
}
}
void CMgr_PictureSave::DrawLine(HDC hdc, tagDrawData* pData, bool bDrawMove, bool isSelect, bool bSave)
{
COLORREF clr = 0xFF0000;
HPEN hPen;
if (isSelect)
{
hPen = ::CreatePen(PS_SOLID, 4, RGB(GetBValue(clr), GetGValue(clr), GetRValue(clr)));
}
else
{
hPen = ::CreatePen(PS_SOLID, 2, RGB(GetBValue(clr), GetGValue(clr), GetRValue(clr)));
}
HPEN hPenOld = (HPEN)::SelectObject(hdc, hPen);
for(int i =0; i< pData->nPtNum; i++)
{
if (i >= MAXDRAWPOINTS) break;
if (i == 0)
{
::MoveToEx(hdc, pData->x[i], pData->y[i], NULL);
}
else
{
::LineTo(hdc, pData->x[i], pData->y[i]);
}
}
::SelectObject(hdc, hPenOld);
DeleteObject(hPen);
}
void CMgr_PictureSave::DrawGraph(HDC hdc, bool bSave)
{
CCriticalLock lock(_pcs);
// 绘制时数据转换,避免存储反复转换的误差
tagDrawData tData;
bool isSelect = false;
tagDrawData pTagData;
map<u32, tagDrawData*>::iterator ite;
ite = m_mapDrawData.begin();
while(ite != m_mapDrawData.end())
{
if (ite->second != NULL && ite->second->isHide == false)
{
if (ite->second->nType == m_nCurSelType)
{
isSelect = TRUE;
memcpy(&tData, ite->second, sizeof(tagDrawData));
}
else
{
DrawLine(hdc, ite->second, false, false, bSave);
// DrawTxtId(hdc, ite->second);
}
}
ite++;
}
if (isSelect)
{
DrawLine(hdc, &tData, false, false, bSave);
// DrawTxtId(hdc, &tData);
//DrawSpecific(hdc, &tData, false, bSave);
}
}
void CMgr_PictureSave::SavePic(HWND hwnd, CStdString sPath)
{
HDC hdc = GetDC(hwnd);//hwnd 可以为NULL
HDC hTempMemDC = ::CreateCompatibleDC(NULL);
HBITMAP bmpTmpDraw = ::CreateCompatibleBitmap(hdc, m_nWCoeffOuter, m_nHCoeffOuter);//hdc
if(bmpTmpDraw == NULL) bmpTmpDraw = ::CreateCompatibleBitmap(hdc, m_nWCoeffOuter, m_nHCoeffOuter);
if (bmpTmpDraw == NULL)
{
return;
}
HGDIOBJ oldObj = ::SelectObject(hTempMemDC, bmpTmpDraw);
RECT rc;
rc.left = 0;
rc.top = 0;
rc.right = m_nWCoeffOuter;
rc.bottom = m_nHCoeffOuter;
DrawImageEx(hTempMemDC, m_pImagePic, rc);
DrawGraph(hTempMemDC, true);
SYSTEMTIME st;
GetLocalTime(&st);
u32 dwAddr = pMgrData->GetIP();
u8 *pch = (u8 *)&dwAddr;
wchar_t szIPAddr[64] = {0};
wsprintf(szIPAddr, TEXT("%d.%d.%d.%d"), *pch, *(pch+1), *(pch +2), *(pch+3));
wchar_t cDate[20] = {0};
wsprintf(cDate, TEXT("%d-%d-%d"), st.wYear, st.wMonth, st.wDay);
wchar_t fileName[100] = {0};
wsprintf(fileName, TEXT("%s_%s_场景%d.jpg"), szIPAddr, cDate, m_nScenceIndex+1);
CStdString sNewPath;
sNewPath.Append(sPath.GetData());
sNewPath.Append(TEXT("\\"));
sNewPath.Append(fileName);
Bitmap bm((HBITMAP)bmpTmpDraw, NULL);
CLSID Clsid;
GetEncoderClsid(L"image/jpeg", &Clsid);//GetEncoderClsid函数在文末
bm.Save(sNewPath, &Clsid);
SelectObject(hTempMemDC, oldObj);
if(bmpTmpDraw != NULL)
{
DeleteObject(bmpTmpDraw);
bmpTmpDraw = NULL;
}
if(hTempMemDC != NULL)
{
DeleteObject(hTempMemDC);
hTempMemDC = NULL;
}
}
//---------------
CLSID encoderClsid 可支持的样式:
GetEncoderClsid(L"image/png", &Clsid);
GetEncoderClsid(L"image/bmp", &Clsid);
GetEncoderClsid(L"image/gif", &Clsid);
GetEncoderClsid(L"image/jpeg", &Clsid);
GetEncoderClsid(L"image/tiff", &Clsid);