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.


jasocul - Di 19.10.04 12:01

Vielleicht hilft dir dies [http://www.delphipraxis.net/topic25411_binaerdatei+lesen+und+durchsuchen.html&highlight=metafile] ja weiter.


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(00, MyMetafile.Width,MyMetafile.Height)); 
 MyMetafile.Free; 
end;


Gruß, P_G

Moderiert von user profile iconChristian 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