Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2 | daniel-mar | 1 | unit DropBMPTarget; |
2 | |||
3 | // ----------------------------------------------------------------------------- |
||
4 | // Project: Drag and Drop Component Suite |
||
5 | // Component Names: TDropBMPSource |
||
6 | // Module: DropBMPSource |
||
7 | // Description: Implements Dragging & Dropping of Bitmaps |
||
8 | // FROM your application to another. |
||
9 | // Version: 3.7 |
||
10 | // Date: 22-JUL-1999 |
||
11 | // Target: Win32, Delphi 3 - Delphi 5, C++ Builder 3, C++ Builder 4 |
||
12 | // Authors: Angus Johnson, ajohnson@rpi.net.au |
||
13 | // Anders Melander, anders@melander.dk |
||
14 | // http://www.melander.dk |
||
15 | // Copyright © 1997-99 Angus Johnson & Anders Melander |
||
16 | // ----------------------------------------------------------------------------- |
||
17 | |||
18 | interface |
||
19 | |||
20 | uses |
||
21 | DropSource, |
||
22 | DropTarget, |
||
23 | Windows, Classes, Graphics, ActiveX; |
||
24 | |||
25 | {$include DragDrop.inc} |
||
26 | |||
27 | type |
||
28 | TDropBMPTarget = class(TDropTarget) |
||
29 | private |
||
30 | fBitmap: TBitmap; |
||
31 | protected |
||
32 | procedure ClearData; override; |
||
33 | function DoGetData: boolean; override; |
||
34 | function HasValidFormats: boolean; override; |
||
35 | public |
||
36 | constructor Create(AOwner: TComponent); override; |
||
37 | destructor Destroy; override; |
||
38 | property Bitmap: TBitmap Read fBitmap; |
||
39 | end; |
||
40 | |||
41 | procedure Register; |
||
42 | procedure CopyDIBToBitmap(Bitmap: TBitmap; BitmapInfo: PBitmapInfo; DIBSize: integer); |
||
43 | |||
44 | implementation |
||
45 | |||
46 | const |
||
47 | DIBFormatEtc: TFormatEtc = (cfFormat: CF_DIB; |
||
48 | ptd: nil; dwAspect: DVASPECT_CONTENT; lindex: -1; tymed: TYMED_HGLOBAL); |
||
49 | BMPFormatEtc: TFormatEtc = (cfFormat: CF_BITMAP; |
||
50 | ptd: nil; dwAspect: DVASPECT_CONTENT; lindex: -1; tymed: TYMED_GDI); |
||
51 | PalFormatEtc: TFormatEtc = (cfFormat: CF_PALETTE; |
||
52 | ptd: nil; dwAspect: DVASPECT_CONTENT; lindex: -1; tymed: TYMED_GDI); |
||
53 | |||
54 | procedure Register; |
||
55 | begin |
||
56 | RegisterComponents('DragDrop', [TDropBMPTarget]); |
||
57 | end; |
||
58 | |||
59 | // ----------------------------------------------------------------------------- |
||
60 | // Miscellaneous DIB Function |
||
61 | // ----------------------------------------------------------------------------- |
||
62 | |||
63 | procedure CopyDIBToBitmap(Bitmap: TBitmap; BitmapInfo: PBitmapInfo; DIBSize: integer); |
||
64 | var |
||
65 | BitmapFileHeader : TBitmapFileHeader; |
||
66 | FileSize : integer; |
||
67 | InfoSize : integer; |
||
68 | Stream : TMemoryStream; |
||
69 | begin |
||
70 | // Write DIB to a stream in the BMP file format |
||
71 | Stream := TMemoryStream.Create; |
||
72 | try |
||
73 | FileSize := sizeof(TBitmapFileHeader) + DIBSize; |
||
74 | InfoSize := sizeof(TBitmapInfoHeader); |
||
75 | if (BitmapInfo^.bmiHeader.biBitCount > 8) then |
||
76 | begin |
||
77 | if ((BitmapInfo^.bmiHeader.biCompression and BI_BITFIELDS) <> 0) then |
||
78 | Inc(InfoSize, 12); |
||
79 | end else |
||
80 | Inc(InfoSize, sizeof(TRGBQuad) * (1 shl BitmapInfo^.bmiHeader.biBitCount)); |
||
81 | Stream.SetSize(FileSize); |
||
82 | // Initialize file header |
||
83 | FillChar(BitmapFileHeader, sizeof(TBitmapFileHeader), 0); |
||
84 | with BitmapFileHeader do |
||
85 | begin |
||
86 | bfType := $4D42; // 'BM' = Windows BMP signature |
||
87 | bfSize := FileSize; // File size (not needed) |
||
88 | bfOffBits := sizeof(TBitmapFileHeader) + InfoSize; // Offset of pixel data |
||
89 | end; |
||
90 | // Save file header |
||
91 | Stream.Write(BitmapFileHeader, sizeof(TBitmapFileHeader)); |
||
92 | // Save TBitmapInfo structure and pixel data |
||
93 | Stream.Write(BitmapInfo^, DIBSize); |
||
94 | |||
95 | // Rewind and load bitmap from stream |
||
96 | Stream.Position := 0; |
||
97 | Bitmap.LoadFromStream(Stream); |
||
98 | finally |
||
99 | Stream.Free; |
||
100 | end; |
||
101 | end; |
||
102 | |||
103 | // ----------------------------------------------------------------------------- |
||
104 | // TDropBMPTarget |
||
105 | // ----------------------------------------------------------------------------- |
||
106 | |||
107 | constructor TDropBMPTarget.Create( AOwner: TComponent ); |
||
108 | begin |
||
109 | inherited Create( AOwner ); |
||
110 | fBitmap := TBitmap.Create; |
||
111 | end; |
||
112 | // ----------------------------------------------------------------------------- |
||
113 | |||
114 | destructor TDropBMPTarget.Destroy; |
||
115 | begin |
||
116 | fBitmap.Free; |
||
117 | inherited Destroy; |
||
118 | end; |
||
119 | // ----------------------------------------------------------------------------- |
||
120 | |||
121 | function TDropBMPTarget.HasValidFormats: boolean; |
||
122 | begin |
||
123 | result := (DataObject.QueryGetData(DIBFormatEtc) = S_OK) or |
||
124 | (DataObject.QueryGetData(BMPFormatEtc) = S_OK); |
||
125 | end; |
||
126 | // ----------------------------------------------------------------------------- |
||
127 | |||
128 | procedure TDropBMPTarget.ClearData; |
||
129 | begin |
||
130 | fBitmap.handle := 0; |
||
131 | end; |
||
132 | // ----------------------------------------------------------------------------- |
||
133 | |||
134 | function TDropBMPTarget.DoGetData: boolean; |
||
135 | var |
||
136 | medium, medium2: TStgMedium; |
||
137 | DIBData: pointer; |
||
138 | begin |
||
139 | result := false; |
||
140 | //-------------------------------------------------------------------------- |
||
141 | if (DataObject.GetData(DIBFormatEtc, medium) = S_OK) then |
||
142 | begin |
||
143 | if (medium.tymed = TYMED_HGLOBAL) then |
||
144 | begin |
||
145 | DIBData := GlobalLock(medium.HGlobal); |
||
146 | try |
||
147 | CopyDIBToBitmap(fBitmap, DIBData, GlobalSize(Medium.HGlobal)); |
||
148 | result := true; |
||
149 | finally |
||
150 | GlobalUnlock(medium.HGlobal); |
||
151 | end; |
||
152 | end; |
||
153 | ReleaseStgMedium(medium); |
||
154 | end |
||
155 | //-------------------------------------------------------------------------- |
||
156 | else if (DataObject.GetData(BMPFormatEtc, medium) = S_OK) then |
||
157 | begin |
||
158 | try |
||
159 | if (medium.tymed <> TYMED_GDI) then exit; |
||
160 | if (DataObject.GetData(PalFormatEtc, medium2) = S_OK) then |
||
161 | begin |
||
162 | try |
||
163 | fBitmap.LoadFromClipboardFormat(CF_BITMAP, Medium.hBitmap, Medium2.hBitmap); |
||
164 | finally |
||
165 | ReleaseStgMedium(medium2); |
||
166 | end; |
||
167 | end |
||
168 | else |
||
169 | fBitmap.LoadFromClipboardFormat(CF_BITMAP, Medium.hBitmap, 0); |
||
170 | result := true; |
||
171 | finally |
||
172 | ReleaseStgMedium(medium); |
||
173 | end; |
||
174 | end |
||
175 | //-------------------------------------------------------------------------- |
||
176 | else |
||
177 | result := false; |
||
178 | end; |
||
179 | // ----------------------------------------------------------------------------- |
||
180 | // ----------------------------------------------------------------------------- |
||
181 | |||
182 | end. |