Как получить доступ к объекту метафайла
Материал из DRKB
Below is an example of getting metafile information and enumerating each metafile record:
function MyEnhMetaFileProc(DC: HDC; { handle to device context }
lpHTable: PHANDLETABLE; { pointer to metafile handle table }
lpEMFR: PENHMETARECORD; { pointer to metafile record }
nObj: Integer; { count of objects }
TheForm: TForm1): Integer; stdcall;
begin
{ draw the metafile record }
PlayEnhMetaFileRecord(dc, lpHTable^, lpEMFR^, nObj);
{ set to zero to stop metafile enumeration }
Result := 1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
MyMetafile: TMetafile;
lpENHMETAHEADER: PENHMETAHEADER; { extra metafile info }
lpENHMETAHEADERSIZE: DWORD;
NumMetaRecords: DWORD;
begin
{ Create a metafile }
MyMetafile := TMetafile.Create;
with TMetafileCanvas.Create(MyMetafile, 0) do
try
Brush.Color := clRed;
Ellipse(0, 0, 100, 100);
Ellipse(100, 100, 200, 200);
Ellipse(200, 200, 300, 300);
Ellipse(300, 300, 400, 400);
Ellipse(400, 400, 500, 500);
Ellipse(500, 500, 600, 600);
finally
Free;
end;
{ we might as well get some extra metafile info }
lpENHMETAHEADERSIZE := GetEnhMetaFileHeader(MyMetafile.Handle, 0, nil);
NumMetaRecords := 0;
if (lpENHMETAHEADERSIZE > 0) then
begin
GetMem(lpENHMETAHEADER, lpENHMETAHEADERSIZE);
GetEnhMetaFileHeader(MyMetafile.Handle, lpENHMETAHEADERSIZE, lpENHMETAHEADER);
{ Here is an example of getting number of metafile records }
NumMetaRecords := lpENHMETAHEADER^.nRecords;
{ enumerate the records }
EnumEnhMetaFile(Canvas.Handle, MyMetafile.Handle, @MyEnhMetaFileProc, self,
Rect(0, 0, 600, 600));
FreeMem(lpENHMETAHEADER, lpENHMETAHEADERSIZE);
end;
MyMetafile.Free;
end;
Source: http://www.baltsoft.com/
ID: 03814