///////////////////////////////////////////////////////////////////////////// // class AgentDisplay public virtual functions bool AgentDisplay::Initiate() { FCB * pFCB = (FCB *)m_pFCB; switch (MESA_TO_C_UNSPECIFIED(pFCB->m_nCommand)) { case kNop: pFCB->m_nStatus = C_TO_MESA_UNSPECIFIED(kSuccess); break; case kSetCLTEntry: SetCLTEntry(); break; case kGetCLTEntry: GetCLTEntry(); break; case kSetInverseVideo: SetInverseVideo(); break; case kSetCursorPattern: SetCursorPattern(); break; case kUpdateRect: UpdateRect(); break; case kMoveRect: MoveRect(); break; case kPatternFillRect: PatternFillRect(); break; default: pFCB->m_nStatus = C_TO_MESA_UNSPECIFIED(kFailure); break; } return true; }
BOOL WIZARD::Template_OnPaintLHS (HWND hLHS) { BOOL fShow16 = FALSE; BOOL fShow256 = FALSE; HDC hdc = GetDC (NULL); WORD wDepthDisplay = (WORD)GetDeviceCaps (hdc, BITSPIXEL); ReleaseDC (NULL, hdc); if ( (m_bmpGraphic256 != NULL) && (wDepthDisplay >= 8) ) fShow256 = TRUE; else if (m_bmpGraphic16 != NULL) fShow16 = TRUE; else return FALSE; PAINTSTRUCT ps; HDC hdcTarget; if ((hdcTarget = BeginPaint (hLHS, &ps)) != NULL) { HBITMAP bmpSource = (fShow256) ? m_bmpGraphic256 : m_bmpGraphic16; BITMAP bm; GetObject (bmpSource, sizeof(BITMAP), &bm); RECT rWindow; GetClientRect (hLHS, &rWindow); RECT rSource = { 0, 0, bm.bmWidth, bm.bmHeight }; RECT rTarget = rWindow; if (cxRECT(rSource) > cxRECT(rTarget)) { MoveRect (&rSource, (cxRECT(rSource) - cxRECT(rTarget)) / 2, 0); rSource.right = rSource.left + cxRECT(rTarget); } else if (cxRECT(rSource) < cxRECT(rTarget)) { MoveRect (&rTarget, (cxRECT(rTarget) - cxRECT(rSource)) / 2, 0); } if (cyRECT(rSource) > cyRECT(rTarget)) { MoveRect (&rSource, 0, (cyRECT(rSource) - cyRECT(rTarget)) / 2); rSource.bottom = rSource.top + cyRECT(rTarget); } else if (cyRECT(rSource) < cyRECT(rTarget)) { MoveRect (&rTarget, 0, (cyRECT(rTarget) - cyRECT(rSource)) / 2); } rTarget.right = rTarget.left + cxRECT(rSource); rTarget.bottom = rTarget.top + cyRECT(rSource); // If the user has supplied a custom draw-proc, then we should // do our rendering to an off-screen bitmap. // HDC hdcFinalTarget = NULL; HBITMAP bmpTempTarget = NULL; if (m_pfnCallback) { // First make sure our offscreen buffer is large enough // if (!m_bmpBuffer || (cxRECT(m_rBuffer) < cxRECT(rWindow)) || (cyRECT(m_rBuffer) < cyRECT(rWindow))) { if (m_bmpBuffer != NULL) DeleteObject (m_bmpBuffer); if ((m_bmpBuffer = CreateCompatibleBitmap (hdcTarget, cxRECT(rWindow), cyRECT(rWindow))) != NULL) { m_rBuffer.right = cxRECT(rWindow); // m_rBuffer.left=already 0 m_rBuffer.bottom = cyRECT(rWindow); // m_rBuffer.top=already 0 } } // Then set up to double-buffer, if possible // if (m_bmpBuffer) { hdcFinalTarget = hdcTarget; hdcTarget = CreateCompatibleDC (hdcFinalTarget); bmpTempTarget = (HBITMAP)SelectObject (hdcTarget, m_bmpBuffer); } } HDC hdcSource = CreateCompatibleDC (hdcTarget); HBITMAP bmpOld = (HBITMAP)SelectObject (hdcSource, bmpSource); HPALETTE palOld = NULL; if ((wDepthDisplay == 8) && (m_palGraphic != NULL) && (fShow256)) { palOld = SelectPalette (hdcTarget, m_palGraphic, FALSE); RealizePalette (hdcTarget); } if ( (bm.bmWidth < cxRECT(rWindow)) || (bm.bmHeight < cyRECT(rWindow)) ) { COLORREF clrFill = GetPixel (hdcSource, 0, rSource.bottom -1); clrFill = ToPALETTERGB(clrFill); HBRUSH hbrFill = CreateSolidBrush (clrFill); if (bm.bmWidth < cxRECT(rWindow)) { RECT rr; rr = rWindow; rr.right = rTarget.left; FillRect (hdcTarget, &rr, hbrFill); rr = rWindow; rr.left = rTarget.right; FillRect (hdcTarget, &rr, hbrFill); } if (bm.bmHeight < cyRECT(rWindow)) { RECT rr; rr = rWindow; rr.bottom = rTarget.top; FillRect (hdcTarget, &rr, hbrFill); rr = rWindow; rr.top = rTarget.bottom; FillRect (hdcTarget, &rr, hbrFill); } DeleteObject (hbrFill); } BitBlt (hdcTarget, rTarget.left, rTarget.top, cxRECT(rTarget), cyRECT(rTarget), hdcSource, rSource.left, rSource.top, SRCCOPY); // Call the user-supplied callback function (if there is one) // if (m_pfnCallback) { (*m_pfnCallback)(this, hdcTarget, &rWindow, (palOld) ? m_palGraphic : NULL); } if (palOld != NULL) SelectPalette (hdcTarget, palOld, FALSE); // If we've been drawing to an off-screen bitmap, blit the result to // the display. // if (hdcFinalTarget) { BitBlt (hdcFinalTarget, rWindow.left, rWindow.top, cxRECT(rWindow), cyRECT(rWindow), hdcTarget, 0, 0, SRCCOPY); SelectObject (hdcTarget, bmpTempTarget); DeleteDC (hdcTarget); hdcTarget = hdcFinalTarget; } SelectObject (hdcSource, bmpOld); DeleteDC (hdcSource); EndPaint (hLHS, &ps); } return TRUE; }