/* * @doc INTERNAL * * @module OSDC.CPP -- Off Screen DC class | * * This contains method used to implement the off screen * DC class * * Owner: * Rick Sailor * * Copyright (c) 1995-2000, Microsoft Corporation. All rights reserved. */ #include "_common.h" #include "_osdc.h" ASSERTDATA /* * COffscreenDC::GetDimensions(pdx, pdy) * * @mfunc * return the current height of the osdc * * @rdesc * height of the osdc */ void COffscreenDC::GetDimensions(long *pdx, long *pdy) { Assert(_hbmp); BITMAP bitmap; W32->GetObject(_hbmp, sizeof(BITMAP), &bitmap); *pdx = bitmap.bmWidth; *pdy = bitmap.bmHeight; } /* * COffscreenDC::Init(hdc, xWidth, yHeight, crBackground) * * @mfunc * Initialize off screen DC with compatible bitmap * * @rdesc * HDC created */ HDC COffscreenDC::Init( HDC hdc, //@parm DC to be compatible with LONG xWidth, //@parm Width of compatible bitmap LONG yHeight, //@parm Height of compatible bitmap COLORREF crBackground) //@parm Default background for bitmap { if (_hdc) return _hdc; HDC hdcRet = NULL; // HDC to return to caller _hbmpOld = NULL; // Assume failure _hbmp = NULL; _hpalOld = NULL; // Create memory DC _hdc = CreateCompatibleDC(hdc); if(_hdc) { // Create bitmap based on size of client rectangle _hbmp = CreateCompatibleBitmap(hdc, xWidth, yHeight); if(_hbmp) { // Select bitmap into hdc _hbmpOld = (HBITMAP)SelectObject(_hdc, _hbmp); if(_hbmpOld && SetBkColor(_hdc, crBackground) != CLR_INVALID) hdcRet = _hdc; } } if(!hdcRet) FreeData(); return hdcRet; } /* * COffscreenDC::SelectPalette(hpal) * * @mfunc * Set a new palette into the hdc */ void COffscreenDC::SelectPalette( HPALETTE hpal) //@parm Handle to palette to set { #ifndef NOPALETTE if(hpal) { _hpalOld = ::SelectPalette(_hdc, hpal, TRUE); RealizePalette(_hdc); } #endif } /* * COffscreenDC::FreeData() * * @mfunc * Free resources associated with bitmap */ void COffscreenDC::FreeData() { if(_hdc) { #ifndef NOPALETTE if(_hpalOld) ::SelectPalette(_hdc, _hpalOld, TRUE); #endif if(_hbmpOld) SelectObject(_hdc, _hbmpOld); if(_hbmp) { DeleteObject(_hbmp); _hbmp = NULL; } DeleteDC(_hdc); _hdc = NULL; } } /* * COffscreenDC::Realloc(xWidth, yHeight) * * @mfunc * Reallocate bitmap * * @rdesc * TRUE - succeeded * FALSE - failed */ BOOL COffscreenDC::Realloc( LONG xWidth, //@parm Width of new bitmap LONG yHeight) //@parm Height of new bitmap { // Create bitmap based on size of client rectangle HBITMAP hbmpNew = CreateCompatibleBitmap(_hdc, xWidth, yHeight); if(!hbmpNew) { AssertSz(FALSE, "COffscreenDC::Realloc CreateCompatibleBitmap failed"); return FALSE; } SelectObject(_hdc, hbmpNew); // Delete old bitmap DeleteObject(_hbmp); // Put in new bitmap _hbmp = hbmpNew; return TRUE; }