在改写directx8的directdraw的windowedmode的例子时,总是不能正确的创建palette,准确的说是lpSF.SetPalette(lpDDPal);时说“invalid pixel format。..."
谁能给个正确的例子?下次把我的代码给帖出来。
(lpSF : IDirectDrawSurface7;
 lpDDPal : IDirectDrawPalette;)

解决方案 »

  1.   

    我试了好几种方法,其中之一如下:
    lpDD : IDirectDraw7;
    lpSF : IDirectDrawSurface7;
    lpPal : IDirectDrawPalette;
    dret : HResult;
    bmp : TBitMap;
    hbmp : HBitmap;
    palsize : integer;
    pal : TMaxLogPalette;
    begin
     lpPal := nil;
     bmp := TBitmap.create;
     bmp.LoadFromResourceName(0,'directx');
     hbmp := bmp.Handle;
     if GetObject(bmp.palette,sizeof(palsize),@palsize) = 0  then
      begin messagebox(0,'Get Bmp Pal size error','Information',mb_ok+mb_iconinformation);
      bmp.free;  exit;
      end;
     with pal do 
     begin
       palNumEntries := palsize;
       palVersion := $300;
       GetPaletteEntries(bmp.Palette,0,palsize,palPalEntry);
     end;
     ByteSwapColors(pal.palPalEntry,pal.palNumEntries);
     dret := lpDD.CreatePalette(DDCAPS_8BIT,@pal.palPalEntry,lpPla,nil);
     //Here,dret = DD_OK
     dret := lpSF.SetPalette(lpPal);
     //这里出错。"The pixel format was invalid as specified."
    是不是窗口模式下的palette有特殊要求?
      

  2.   

    自己找到答案了。
    var
     pal : array[0..255]of TTrueColor;
     lpPal : IDirectDrawPalette;
     tb : TBitmap;
    begin
     tb:=TBitmap.Create;
     tb.LoadFromFile('C:\abc.bmp');
     GetPaletteEntries(tb.Palette,0,255,pal);
     lpDD.CreatePalette(DDPCAPS_8BIT,@pal,lpPal,nil); //lpDD:IDirectDraw
     lpSF.SetPalette(lpPal);             //lpSF:IDirectDrawSurface
     tb.free;
    end;关键问题是没搞清楚TableColor及palette的意义,呵呵。