Entwickler-Ecke
Windows API - Auf Metafile-Records zugreifen
P_G - Di 19.10.04 10:01
Titel: Auf Metafile-Records zugreifen
Hallo,
Hat jemand ein Code-Beispiel für die Verwendung von ENHMFENUMPROC, um auf die einzelnen Records eines Metafiles und deren Eigenschaften zuzugreifen?
Das Ziel hierbei ist folgendes:
Für jeden Record eines Metafiles soll die damit verbundene Zeichenoperation ermittelt werden (Polyline, Ellipse, Polygon, usw.), sowie die damit verbundenen Coordinaten.
Grüße, P_G
P_G - Di 19.10.04 11:34
Titel: Auf Metafile-Records zugreifen
Keine Vorschläge? Zu schwer für dieses Forum?
Gruß, P_G
jasocul - Di 19.10.04 11:45
Wenn es so einfach wäre, würdest du wohl nicht fragen, oder?
Das Forum ist schon ganz gut, aber bei solchen Spezialitäten, solltest du vielleicht mal ein bisschen warten können. Es sind leider nicht alle Forums-Mitglieder( über 6000) permanent anwesend. Da kann es schon mal vorkommen, dass die Spezis erst später mal nachschauen, was es neues gibt.
P_G - Di 19.10.04 12:27
Titel: Auf Metafile-Records zugeifen
Danke, Jasocul
Hilft mir bislang leider nicht, da es mir um das Windows Enhanced Metafile und nicht um CGM geht.
Der Grundgedanke ist folgender: Man ruft EnumEnhMetafile auf und übergibt (u.a.) die Callback-function EnHMFEnumProc, welche theoretisch Zugriff auf die einzelnen Records erlaubt. Lediglich das Auslesen der Daten gestaltet sich schwierig, da ich keine entsprechende Dokumentation für einen Delphi-Code vorliegen habe.
Gruß, P_G
jasocul - Di 19.10.04 12:58
Ist leider nicht mein Spezialgebiet. Ich habe zwar schon mit API-Aufrufen gearbeitet, aber nicht so, dass ich dir hier effektiv weiter helfen könnte.
Aber, wie schon oben gesagt, ein wenig Geduld sollte helfen.
P_G - Mo 25.10.04 12:32
Ich kann das Problem weiter eingrenzen. Ich erhalte nun für jeden Metafile record die jeweilige Zeichenoperation (im Beispiel unten nur für Polyline16 implementiert) aber die zurückgelieferten Werte für cpts (Größe des Koordinaten-arrays) und apts (Koordinaten-Array) sind vollkommen falsch (um nicht zu sagen bizarr...)
Hat jemand Vorschläge? Diese Sache macht mich langsam verrückt! :(
Delphi-Quelltext
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:
| type TSignChunk = record SignOp : string[5]; Data : Array of TPoint; end;
var Form1: TForm1; SignChunk: TSignChunk; SignArray: Array of TSignChunk;
implementation
{$R *.dfm}
function MyEnhMetafileProc(DC: HDC; lpHTable: PHandleTable; lpEMFR: pEnhMetaRecord; nObj: Integer; TheForm:TForm1):Integer; stdcall; var p: PEMRPolyline16; rec: TENHMetaRecord; i: Integer; nb: Integer; begin PlayEnhMetafileRecord(dc, lpHTable^, lpEMFR^,nObj); case lpEMFR^.iType of EMR_Polyline16 : begin p := PEMRPolyLine16(@rec); nb := p.cpts; SetLength(SignArray, Length(SignArray) + 1); SignArray[High(SignArray)].SignOp := 'Pl'; SetLength(SignArray[High(SignArray)].Data, nb); For I := 0 to nb -1 do begin SignArray[High(SignArray)].Data[I] := Point(p.apts[I].X, p.apts[I].y); end; end; end; result := 1; end;
procedure TForm1.Button1Click(Sender: TObject); var MyMetafile: TMetafile; begin MyMetafile := TMetafile.Create; MyMetafile.LoadFromFile('sample.emf'); SignArray := nil; EnumEnhMetafile(Canvas.Handle, MyMetafile.Handle, @MyEnhMetafileProc, self, rect(0, 0, MyMetafile.Width,MyMetafile.Height)); MyMetafile.Free; end; |
Gruß, P_G
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt.
P_G - Mi 03.11.04 13:11
Habe das Problem gelöst.
P_G
jasocul - Mi 03.11.04 13:18
Dann schreib doch wenigstens wie. Dann kann man das nächste mal nach der Lösung suchen und benötigt kein neues Topic.
apricac - Mi 19.01.05 18:18
Ich bin sehr an Deiner Lösung interessiert...
Grüße
Aprica
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!