home *** CD-ROM | disk | FTP | other *** search
- {$define RETAIL_VERSION}
- {!define Win32}
- {***************************************************************************
- Source File Name : BPWMFIMP.PAS
- Autor : Mario M. Westphal
- Erstellt am : 13.02.1993
-
- Compiler : Borland Pascal for Windows 1.x
- Betriebssystem : DOS 5.0, Windows 3.x
- Compiler-Schalter : -
-
- Bemerkungen : -
-
- Beschreibung : Import-Unit fⁿr WMFIMP.DLL
-
- Revisionen : 1.00 13.02.1993 created (MW)
- 07.04.1993 revisited (MW)
- ****************************************************************************}
- {$M 8192,8192}
- {$A+,B-,D+,F-,G+,I+,L+,N-,R+,S+,V+,W-,X+,Q+}
-
- {$ifdef RETAIL_VERSION}
- {$D-,L-,S-,R-,Q-,I-}
- {$endif}
-
- unit bpwmfimp;
-
- INTERFACE
- uses
- WinTypes,
- WinProcs,
- Objects,
- Win31,
- OWindows,
- SysTools,
- ExDlg,
- Strings;
-
- const
- FNAMESIZE = 255; { LΣnge Dateinamen incl. Directory }
-
- { BuiltPal-Codes }
- bpNone = 1; { Keine Palette aufbauen }
- bpBuilt = 2; { Alle Farben des Metafiles in die Palette }
- bpOptimize = 4; { Palette optimieren }
-
- type
- { Informationen ⁿber das geladene Metafile }
- PFileInfo = ^TFileInfo;
- TFileInfo = record
- hMF : THandle; { Globales Handle }
- hPal : HPalette; { Handle auf die Palette }
- OwnPal : Boolean; { Metafile verwendet eigene Palette }
- lSize : LongInt; { Gr÷▀e des Metafiles im globalen Heap }
- rcBBox : TRect; { Umgebendes Rechteck }
- wInch : Word; { Einheiten pro Zoll }
- end;
-
- type
- { Struktur fⁿr LoadMetaFile }
- PFileSpec = ^TFileSpec;
- TFileSpec = record
- Size : Word; { Gr÷▀e der Struktur in Bytes }
- FullName : array[0..FNAMESIZE] of Char; { Dateiname }
- FHandle : Integer; { File-Handle }
- FMode : Word; { Zugriffs-Modus }
- FPos : LongInt; { Aktuelle Position innerhalb der Datei }
- FType : Word; { Datei-Typ (APM, Windows-WMF) }
- PalSpec : Byte; { bpxxx-Konstanten }
- FInfo : TFileInfo; { Informationen ⁿber die geladene Datei }
- end;
-
- type
- { Header einer APM (Placeable Metafile) - Datei }
- TAPMFileHeader = record
- dwKey : LongInt; { Kennung }
- hMF : THandle; { Handle (Default = 0) }
- rcBBox : TRect; { Gr÷▀e der Grafik in logischen Einheiten }
- wInch : Word; { Punkte pro (logische) Zoll }
- dwReserved : LongInt; { Reserved }
- wChecksum : Word; { Wordweise XOR-Prⁿfsumme die ersten 10 Words }
- end;
-
- type
- { Prototypen fⁿr die in der DLL enthaltenen Funktionen }
- TpfnGetFilterVersion = function : Word;
- TpfnLoadFile = function (var FileSpec: TFileSpec) : Integer;
-
- { Routinen fⁿr den Umgang mit APM-Files }
- function PlayMetaFileExtended (AParent: PWindowsObject; DC: HDC; hMF : THandle;
- var NoRecs: LongInt) : Boolean;
-
-
- IMPLEMENTATION
-
- var
- pmfeCounter : LongInt; { Intern: PlayMetafileExtended }
-
- {-------------------------------------------------------------------------------
- Die Callback-Funktion fⁿr CountMetaRecords
-
- PARAMETER:
- Die fⁿr ein Metafile-Callback ⁿblichen Parameter. lParam enthΣlt den
- aktuellen ZΣhler.
- ERGEBNIS:
- Immer <> 0, damit die AufzΣhlung fortgesetzt wird.
- }
- function EnumMetaCount (DC: HDC; var lpHt: THandleTable; var lpMR: TMetaRecord;
- cObj: Integer; var lParam: LongInt) : Integer; EXPORT;
- begin
- inc(lParam);
- EnumMetaCount := 1;
- end;
-
- {-------------------------------------------------------------------------------
- ZΣhlt die im ⁿbergebenen Metafile enthaltenen Records. Benutzt dazu die
- Funktion EnumMetaCount.
-
- PARAMETER:
- AParent: Zeiger auf das Parent-Fenster
- hMF : Metafile-Handle
- ERGEBNIS:
- Liefert die Anzahl der Records im Metafile
- }
- function CountMetaRecords (AParent: PWindowsObject; hMF: THandle) : LongInt;
- var
- EnumFunc : TFarProc;
- l : LongInt;
- begin
- l := 0;
- EnumFunc := MakeProcInstance(@EnumMetaCount,HInstance);
- EnumMetaFile(0,hMF,EnumFunc,@l);
- FreeProcInstance(EnumFunc);
- CountMetaRecords := l;
- end;
-
- {-------------------------------------------------------------------------------
- Erzeugt ein Array aus Elementen des Typs THandle im globalen Speicher.
- Diese Tabelle wird von PlayMetafileExtended verwendet, um fⁿr das Metafile
- angelegte Objekte anzulegen und zu zerst÷ren.
-
- PARAMETER:
- Size : Die Anzahl der Elemente im Array
- ERGEBNIS:
- Die Funktion liefert 0, wenn kein Speicher allokiert werden konnte.
- }
- function CreateHandleTable (Size: LongInt) : THandle;
- begin
- CreateHandleTable := GlobalAlloc(GHND,Size*SizeOf(THandle));
- end;
-
- {-------------------------------------------------------------------------------
- Gibt die durch "lpH" refernzierte HandleTable wieder frei.
-
- PARAMETER:
- lpH : Zeiger auf die freizugebende Handle-Tabelle
- }
- procedure FreeHandleTable (lpH: THandle);
- begin
- GlobalFree(lpH);
- end;
-
- {-------------------------------------------------------------------------------
- Callback-Funktion fⁿr PlayMetafileExtended.
-
- PARAMETER:
- Die fⁿr ein Metafile-Callback ⁿblichen Parameter. lParam enthΣlt den
- Zeiger auf den Prozentbalken-Dialog. Der Prozentbalken wird automatisch
- mitgefⁿhrt.
- ERGEBNIS:
- Immer <> 0, damit die AufzΣhlung fortgesetzt wird.
- }
- function EnumMetaFileFunc (DC: HDC; var lpHt: THandleTable; var lpMR: TMetaRecord;
- cObj: Integer; lParam: PPBarDialog) : Integer; EXPORT;
- begin
- PlayMetaFileRecord(DC,lpHt,lpMR,cObj);
- if lParam <> nil then
- begin
- inc(pmfeCounter);
- lParam^.SetPos(pmfeCounter);
- end;
- { Arbeitet da noch jemand? Wenn ja, la▀t ihn auch mal 'ran }
- KeepWindowsAlive;
- EnumMetafileFunc := 1;
- end;
-
- {-------------------------------------------------------------------------------
- Diese Funktion ersetzt die API-Funktion PlaymetaFile. PlayMetafileExtended
- benutzt eine Callback-Funktion um die einzelnen Metarecords abzuspielen.
- Dadurch kann beim Abspielen eines gro▀en Metafiles die Rechenleistung an
- andere Programme weitergegeben werden und zum Beispiel ein Prozentbalken
- angezeigt werden.
-
- PARAMETER:
- AParent: Zeiger auf das Parent-Fenster
- DC : GerΣtekontext zum Abspielen des Metafiles
- hMF : Metafile-Handle
- NoRecs : Anzahl der Records im Metafile, oder 0, wenn unbekannt
- ERGEBNIS:
- Die Funktion liefert true, wenn das Metafile abgespielt werden konnte.
- }
- function PlayMetaFileExtended (AParent: PWindowsObject; DC: HDC; hMF : THandle;
- var NoRecs: LongInt) : Boolean;
- var
- EnumFunc : TFarProc;
- DCSave : Integer;
- lpHT : THandle;
- Entrys : LongInt;
- Indicator : PPBarDialog;
-
- begin
- { Handle-Tabelle aufbauen, in der die vom Metafile angelegten Objekte gespeichert werden. }
- { Aufrufe der Funktion meta_DeleteObject referenzieren diese Handle-Tabelle, um Objekte }
- { wieder zu entfernen, die vom Metafile angelegt wurden. }
- lpHT := CreateHandleTable(MaxInt);
-
- if lpHT <> 0 then { Handle-Tabelle verfⁿgbar? }
- begin
- { Speichern des ⁿbergebenen DC's }
- DCSave := SaveDC(DC);
-
- { ZΣhle die Anzahl der EintrΣge als Basis fⁿr den Prozentbalken }
- if NoRecs = 0 then
- begin
- Entrys := CountMetaRecords(AParent,hMF);
- { Merke die Anzahl fⁿr zukunftige Aufrufe }
- NoRecs := Entrys;
- end
- else
- Entrys := NoRecs;
-
- { Prozentbalken aufbauen, pmfeCounter ist die Nummer des aktuellen Records }
- pmfeCounter := 0;
- Indicator := PPBarDialog(Application^.MakeWindow(
- New(PPBarDialog,Init(AParent,'Metafile wird aufgebaut',Entrys,false))));
-
- { Keine Aktionen innerhalb der Anwendung erlauben! }
- SetCapture(Indicator^.HWindow);
-
- { Metafile abspielen, Indikator mitfⁿhren }
- EnumFunc := MakeProcInstance(@EnumMetaFileFunc,HInstance);
- EnumMetaFile(DC,hMF,EnumFunc,Indicator);
- FreeProcInstance(EnumFunc);
-
- { Indikator und Handle-Tabelle freigeben, DC wiederherstellen }
- ReleaseCapture;
- Dispose(Indicator,Done);
- FreeHandleTable(lpHT);
- RestoreDC(DC,DCSave);
- PlayMetaFileExtended := true;
- end
- else
- PlayMetaFileExtended := false;
- end;
-
- END.
-