You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
3.0 KiB
118 lines
3.0 KiB
// 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 <objbase.h>
|
|
#include <basetyps.h>
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// 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;
|
|
}
|
|
|