Howto speichern den Inhalt einer RichEdit in einem EMF-Dateien
Manchmal können Sie zum Speichern der Inhalte eines reichen Edit-Control in einer Metadatei. Dieser Artikel beschreibt einen Ansatz, speichert diese Art der Kontrolle der Inhalte im erweiterten Metadateien, eine Seite pro Metadatei. Der folgende Code demonstriert eine Methode, um den Inhalt der Dump einer reichen Edit-Control in EMF-Dateien (eine pro Seite):
Einheit RichEditEMFPrint;
Schnittstelle
Verwendungszwecke
Windows, Sysutils, RichEdit, commdlg, Klassen, Nachrichten, Comctrls;Verfahren RichEditToMetaFile (AControl: TRichEdit; AFileName: string);
Umsetzung
/ / GetPrinterDC ()
/ / Liefert einen Drucker DC - Drucker verwendet gemeinsamen Dialog
Funktion GetPrinterDC: HDC;
var
pdlg: TPRINTDLG;
beginnen
FillChar (pdlg, sizeof (TPRINTDLG), 0);
pdlg.lStructSize: = sizeof (TPRINTDLG);
pdlg.Flags: = PD_RETURNDC;
PrintDlg (pdlg);
Result: = pdlg.hDC;
end;/ / Holen Sie sich die Länge, in der Zeichen, der den Text in die Kontrolle
Funktion GetRTFTextLength (hWndRTF: HWND): integer;
beginnen
Result: = SendMessage (hWndRTF, WM_GETTEXTLENGTH, 0, 0);
end;/ / RTFToEMF - Teile der Kontrolle zu ziehen sich auf die EMF
/ / Parameter:
/ / HRefDC wird verwendet, um die EMF
/ / PszMetaFileName ist der Dateiname des neuen EMF (kann nil)
/ / PrcMeta ist die RECT verwendet, um in CreateEnhMetaFile (), in 0.01mm
/ / Einheiten (nicht Null)
/ / HWndRTF ist die Kontrolle der
/ / NStart ist das Zeichen Standort
/ / Pend ist eine Ganzzahl, die die Position der
/ / Das nächste Zeichen zu drucken, nachdem dieser Seite
Funktion RTFToEMF (hRefDC: HDC; pszMetaFileName: LPCTSTR; prcMeta: TRect;
hWndRTF: HWND; nStart: integer; var pend: integer): HENHMETAFILE;
var
hMetaDC: HDC;
fr: FORMATRANGE;
nTextPrinted: integer;
beginnen
/ / Create the EMF
hMetaDC: = CreateEnhMetaFile (hRefDC, pszMetaFileName, @ prcMeta, nil);
if (hMetaDC = 0) dann
beginnen
Result: = 0;
Exit;
end;ZeroMemory (@ fr, sizeof (FR));
/ / Stellen Sie die Seite (auf Twips umwandeln 0.01mm)
fr.rcPage.top: = prcMeta.left * 1440 div 2540;
fr.rcPage.left: = prcMeta.top * 1440 div 2540;
fr.rcPage.right: = prcMeta.right * 1440 div 2540;
fr.rcPage.bottom: = prcMeta.bottom * 1440 div 2540;
/ / Stellen Sie keine Margen rund um die Uhr.
fr.rc: = fr.rcPage;
/ / Set-up im Bereich der Text zu drucken, wie nStart bis zum Ende des Dokuments
fr.chrg.cpMin: = nStart;
fr.chrg.cpMax: = -1;
fr.hdcTarget: = hMetaDC;
fr.hdc: = fr.hdcTarget;
/ / Teile der Kontrolle auf, sich auf unserer (Meta-) DC
nTextPrinted: = SendMessage (hWndRTF, EM_FORMATRANGE, 1, Integer (@ (fr)));
pend: = nTextPrinted;
Result: = CloseEnhMetaFile (hMetaDC);
end;/ / DumpRTFToPagedEMFs - zeigt mit RTFToEMF (), um eine EMF
/ / Für jede Seite in eine RTF-Kontrolle
/ / Parameter:
/ / HWndRTFControl - die Kontrolle
/ / SzEMFFileTitleBase - Basis-Dateinamen für EMF-Dateien, ist im Anhang
Verfahren DumpRTFToPagedEMFs (hWndRTFControl: HWND; szEMFFileTitleBase: LPTSTR);
var
szMetaName: string;
nRTFTextLength, nStart, nPage: integer;
hRefDC: HDC;
rcMeta: TRect;
hEMF: HENHMETAFILE;
beginnen
/ / First, bestimmen, wie viele Zeichen sind in der RTF -
nRTFTextLength: = GetRTFTextLength (hWndRTFControl);
/ / Get einen Verweis DC (basierend auf einem Drucker)
hRefDC: = GetPrinterDC ();
/ / Stellen Sie die Meta-RECT für 0.01mm Einheiten
rcMeta: = Classes.Rect (0, 0, GetDeviceCaps (hRefDC, HORZSIZE) * 100,
GetDeviceCaps (hRefDC, VERTSIZE) * 100);
nPage: = 0;
nStart: = 0;
während nStart <nRTFTextLength tun
/ / Schleife, während wir noch nicht am Ende des Textes in der
beginnen
/ / Eine Datei für diese Seite
szMetaName: = Format ( "% s% d.EMF ', [szEMFFileTitleBase, nPage]);
/ / Call-Funktion, um diesen Teil der RTF auf dem EMF
hEMF: = RTFToEMF (hRefDC, PChar (szMetaName), rcMeta, hWndRTFControl,
nStart, nStart);
/ / Clean up
DeleteEnhMetaFile (hEMF);
inc (nPage);
wenn nStart = 0, dann
break;
end;
end;Verfahren RichEditToMetaFile (AControl: TRichEdit; AFileName: string);
beginnen
DumpRTFToPagedEMFs (AControl.Handle, PChar (AFileName));
end;Ende.

Delicious
Digg
Google
Yahoo