Howto memorizzare il contenuto di un RichEdit in un file EMF
A volte, può essere utile per memorizzare il contenuto di un ricco controllo di modifica in un metafile. Questo articolo descrive un approccio che memorizza questo tipo di controllo del contenuto in una maggiore metafile, una pagina per metafile. Il codice seguente mostra un metodo per scaricare il contenuto di un ricco controllo di modifica in file EMF (uno per pagina):
RichEditEMFPrint unità;
interfaccia
usa
Windows, SysUtils, RichEdit, commdlg, le classi, i messaggi, Comctrls;procedura RichEditToMetaFile (AControl: TRichEdit; AFileName: string);
attuazione
/ / GetPrinterDC ()
/ / Restituisce una stampante DC - stampante utilizza comune finestra di dialogo
funzione GetPrinterDC: HDC;
var
pdlg: TPRINTDLG;
iniziare
FillChar (pdlg, sizeof (TPRINTDLG), 0);
pdlg.lStructSize: = sizeof (TPRINTDLG);
pdlg.Flags: = PD_RETURNDC;
PrintDlg (pdlg);
Risultato: = pdlg.hDC;
fine;/ / Get the lunghezza, in caratteri, del testo nel controllo
funzione GetRTFTextLength (hWndRTF: HWND): integer;
iniziare
Risultato: = SendMessage (hWndRTF, WM_GETTEXTLENGTH, 0, 0);
fine;/ / RTFToEMF - Raccontaci di controllo per disegnare sul EMF
/ / Parametri:
/ / HRefDC è utilizzato per creare l'EMF
/ / PszMetaFileName è il nome del file della nuova EMF (può essere pari a zero)
/ / È la prcMeta RECT utilizzati al CreateEnhMetaFile (), a 0,01 millimetri
/ / Unità (non dovrebbe essere pari a zero)
/ / HWndRTF è il controllo di interesse
/ / NStart è la posizione di partenza carattere
/ / Attesa è un intero che riceve la posizione di
/ / Il carattere successivo alla stampa, dopo questa pagina
funzione RTFToEMF (hRefDC: HDC; pszMetaFileName: LPCTSTR; prcMeta: TRECT;
hWndRTF: HWND; nStart: integer; var attesa: integer): HENHMETAFILE;
var
hMetaDC: HDC;
fr: FORMATRANGE;
nTextPrinted: integer;
iniziare
/ / Crea l'EMF
hMetaDC: = CreateEnhMetaFile (hRefDC, pszMetaFileName, @ prcMeta, zero);
if (hMetaDC = 0) allora
iniziare
Risultato: = 0;
Uscita;
fine;ZeroMemory (@ fr, sizeof (fr));
/ / Imposta pagina (0,01 millimetri di convertire twips)
fr.rcPage.top: = prcMeta.left div 2540 * 1440;
fr.rcPage.left: = prcMeta.top div 2540 * 1440;
fr.rcPage.right: = prcMeta.right div 2540 * 1440;
fr.rcPage.bottom: = prcMeta.bottom div 2540 * 1440;
/ / Imposta margini non tutto l'intorno.
fr.rc: = fr.rcPage;
/ / Imposta l'intervallo di testo per la stampa come nStart alla fine del documento
fr.chrg.cpMin: = nStart;
fr.chrg.cpMax: = -1;
fr.hdcTarget: = hMetaDC;
fr.hdc: = fr.hdcTarget;
/ / Tell a trarre il controllo sulla nostra stessa (meta) DC
nTextPrinted: = SendMessage (hWndRTF, EM_FORMATRANGE, 1, intero (@ (fr)));
in attesa: = nTextPrinted;
Risultato: CloseEnhMetaFile = (hMetaDC);
fine;/ / DumpRTFToPagedEMFs - dimostra utilizzando RTFToEMF () per creare un EMF
/ / Per ogni pagina in un controllo RTF
/ / Parametri:
/ / HWndRTFControl - il controllo
/ / SzEMFFileTitleBase - il nome del file di base per i campi elettromagnetici file, il numero è allegato
procedura DumpRTFToPagedEMFs (hWndRTFControl: HWND; szEMFFileTitleBase: LPTSTR);
var
szMetaName: stringa;
nRTFTextLength, nStart, nPage: integer;
hRefDC: HDC;
rcMeta: TRECT;
hEMF: HENHMETAFILE;
iniziare
/ / In primo luogo, determinare il numero di caratteri sono in formato RTF
nRTFTextLength: = GetRTFTextLength (hWndRTFControl);
/ / Ottenere un riferimento CC (sulla base di una stampante)
hRefDC: = GetPrinterDC ();
/ / Imposta la meta RECT per unità di 0,01 millimetri
rcMeta: Classes.Rect = (0, 0, GetDeviceCaps (hRefDC, HORZSIZE) * 100,
GetDeviceCaps (hRefDC, VERTSIZE) * 100);
nPage: = 0;
nStart: = 0;
mentre nStart <nRTFTextLength fare
/ / Loop, mentre non abbiamo raggiunto la fine del testo nel controllo
iniziare
/ / Costruzione di un nome di file di questa pagina
szMetaName: = Format ( '% s% d.EMF', [szEMFFileTitleBase, nPage]);
/ / Chiamiamo la funzione di cui sopra a trarre questa porzione del RTF sulla EMF
hEMF: = RTFToEMF (hRefDC, PChar (szMetaName), rcMeta, hWndRTFControl,
nStart, nStart);
/ / Clean up
DeleteEnhMetaFile (hEMF);
inc (nPage);
se nStart = 0 allora
break;
fine;
fine;procedura RichEditToMetaFile (AControl: TRichEdit; AFileName: string);
iniziare
DumpRTFToPagedEMFs (AControl.Handle, PChar (AFileName));
fine;fine.

Delicious
Digg
Google
Yahoo