Autor Beitrag
P_G
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 75

Win XP
Delphi 7 / 8 Enterprise
BeitragVerfasst: Di 19.10.04 10:01 
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 75

Win XP
Delphi 7 / 8 Enterprise
BeitragVerfasst: Di 19.10.04 11:34 
Keine Vorschläge? Zu schwer für dieses Forum?

Gruß, P_G
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 19.10.04 12:01 
Vielleicht hilft dir dies ja weiter.
P_G Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 75

Win XP
Delphi 7 / 8 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 75

Win XP
Delphi 7 / 8 Enterprise
BeitragVerfasst: 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! :(

ausblenden volle Höhe 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 75

Win XP
Delphi 7 / 8 Enterprise
BeitragVerfasst: Mi 03.11.04 13:11 
Habe das Problem gelöst.

P_G
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mi 19.01.05 18:18 
Ich bin sehr an Deiner Lösung interessiert...

Grüße
Aprica