[fpc-pascal] fpGUI Toolkit on WinCE

Adrian Veith adrian at veith-system.de
Tue Mar 16 13:17:51 CET 2010


Am 16.03.2010 11:22, schrieb Adrian Veith:
> Am 16.03.2010 10:45, schrieb Matt Emson:
>   
>> Adrian Veith wrote:
>>     
>>> ..the bitmaps look scrambled and have different colors.
>>> I haven't found the solution for this yet.
>>>       
>> Ignore that last message. It seems WinCE is only ever little endian.
>> So it is probably more to do with DIB vs general device dependent
>> Bitmaps. Have you tried converting the bitmap in question to a DIB?
>>
>>     
> I am so far that I found that the procedure SetDIBits is not supported
> on WinCE (that's why it is commented out in the WinCE build). So the
> Bitmap is not initialized with the data loaded from the file and shows
> random crap.
>
> I have to find  way how to initialize the bitmap without SetDIBits (and
> in a efficient way).
>
>   

My solution for the moment is:

{$IFDEF wince}
procedure WinCESetInitBMP(BMP: HBITMAP; awidth, aheight, depth: Integer;
aimgdata: Pointer);
var
  hdcSrc, hdcDest: HDC;
  hbmSrc: HBITMAP;
  bm: BITMAP;
  data, p, pend: pByte;
begin
  hdcSrc:= CreateCompatibleDC(0);
  hdcDest:= CreateCompatibleDC(0);
  hbmSrc:= CreateBitmap(awidth, aheight, 1, depth, nil);
  if depth = 32 then
    SetBitmapBits(hbmSrc, (awidth * aheight) *4, aimgdata)
  else
    SetBitmapBits(hbmSrc, (awidth * aheight) div 8, aimgdata);
  SelectObject(hdcSrc, hbmSrc);
  SelectObject(hdcDest, BMP);
  BitBlt(hdcDest, 0, 0, awidth, aheight, hdcSrc, 0, 0, SRCCOPY);
  DeleteDC(hdcSrc);
  DeleteDC(hdcDest);
  DeleteObject(hbmSrc);
end;
{$ENDIF}


and change the code in TfpgGDIImage.DoInitImage to

  {$IFNDEF wince}
  SetDIBits(wapplication.display, FBMPHandle, 0, aheight, aimgdata, bi,
DIB_RGB_COLORS);
  {$else}
  WinCESetInitBMP(FBMPHandle, awidth, aheight, bi.bmiHeader.biBitCount,
aimgdata);
  {$ENDIF}

and in TfpgGDIImage.DoInitImageMask to:

  {$IFNDEF wince}
  SetDIBits(wapplication.display, FMaskHandle, 0, aheight, aimgdata,
pbi^, DIB_RGB_COLORS);
  {$ELSE}
  WinCESetInitBMP(FMaskHandle, awidth, aheight, bi.bmiHeader.biBitCount,
aimgdata);
  {$ENDIF}

now bitmaps are loaded an painted correctly, but still the stdimg.xxx
(e.g. stdimg.close) are not painted correctly 
- I guess there is a problem with the masking.

Adrian.



More information about the fpc-pascal mailing list