19,468
社区成员
发帖
与我相关
我的任务
分享
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CDC m_dcCompatible;
if(!m_dcCompatible.m_hDC)
{
m_dcCompatible.CreateCompatibleDC(&dc);
}
//CRect rect;
//GetClientRect(&rect);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc,30,30);
m_dcCompatible.SelectObject(&bitmap);
m_dcCompatible.BitBlt(0,0,30,30,&dc,0,0,SRCCOPY);
m_dcCompatible.SelectObject(pBrush);
SelectObject(m_dcCompatible, bitmap);
//CBitmap *pOldBit=dc.SelectObject(&bitmap);
m_dcCompatible.Rectangle(0,0,30,30);
m_dcCompatible.LineTo(5,15);
m_ImgList.Create(50,50,ILC_COLOR24,11,0);
m_ListCtl.SetImageList(&m_ImgList,LVSIL_NORMAL);
m_ImgList.Add(&bitmap, RGB(100,100,100));
void CMapXViewView::SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath)
{
HDC hDC = ::GetDC(hWnd);
if(hDC == NULL)
{
CString cstrError;
cstrError.Format("%d",GetLastError());
AfxMessageBox(_T("GetWindowDC is Error!")+cstrError);
}
HDC hMemDC = ::CreateCompatibleDC(hDC);
if(hMemDC == NULL)
{
CString cstrError;
cstrError.Format("%d",GetLastError());
AfxMessageBox(_T("CreateCompatibleDC is Error!")+cstrError);
}
RECT rc;
::GetWindowRect(hWnd, &rc);
HBITMAP hBitmap = ::CreateCompatibleBitmap(hDC, rc.right - rc.left -5, rc.bottom - rc.top-5);
if(hBitmap == NULL)
{
CString cstrError;
cstrError.Format("%d",GetLastError());
AfxMessageBox(_T("CreateCompatibleBitmap is Error!")+cstrError);
}
HBITMAP hOldBmp = (HBITMAP)::SelectObject(hMemDC, hBitmap);
BOOL bPrintRes;
bPrintRes = ::PrintWindow(hWnd, hMemDC, PW_CLIENTONLY);
if(0 == bPrintRes)
{
CString cstrError;
cstrError.Format("%d",GetLastError());
AfxMessageBox(_T("PrintWindow is Error!")+cstrError);
}
//::StretchBlt()
BITMAP bitmap = {0};
::GetObject(hBitmap, sizeof(BITMAP), &bitmap);
BITMAPINFOHEADER bi = {0};
BITMAPFILEHEADER bf = {0};
CONST int nBitCount = 24;
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bitmap.bmWidth;
bi.biHeight = bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = nBitCount;
bi.biCompression = BI_RGB;
DWORD dwSize = ((bitmap.bmWidth * nBitCount + 31) / 32) * 4 * bitmap.bmHeight;
HANDLE hDib = GlobalAlloc(GHND, dwSize + sizeof(BITMAPINFOHEADER));
LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
int iRes;
iRes = ::GetDIBits(hMemDC, hBitmap, 0, bitmap.bmHeight, (BYTE*)lpbi + sizeof(BITMAPINFOHEADER), (BITMAPINFO*)lpbi, DIB_RGB_COLORS);
if(iRes == NULL)
{
CString cstrError;
cstrError.Format("%d",GetLastError());
AfxMessageBox(_T("GetDIBits is Error!")+cstrError);
}
try
{
CFile file;
file.Open(lpszPath, CFile::modeCreate | CFile::modeWrite);
bf.bfType = 0x4d42;
dwSize += sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bf.bfSize = dwSize;
bf.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
file.Write((BYTE*)&bf, sizeof(BITMAPFILEHEADER));
file.Write((BYTE*)lpbi, dwSize);
file.Close();
}
catch(CFileException* e)
{
e->ReportError();
e->Delete();
}
GlobalUnlock(hDib);
GlobalFree(hDib);
::SelectObject(hMemDC, hOldBmp);
BOOL bDO;
bDO = ::DeleteObject(hBitmap);
if(bDO == NULL)
{
CString cstrError;
cstrError.Format("%d",GetLastError());
AfxMessageBox(_T("DeleteObject(hBitmap) is Error!")+cstrError);
}
//::DeleteObject(hMemDC);
bDO = ::DeleteDC(hMemDC);
if(bDO == NULL)
{
CString cstrError;
cstrError.Format("%d",GetLastError());
AfxMessageBox(_T("DeleteDC(hMemDC) is Error!")+cstrError);
}
bDO =::ReleaseDC(hWnd, hDC);
if(bDO == NULL)
{
CString cstrError;
cstrError.Format("%d",GetLastError());
AfxMessageBox(_T("::ReleaseDC(hWnd, hDC); is Error!")+cstrError);
}
}