// bitmap.cpp : implementation file // //+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1999 // // File: bitmap.cpp // // Contents: Helper functions to copy bitmaps // // History: 27-Feb-97 WayneSc Created // // //-------------------------------------------------------------------------- #include #include //+------------------------------------------------------------------- // // Member: CopyBitmap // // Synopsis: Make a copy of given bitmap & return handle to the copy. // // Returns: HBITMAP - NULL if error // // Note: Cannot use SC as we need to include too may headers. // which will make this dependent on mmcbase.lib, but // mmcbase.lib is dependent on this (UICore.lib). // //-------------------------------------------------------------------- HBITMAP CopyBitmap(HBITMAP hbm) { if (!hbm) return NULL; HDC hdc = NULL; HDC hMemDCsrc = NULL; HDC hMemDCdst = NULL; HBITMAP hNewBm = NULL; BITMAP bm; ZeroMemory(&bm, sizeof(bm)); hdc = GetDC (NULL); if (!hdc) goto Error; hMemDCsrc = CreateCompatibleDC (hdc); if (!hMemDCsrc) goto Error; hMemDCdst = CreateCompatibleDC (hdc); if (!hMemDCdst) goto Error; if (! GetObject (hbm, sizeof(BITMAP), (LPSTR)&bm)) goto Error; /*hNewBm = +++CreateBitmap - Not Recommended(use CreateDIBitmap)+++ (dx, dy, bm.bmPlanes, bm.bmBitsPixel, NULL);*/ hNewBm = CreateBitmap(bm.bmWidth, bm.bmHeight, bm.bmPlanes, bm.bmBitsPixel, NULL); if (hNewBm){ HBITMAP hbmSrcOld = (HBITMAP) SelectObject (hMemDCsrc, hbm); HBITMAP hbmDstOld = (HBITMAP) SelectObject (hMemDCdst, hNewBm); BitBlt (hMemDCdst, 0, 0, bm.bmWidth, bm.bmHeight, hMemDCsrc, 0, 0, SRCCOPY); SelectObject (hMemDCsrc, hbmSrcOld); SelectObject (hMemDCdst, hbmDstOld); } Cleanup: if (hdc) ReleaseDC (NULL,hdc); if (hMemDCsrc) DeleteDC (hMemDCsrc); if (hMemDCdst) DeleteDC (hMemDCdst); return hNewBm; Error: #ifdef DBG /* * Cannot use SC as we need to include too may headers. * which will make this dependent on mmcbase.lib, but * mmcbase.lib is dependent on this (UICore.lib). * So call outputstring in case of error. */ LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL ); OutputDebugString((LPTSTR)lpMsgBuf); LocalFree( lpMsgBuf ); #endif hNewBm = NULL; goto Cleanup; }