/************************************************************************ * * * CWINFILE.CPP * * * * Copyright (C) Microsoft Corporation 1993-1994 * * All Rights reserved. * * * ************************************************************************/ #include "stdafx.h" #pragma hdrstop #include "cpaldc.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CPalDC::CPalDC(HBITMAP hbmpSel, HPALETTE hpalSel) { hdc = CreateCompatibleDC(NULL); ASSERT(hdc); if (!hdc) return; // out of system resources hpal = NULL; if (hpalSel) SelectPal(hpalSel); hbmpOrg = hbmpSel; if (hbmpSel) { // Can fail if hbmp is selected into another DC VERIFY((hbmp = (HBITMAP) SelectObject(hdc, hbmpSel))); } else hbmp = NULL; hbrCreated = NULL; hwndDC = NULL; hbr = NULL; } CPalDC::CPalDC(HWND hwnd) { hdc = GetDC(hwnd); ASSERT(hdc); if (!hdc) return; // out of system resources hwndDC = hwnd; hpal = NULL; hbmp = NULL; hbrCreated = NULL; hbr = NULL; hbmpOrg = NULL; } static const char txtDisplay[] = "DISPLAY"; CPalDC::CPalDC(int type) { switch (type) { case SCREEN_DC: hdc = CreateDC(txtDisplay, NULL, NULL, NULL); break; case SCREEN_IC: hdc = CreateIC(txtDisplay, NULL, NULL, NULL); break; default: ASSERT(type == SCREEN_DC); break; } ASSERT(hdc); if (!hdc) return; // out of system resources hwndDC = NULL; hpal = NULL; hbmp = NULL; hbrCreated = NULL; hbr = NULL; hbmpOrg = NULL; } CPalDC::~CPalDC(void) { if (hpal) SelectPalette(hdc, hpal, FALSE); if (hbmp) VERIFY(SelectObject(hdc, hbmp)); if (hbr) VERIFY(SelectObject(hdc, hbr)); if (hwndDC) ReleaseDC(hwndDC, hdc); else DeleteDC(hdc); if (hbrCreated) DeleteObject(hbrCreated); } void STDCALL CPalDC::SelectPal(HPALETTE hpalSel) { if (hpalSel) { if (hpal) // hpal is set once, and only once SelectPalette(hdc, hpalSel, FALSE); else hpal = SelectPalette(hdc, hpalSel, FALSE); RealizePalette(hdc); } else if (hpal) { SelectPalette(hdc, hpal, FALSE); hpal = NULL; } } void STDCALL CPalDC::SelectBitmap(HBITMAP hbmpSel) { if (hbmpSel) { hbmpOrg = hbmpSel; if (hbmp) // hbmp is set once, and only once SelectObject(hdc, hbmpSel); else VERIFY((hbmp = (HBITMAP) SelectObject(hdc, hbmpSel))); } else if (hbmp) { SelectObject(hdc, hbmp); hbmp = NULL; } } void STDCALL CPalDC::SelectBrush(HBRUSH hbrSel) { if (hbrSel) { if (hbr) // hbr is set once, and only once SelectObject(hdc, hbrSel); else VERIFY((hbr = (HBRUSH) SelectObject(hdc, hbrSel))); } else if (hbr) { SelectObject(hdc, hbr); hbr = NULL; } } void STDCALL CPalDC::SelectBrush(COLORREF clr) { hbrCreated = CreateSolidBrush(clr); SelectBrush(hbrCreated); } void STDCALL CPalDC::DeleteBrush(void) { ASSERT(hbrCreated); SelectBrush((HBRUSH) NULL); DeleteObject(hbrCreated); hbrCreated = NULL; } void STDCALL CPalDC::DeleteBmp(void) { if (hbmp) SelectObject(hdc, hbmp); if (hbmpOrg) DeleteObject(hbmpOrg); hbmp = NULL; } BOOL STDCALL CPalDC::BitBlt(CPalDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop) { BITMAP bmp; GetObject(hbmpOrg, sizeof(BITMAP), &bmp); return ::BitBlt(hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, pSrcDC->hdc, xSrc, ySrc, dwRop); } HBITMAP STDCALL CPalDC::CreateCompatibleBitmap(void) { BITMAP bmp; GetObject(hbmpOrg, sizeof(BITMAP), &bmp); return ::CreateCompatibleBitmap(hdc, bmp.bmWidth, bmp.bmHeight); } void STDCALL CPalDC::FillRect(RECT* prc, COLORREF clr) { HBRUSH hbr = CreateSolidBrush(clr); ::FillRect(hdc, prc, hbr); DeleteObject(hbr); } int CPalDC::GetXAsepect(void) { return MulDiv(GetDeviceWidth(), 1000, GetDeviceCaps(hdc, HORZSIZE)); } int CPalDC::GetYAsepect(void) { return MulDiv(GetDeviceHeight(), 1000, GetDeviceCaps(hdc, VERTSIZE)); }