windows-nt/Source/XPSP1/NT/windows/richedit/re30/osdc.cpp
2020-09-26 16:20:57 +08:00

145 lines
2.7 KiB
C++

/*
* @doc INTERNAL
*
* @module OSDC.CPP -- Off Screen DC class |
*
* This contains method used to implement the off screen
* DC class
*
* Owner:<nl>
* Rick Sailor
*
* Copyright (c) 1995-1998, Microsoft Corporation. All rights reserved.
*/
#include "_common.h"
#include "_osdc.h"
ASSERTDATA
/*
* 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
{
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 PEGASUS
if(hpal)
{
_hpalOld = ::SelectPalette(_hdc, hpal, TRUE);
RealizePalette(_hdc);
}
#endif
}
/*
* COffScreenDC::FreeData()
*
* @mfunc
* Free resources associated with bitmap
*/
void COffScreenDC::FreeData()
{
if(_hdc)
{
#ifndef PEGASUS
if(_hpalOld)
::SelectPalette(_hdc, _hpalOld, TRUE);
#endif
if(_hbmpOld)
SelectObject(_hdc, _hbmpOld);
if(_hbmp)
DeleteObject(_hbmp);
DeleteDC(_hdc);
}
}
/*
* 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;
}
// Select out old bitmap
#if defined(DEBUG) || defined(_RELEASE_ASSERTS_)
HBITMAP hbmpDebug = (HBITMAP)
#endif // DEBUG
SelectObject(_hdc, hbmpNew);
AssertSz(hbmpDebug == _hbmp,
"COffScreenDC::Realloc different bitmap");
// Delete old bitmap
DeleteObject(_hbmp);
AssertSz(hbmpDebug == _hbmp,
"COffScreenDC::Realloc Delete old bitmap failed");
// Put in new bitmap
_hbmp = hbmpNew;
return TRUE;
}