[fpc-pascal] fpGUI Toolkit on WinCE

Adrian Veith adrian at veith-system.de
Tue Mar 16 14:03:08 CET 2010

Am 16.03.2010 13:17, schrieb Adrian Veith:
> 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).
Now my second solution works:

{$IFDEF wince}
procedure WinCESetDibBits(BMP: HBITMAP; awidth, aheight: Integer;
aimgdata: Pointer; var bi: TBitmapInfo);
  hdcSrc, hdcDest: HDC;
  hbmSrc: HBITMAP;
  bm: BITMAP;
  hdcDest:= CreateCompatibleDC(0);
  SelectObject(hdcDest, BMP);
  if bi.bmiHeader.biBitCount = 1 then begin
    SetDIBitsToDevice(hdcDest, 0, 0, awidth, aheight, 0, 0, 0, aheight,
aimgdata, bi, DIB_RGB_COLORS);
  end else begin
    hdcSrc:= CreateCompatibleDC(0);
    hbmSrc:= CreateBitmap(awidth, aheight, 1, bi.bmiHeader.biBitCount,
    SelectObject(hdcSrc, hbmSrc);
    BitBlt(hdcDest, 0, 0, awidth, aheight, hdcSrc, 0, 0, SRCCOPY);


and the change for TfpgGDIImage.DoInitImage:

  {$IFNDEF wince}
  SetDIBits(wapplication.display, FBMPHandle, 0, aheight, aimgdata, bi,
  WinCESetDibBits(FBMPHandle, awidth, aheight, aimgdata, bi);

and for TfpgGDIImage.DoInitImageMask

  {$IFNDEF wince}
  SetDIBits(wapplication.display, FMaskHandle, 0, aheight, aimgdata,
  WinCESetDibBits(FMaskHandle, awidth, aheight, aimgdata, pbi^);

with the patch for loading 32bit bitmaps posted before you can call
fpgCreateStandardImages; in fpg_main:

  {--$IFNDEF wince}
  (*  causes EBusError on Symbol MC1000 WinCE 4.2
  see: http://wiki.freepascal.org/Windows_CE_Development_Notes
  "Using ARM processors, some times you may get a EBusError exception with
  a message about misaligned data access.  The following section explains
  what this is and how to fix it." - fixed

cheers Adrian.

More information about the fpc-pascal mailing list