Comment stocker le contenu d'un RichEdit dans un fichier EMF

Parfois, vous mai souhaitez stocker le contenu d'un contrôle RichEdit dans un métafichier. Cet article présente une approche que les magasins de ce type de contrôle du contenu dans l'amélioration de métafichiers, une page par métafichier. Le code suivant montre une méthode pour décharger le contenu d'un contrôle d'édition riche en EMF fichiers (un par page):

RichEditEMFPrint unité;

interface

utilise
Windows, sysutils, RichEdit, commdlg, classes, messages, Comctrls;

procédure RichEditToMetaFile (AControl: TRichEdit; AFileName: string);

la mise en œuvre

/ / GetPrinterDC ()
/ / Renvoie une imprimante DC - imprimante utilise la boîte de dialogue commune
fonction GetPrinterDC: HDC;
var
pdlg: TPRINTDLG;
commencer
FillChar (pdlg, sizeof (TPRINTDLG), 0);
pdlg.lStructSize: = sizeof (TPRINTDLG);
pdlg.Flags: = PD_RETURNDC;
PrintDlg (pdlg);
Résultat: = pdlg.hDC;
fin;

/ / Obtenir la longueur, en caractères, du texte dans le contrôle
fonction GetRTFTextLength (hWndRTF: HWND): integer;
commencer
Result: = SendMessage (hWndRTF, WM_GETTEXTLENGTH, 0, 0);
fin;

/ / RTFToEMF - Dites-le contrôle de lui-même de tirer sur les CEM
/ / Paramètres:
/ / HRefDC est utilisé pour créer l'EMF
/ / PszMetaFileName est le nom du fichier de la nouvelle EMF (peut être nul)
/ / Est le prcMeta RECT utilisé à l'CreateEnhMetaFile (), à 0,01
/ / Unités (ne doit pas être nul)
/ / HWndRTF est le contrôle d'intérêts
/ / NStart est l'emplacement à partir de caractères
/ / En attendant est un entier qui reçoit la position de
/ / Le caractère suivant pour imprimer cette page, après
fonction RTFToEMF (hRefDC: HDC; pszMetaFileName: LPCTSTR; prcMeta: TRECT;
hWndRTF: HWND; nStart: integer; var pend: integer): HENHMETAFILE;
var
hMetaDC: HDC;
fr: FORMATRANGE;
nTextPrinted: integer;
commencer
/ / Création de l'EMF
hMetaDC: = CreateEnhMetaFile (hRefDC, pszMetaFileName, @ prcMeta, nil);
if (hMetaDC = 0) alors
commencer
Résultat: = 0;
Exit;
fin;

ZeroMemory (@ fr, sizeof (fr));
/ / Définit la page (à convertir 0.01mm twips)
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;
/ / Set up pas les marges tout autour.
fr.rc: = fr.rcPage;
/ / Définit la plage de texte à imprimer comme nStart à la fin du document
fr.chrg.cpMin: = nStart;
fr.chrg.cpMax: = -1;
fr.hdcTarget: = hMetaDC;
fr.hdc: = fr.hdcTarget;
/ / Dites-le contrôle de lui-même de tirer sur nos (méta) DC
nTextPrinted: = SendMessage (hWndRTF, EM_FORMATRANGE, 1, integer (@ (fr)));
en attendant: = nTextPrinted;
Résultat: = CloseEnhMetaFile (hMetaDC);
fin;

/ / DumpRTFToPagedEMFs - démontre en utilisant RTFToEMF () pour créer un CEM
/ / Pour chaque page dans un contrôle RTF
/ / Paramètres:
/ / HWndRTFControl - le contrôle
/ / SzEMFFileTitleBase - nom de fichier de base pour les fichiers EMF, le nombre est annexé
procédure DumpRTFToPagedEMFs (hWndRTFControl: HWND; szEMFFileTitleBase: LPTSTR);
var
szMetaName: string;
nRTFTextLength, nStart, nPage: integer;
hRefDC: HDC;
rcMeta: TRECT;
hEMF: HENHMETAFILE;
commencer
/ / Tout d'abord, déterminer le nombre de chars sont en RTF
nRTFTextLength: = GetRTFTextLength (hWndRTFControl);
/ / Obtenir une référence DC (sur la base d'une imprimante)
hRefDC: = GetPrinterDC ();
/ / Définit le méta RECT de 0,01 unités
rcMeta: Classes.Rect = (0, 0, GetDeviceCaps (hRefDC, HORZSIZE) * 100,
GetDeviceCaps (hRefDC, VERTSIZE) * 100);
nPage: = 0;
nStart: = 0;
tandis que nStart <nRTFTextLength faire
/ / En boucle alors que nous n'avons pas atteint la fin du texte dans le contrôle
commencer
/ / Construction d'un nom de fichier pour cette page
szMetaName: = Format ( '% s% d.EMF', [szEMFFileTitleBase, nPage]);
/ / Appel de fonction ci-dessus pour tirer de cette partie de la RTF à l'EMF
hEMF: = RTFToEMF (hRefDC, PChar (szMetaName), rcMeta, hWndRTFControl,
nStart, nStart);
/ / Nettoyer
DeleteEnhMetaFile (hEMF);
inc (nPage);
nStart si = 0 alors
break;
fin;
fin;

procédure RichEditToMetaFile (AControl: TRichEdit; AFileName: string);
commencer
DumpRTFToPagedEMFs (AControl.Handle, PChar (AFileName));
fin;

fin.

Average rating: