// clear the existing palette
SetSystemPaletteUse (hdc, SYSPAL_NOSTATIC);
SetSystemPaletteUse (hdc, SYSPAL_STATIC);
PALETTEENTRY *pPeDest = &pe.palPalEntry[0];
for (int iOn=0; iOn<255; iOn++, pPeDest++)
{
pPeDest->peRed = 0;
pPeDest->peGreen = 0;
pPeDest->peBlue = 0;
pPeDest->peFlags = PC_NOCOLLAPSE;
}
hPal = CreatePalette (&pe);
HPALETTE hOldPal = SelectPalette (hdc, hPal, FALSE);
RealizePalette (hdc);
SelectPalette (hdc, hOldPal, FALSE);
RealizePalette (hdc);
// get the system palette entries
int iNumSys = GetDeviceCaps (hdc, NUMCOLORS);
GetSystemPaletteEntries (hdc, 0, 256, pe.palPalEntry);
// set to the new color table
RGBQUAD *pRgbDest = &bmi.rgb[0];
pPeDest = &pe.palPalEntry[0];
// first system colors
for (iOn=0; iOn<iNumSys/2; iOn++, pRgbDest++, pPeDest++)
{
pRgbDest->rgbRed = pPeDest->peRed;
pRgbDest->rgbGreen = pPeDest->peGreen;
pRgbDest->rgbBlue = pPeDest->peBlue;
pRgbDest->rgbReserved = 0;
}
// our colors
RGBQUAD _far *pRgbSrc = ((RGBQUAD _far *) (&bmi + 1)) + iNumSys / 2;
for (; iOn<256-iNumSys/2; iOn++, pRgbDest++, pPeDest++, pRgbSrc++)
{
pRgbDest->rgbRed = pPeDest->peRed = pRgbSrc->rgbRed;
pRgbDest->rgbGreen = pPeDest->peGreen = pRgbSrc->rgbGreen;
pRgbDest->rgbBlue = pPeDest->peBlue = pRgbSrc->rgbBlue;
pPeDest->peFlags = PC_RESERVED;
}
// the last system colors
for (; iOn<256; iOn++, pRgbDest++, pPeDest++)
{
pRgbDest->rgbRed = pPeDest->peRed;
pRgbDest->rgbGreen = pPeDest->peGreen;
pRgbDest->rgbBlue = pPeDest->peBlue;
}
// set the palette & WinG bitmap
DeleteObject (hPal);
hPal = CreatePalette (&pe);
SelectPalette (hdc, hPal, FALSE);
RealizePalette (hdc);
WinGSetDIBColorTable (gDC, 0, 256, bmi.rgb);
// OK, now Windows & WinG are set to the new palette.
// Don't forget to paint <g>