//////////////////////////////////////////////////////////// // TBitmap256Control // ----------------- // Display bitmap in DC void TBitmap256Control::DisplayBitmap (TDC& dc, TRect &rect) { // Display a cross if no bitmap if ( pDIBInfo == 0 ) { dc.SelectObject(TPen(TColor::LtGray)); dc.MoveTo (0, 0); dc.LineTo (MaxWidth, MaxHeight); dc.MoveTo (0, MaxHeight); dc.LineTo (MaxWidth, 0); dc.SetTextAlign(TA_CENTER); dc.SetTextColor(TColor::White); dc.SetBkColor(TColor::Black); char tmp[40]; if ( BitmapName[0] != '\0' && BitmapName[0] != '-' ) wsprintf (tmp, "No picture (%s)", BitmapName); else wsprintf (tmp, "No picture"); dc.TextOut (MaxWidth / 2, MaxHeight / 2 - 6, tmp); return; } assert (pBitmapPalette != NULL); // pBitmapPalette->UnrealizeObject(); dc.SelectObject (*pBitmapPalette); dc.RealizePalette(); dc.SetStretchBltMode (COLORONCOLOR); #if 1 TRect ZoomRect; ZoomRect.left = rect.left; ZoomRect.top = rect.top; ZoomRect.right = rect.right; ZoomRect.bottom = rect.bottom; // Convert the rect. size to a rect in the sprite rect.left /= ZoomFactor; rect.top /= ZoomFactor; rect.right /= ZoomFactor; rect.bottom /= ZoomFactor; TRect DIBRect; DIBRect.left = rect.left; DIBRect.top = BitmapYSize - rect.bottom; // DIBs are Y inversed DIBRect.right = DIBRect.left + rect.Width(); DIBRect.bottom = DIBRect.top + rect.Height(); dc.StretchDIBits (ZoomRect, DIBRect, pDIBits, *pDIBInfo, DIB_PAL_COLORS, SRCCOPY); #else // Create memory DC and display bitmap TMemoryDC mdc (dc); mdc.SelectObject (*pBitmapPalette); mdc.SelectObject (*pBitmap); dc.StretchBlt(0, 0, ZoomXSize, ZoomYSize, mdc, 0, 0, BitmapXSize, BitmapYSize, SRCCOPY); // Restore GDI objects mdc.RestoreBitmap(); mdc.RestorePalette(); #endif dc.RestorePalette(); }
// /// Paints the DIB onto the window. // void TPictureWindow::Paint(TDC& dc, bool /*erase*/, TRect& /*rect*/) { TPointer<TPalette> palette(0); bool hasPalette = ToBool(dc.GetDeviceCaps(RASTERCAPS) & RC_PALETTE); TDib* dib = GetDib(); if (dib) { if (hasPalette) { palette = new TPalette(*GetDib()); dc.SelectObject(*palette); dc.RealizePalette(); } // figure out upper left corner of the client area // TRect clientRect(GetClientRect()); TPoint sourcePoint(0, 0); // adjust the upper left corner for centering picture // if (HowToDisplay == Center) { // determine offsets // int offsetX = abs(dib->Width() - clientRect.Width()) / 2; if (dib->Width() > clientRect.Width()) sourcePoint.x += offsetX; else clientRect.Offset(offsetX, 0); int offsetY = abs(dib->Height() - clientRect.Height()) / 2; if (dib->Height() > clientRect.Height()) sourcePoint.y += offsetY; else clientRect.Offset(0, offsetY); } // adjust the lower right corner // if (HowToDisplay != Stretch) { clientRect.bottom = clientRect.top + dib->Height(); clientRect.right = clientRect.left + dib->Width(); // if the picture is larger than screen dimensions, // adjust the upper left corner. // clientRect.top -= sourcePoint.y; clientRect.left -= sourcePoint.x; } // display the dib // switch (HowToDisplay) { case UpperLeft: case Center: dc.SetDIBitsToDevice(clientRect, sourcePoint, *dib); // if(!dc.SetDIBitsToDevice(clientRect, sourcePoint, *dib)){ // TSystemMessage().MessageBox(); // } break; case Stretch: { TRect sourceRect(0, 0, dib->Width(), dib->Height()); dc.StretchDIBits(clientRect, sourceRect, *dib); break; } } // switch HowToDisplay dc.RestoreObjects(); } }