PaintPalette example for C++ Builder

This example sets the paint palette to the palette of each Lead control. It then loads two images and dithers them to 8 bits per pixel with optimized palettes, and displays them side by side. In 8-bit display mode, you can see the palette problems that result when you do not use a fixed palette.

void __fastcall TForm1::Button3Click(TObject *Sender)
{
   int HeightFactor1, WidthFactor1,
   HeightFactor2, WidthFactor2,
   HeightAllowed, WidthAllowed;
   //Let the controls use the bitmaps' own palettes.
   Lead1->PaintPalette = ppAuto;
   Lead2->PaintPalette = ppAuto;
   //Disable automatic repainting of the image.
   Lead1->AutoRepaint = False;
   Lead2->AutoRepaint = False;
   //Turn off scroll bars to make sure we use the full client area.
   Lead1->AutoScroll = False;
   Lead2->AutoScroll = False;
   //Clear the bitmaps from memory
   Lead1->Bitmap = 0;
   Lead2->Bitmap = 0;
   Screen->Cursor = crHourGlass;
   //Load the bitmaps. These hard-coded path names may be different on your system.
   Lead1->Load("C:\\lead\\IMAGES\\IMAGE1.CMP", 0, 0, 1);
   Lead2->Load("C:\\lead\\IMAGES\\IMAGE2.CMP", 0, 0, 1);
   //Change the bitmaps to 8 BPS with optimized palettes
   Lead1->ColorRes(8, CRF_OPTIMIZEDPALETTE, CRF_FLOYDSTEINDITHERING, 0);
   Lead2->ColorRes(8, CRF_OPTIMIZEDPALETTE, CRF_FLOYDSTEINDITHERING, 0);
   //Make the controls visible so that we can size and position them.
   //They will not really appear until we load an image and paint it.
   Lead1->Visible = True;
   Lead2->Visible = True;
   //Set the variables used for preserving the aspect ratio.
   HeightFactor1 = Lead1->BitmapHeight;
   WidthFactor1 = Lead1->BitmapWidth;
   HeightFactor2 = Lead2->BitmapHeight;
   WidthFactor2 = Lead2->BitmapWidth;
   HeightAllowed = (ClientHeight * 8) / 10;
   WidthAllowed = (ClientWidth * 45) / 100;
   //Center each LEAD control on half of the form, preserving the aspect ratio.
   //Check to see if using the maximum width will make the image too tall.
   //Set the dimensions based on the result.
   if ((WidthAllowed * HeightFactor1) / WidthFactor1 < HeightAllowed)
   {
      Lead1->Left =  (ClientWidth / 4) - (WidthAllowed / 2);
      Lead1->Width = WidthAllowed;
      Lead1->Height = (Lead1->Width * HeightFactor1) / WidthFactor1;
      Lead1->Top = (ClientHeight - Lead1->Height) / 2;
   }
   else
   {
      Lead1->Top = (ClientHeight - HeightAllowed) / 2;
      Lead1->Height = HeightAllowed;
      Lead1->Width = (Lead1->Height * WidthFactor1) / HeightFactor1;
      Lead1->Left = (ClientWidth / 4) - (Lead1->Width / 2);
   }

   if ((WidthAllowed * HeightFactor2) / WidthFactor2 < HeightAllowed) 
   {
      Lead2->Left = (ClientWidth * 3/4) - (WidthAllowed / 2);
      Lead2->Width = WidthAllowed;
      Lead2->Height = (Lead2->Width * HeightFactor2) / WidthFactor2;
      Lead2->Top = (ClientHeight - Lead2->Height) / 2;
   }
   else
   {
      Lead2->Top = (ClientHeight - HeightAllowed) / 2;
      Lead2->Height = HeightAllowed;
      Lead2->Width = (Lead2->Height * WidthFactor2) / HeightFactor2;
      Lead2->Left = (ClientWidth * 3 / 4) - (Lead2->Width / 2);
   }
   
   //Set the image display sizes to match the LEAD controls
   Lead1->SetDstRect(0, 0, Lead1->BitmapWidth, Lead1->BitmapHeight);
  Lead1->SetDstClipRect(0, 0, Lead1->BitmapWidth, Lead1 >BitmapHeight);
   Lead2->SetDstRect(0, 0, Lead2->BitmapWidth, Lead2->BitmapHeight);
  Lead2->SetDstClipRect(0, 0, Lead2->BitmapWidth, Lead2 >BitmapHeight);
   //Display the images
   Lead1->ForceRepaint();
   Lead2->ForceRepaint();
   Screen->Cursor = crDefault;
}