256 color palette problem
Posted on 1999-01-20
ok, i have a problem with trying to draw custom colors from a palette on a dc. The dc is in an overridden and subclassed static box that I'm using as a window in my dialog box to draw in.
I'm creating a palette with 40 entires (shades of blue).
LPLOGPALETTE lpPal = (LPLOGPALETTE)new BYTE[
sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nNumColors)];
if (lpPal != NULL)
lpPal->palVersion = 0x300;
lpPal->palNumEntries = 40;
PALETTEENTRY *ppe = lpPal->palPalEntry;
for (int i=0; i<40-1; i++)
lpPal->palPalEntry[i].peRed = 0;
lpPal->palPalEntry[i].peGreen = 0;
lpPal->palPalEntry[i].peBlue = (255-(i*5));
lpPal->palPalEntry[i].peFlags = 0;
bSucc = m_Pal.CreatePalette(lpPal);
Then in the OnPaint routine, I am first Selecting in the palette to the DC
CPalette *pPalOld = dc.SelectPalette(&m_Pal, false);
then I am realizing the pallete on the DC.
then i am setting a single pixel to a shade of blue that I have realized in the palette.
int i = 10;
dc.SetPixel( 0, 0, RGB( 0, 0, (255*(i*5)) ) );
then I am checking that pixel to see what color it actually came up with.
p = dc.GetPixel( 0, 0 );
now, at this point p should contain rgb values of 0,0,205. But instead is contains 0,0,128 (a system color). So what the heck is going on!!! I know it realized the palette (or at least I think this is what it means) because when I do the following check on the palette, I examine the logpalette it returns and its got all my colors
in there no problem (although its missing all the system colors, not sure why).
CPalette *CTPal = dc.GetCurrentPalette();
tpal = (PALETTEENTRY *)malloc( sizeof(PALETTEENTRY)*256 );
memset( tpal, 0, sizeof(PALETTEENTRY) * 256 );
CTPal->GetPaletteEntries( 0, 256, tpal );
free( tpal );
the return value on GetPaletteEntries is 40 which is the correct number of colors in my custom palette.
so my question is, what the heck is going wrong here!!!! This is driving me nuts, i've been working on this problem for 2 days now and I can't seem to figure it out. Any help would be GREATLY appreciated.
note: I also tried using a CPen to draw the dot with. (insert this code up where the getpixel is).
CPen *tempPen = new CPen( PS_SOLID, 1, RGB( 0, 0, 255-(i*5) ) );
CPen *oldPen = dc.SelectObject( tempPen );
it should also be noted here that when I run this test in 16 bit mode, the GetPixel comes up with %100 the right value.