int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0;
UINT size = 0;
ImageCodecInfo* pImageCodecInfo = NULL;
Gdiplus::GetImageEncodersSize(&num, &size);
if(size == 0)
{
return -1;
}
pImageCodecInfo = (ImageCodecInfo*)malloc(size);
if(pImageCodecInfo==NULL)
{
return -1;
}
Gdiplus::GetImageEncoders(num, size, pImageCodecInfo);
for(UINT i = 0; i < num; i++)
{
if(wcscmp(pImageCodecInfo[i].MimeType, format) == 0)
{
*pClsid = pImageCodecInfo[i].Clsid;
free(pImageCodecInfo);
return i;
}
}
free(pImageCodecInfo);
return -1;
}
BOOL SaveHDCToFile(HDC hDC, LPRECT lpRect)
{
BOOL bRet = FALSE;
int nWidth = lpRect->right - lpRect->left;
int nHeight = lpRect->bottom - lpRect->top;
HDC memDC = CreateCompatibleDC(hDC);
HBITMAP hBmp = CreateCompatibleBitmap(hDC, nWidth, nHeight);
SelectObject(memDC, hBmp);
BitBlt(memDC, 0, 0, nWidth, nHeight,
hDC, 0, 0, SRCCOPY);
CLSID bmpClsid;
// //L"image/bmp" L"image/jpeg" L"image/gif" L"image/tiff" L"image/png"
GetEncoderClsid(L"image/jpeg", &bmpClsid);
Gdiplus::Bitmap* pBmpSrc = Gdiplus::Bitmap::FromHBITMAP(hBmp, NULL);
if(pBmpSrc->Save(L"1.jpg", &bmpClsid) == Ok)
{
bRet = TRUE;
}
delete pBmpSrc;
SelectObject(memDC, (HBITMAP)NULL);
DeleteDC(memDC);
DeleteObject(hBmp);
return bRet;
}
void CDemo01Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
HDC hDC = ::GetWindowDC(m_hWnd);
RECT rect;
::GetWindowRect(m_hWnd, &rect);
CString str;
str.Format("left=%d top=%d right=%d bottom=%d", rect.left, rect.top, rect.right, rect.bottom);
MessageBox(str);
SaveHDCToFile(hDC, &rect);
::ReleaseDC(m_hWnd, hDC);
}
void CDemo01Dlg::OnButton2()
{
// TODO: Add your control notification handler code here
HDC hDC = ::GetDC(m_hWnd);
RECT rect;
::GetClientRect(m_hWnd, &rect);
CString str;
str.Format("left=%d top=%d right=%d bottom=%d", rect.left, rect.top, rect.right, rect.bottom);
MessageBox(str);
SaveHDCToFile(hDC, &rect);
::ReleaseDC(m_hWnd, hDC);
}