// 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; iOnrgbRed = 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