1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
{%MainUnit ../graphics.pp}
{******************************************************************************
TBitmapCanvas
******************************************************************************
*****************************************************************************
This file is part of the Lazarus Component Library (LCL)
See the file COPYING.modifiedLGPL.txt, included in this distribution,
for details about the license.
*****************************************************************************
}
{------------------------------------------------------------------------------
Method: TBitmapCanvas.Create
Params: ABitMap: the owner of the class
Returns: Nothing
Constructor for the class.
------------------------------------------------------------------------------}
constructor TBitmapCanvas.Create(AImage: TRasterImage);
begin
inherited Create;
// set FImage after inherited create to make sure that the inherited Create
// won't trigger a call to FImage
FImage := AImage;
end;
{------------------------------------------------------------------------------
Method: TBitmapCanvas.CreateHandle
Params: None
Returns: Nothing
Creates the handle.
------------------------------------------------------------------------------}
procedure TBitmapCanvas.CreateHandle;
var
DC: HDC;
begin
if HandleAllocated then exit;
if FImage = nil then exit;
FImage.BitmapHandleNeeded;
FImage.PaletteNeeded;
if FImage.FSharedImage.BitmapCanvas <> nil then
(FImage.FSharedImage.BitmapCanvas as TBitmapCanvas).FreeDC;
FImage.FSharedImage.BitmapCanvas := Self;
DC := CreateCompatibleDC(0);
if FImage.BitmapHandleAllocated
then FOldBitmap := SelectObject(DC, FImage.BitmapHandle)
else FOldBitmap := 0;
if FImage.PaletteAllocated
then begin
FOldPalette := SelectPalette(DC, FImage.Palette, True);
RealizePalette(DC);
end
else begin
FOldPalette := 0;
end;
// since moveto doesn't force a unshare, it is possible that a moveto was
// done in the old DC.
with PenPos do
LCLIntf.MoveToEx(DC, X, Y, nil);
Handle := DC;
//DebugLn('TBitmapCanvas.CreateHandle END Self=',DbgS(Self),' DC=',DbgS(DC),
// ' Handle=',DbgS(GetUpdatedHandle([csHandleValid])));
end;
{------------------------------------------------------------------------------
Method: TBitmapCanvas.Destroy
Params: None
Returns: Nothing
Destructor for the class.
------------------------------------------------------------------------------}
destructor TBitmapCanvas.Destroy;
begin
FreeDC;
inherited Destroy;
end;
{------------------------------------------------------------------------------
Method: TControlCanvas.FreeDC
Params: None
Returns: Nothing
Frees the device context
------------------------------------------------------------------------------}
procedure TBitmapCanvas.FreeDC;
var
OldHandle: HBITMAP;
begin
if not HandleAllocated then exit;
//DebugLn('TBitmapCanvas.FreeDC START Self=',DbgS(Self),' FBitmap=',DbgS(FBitmap));
if FImage = nil
then begin
Handle := 0;
Exit;
end;
OldHandle := FHandle;
Handle := 0;
FImage.FSharedImage.BitmapCanvas := nil;
if FOldBitmap <> 0
then begin
SelectObject(OldHandle, FOldBitmap);
FOldBitmap := 0;
end;
if FOldPalette <> 0
then begin
SelectPalette(OldHandle, FOldPalette, True);
FOldPalette := 0;
end;
DeleteDC(OldHandle);
end;
// included by graphics.pp
|