Howto stocker le contenu d'un RichEdit dans un EMF fichiers
Parfois, vous pouvez stocker le contenu d'un contrôle rich edit dans un métafichier. Cet article présente une approche qui stocke ce type de contenu du contrôle des métafichiers améliorés, une page par métafichier. Le code suivant illustre une méthode pour vider le contenu d'un contrôle rich edit dans les fichiers EMF (une par page):
unité RichEditEMFPrint interface
utilise
Windows, SysUtils, RichEdit, commdlg, des classes, des messages, des Comctrls
procédure RichEditToMetaFile(AControl : TRichEdit AFileName : string)
la mise en œuvre
// GetPrinterDC()
// renvoie une imprimante DC - utilise une Imprimante Commune de la boîte de Dialogue
fonction de GetPrinterDC : HDC
var
pdlg : TPRINTDLG
begin
FillChar(pdlg, sizeof(TPRINTDLG), 0)
pdlg.lStructSize := sizeof( TPRINTDLG )
pdlg.Drapeaux := PD_RETURNDC
PrintDlg(pdlg)
Result := pdlg.hDC
fin
// Obtenir la longueur, en nombre de caractères du texte dans le contrôle
fonction de GetRTFTextLength(hWndRTF : HWND) : integer
begin
Result := SendMessage(hWndRTF, WM_GETTEXTLENGTH, 0, 0 )
fin
// RTFToEMF - Dire le contrôle de tirer lui-même sur le FEM
// Paramètres:
// hRefDC est utilisé pour créer le FEM
// pszMetaFileName est le nom de fichier de la nouvelle EMF (peut être nul)
// prcMeta est le RECT utilisé dans le CreateEnhMetaFile(), 0,01 mm
// parts (ne doit pas être nul)
// hWndRTF est le contrôle de l'intérêt
// nStart est le caractère de départ
// pEnd est un entier qui reçoit la position de
// le caractère suivant pour imprimer d'après cette page
fonction de RTFToEMF(hRefDC : HDC pszMetaFileName : LPCTSTR prcMeta : TRECT
hWndRTF : HWND nStart : entier var pEnd : integer) : HENHMETAFILE
var
hMetaDC : HDC
fr : FORMATRANGE
nTextPrinted : integer
begin
// création de la FEM
hMetaDC := CreateEnhMetaFile( hRefDC, pszMetaFileName, @prcMeta, nil )
if( hMetaDC = 0 ) then
begin
Result := 0
Sortie
fin
ZeroMemory(@fr, sizeof(fr))
// définition de la page (convertir 0,01 mm à twips)
fr.rcPage.haut := prcMeta.gauche*1440 div 2540
fr.rcPage.à gauche := prcMeta.haut*1440 div 2540
fr.rcPage.droit := prcMeta.droit*1440 div 2540
fr.rcPage.en bas := prcMeta.bas*1440 div 2540
// définition de pas de marge tout autour.
fr.rc := fr.rcPage
// définition de la plage de texte à imprimer en nStart à la fin du document
fr.chrg.cpMin := nStart
fr.chrg.cpMax := -1
fr.hdcTarget := hMetaDC
fr.hdc := fr.hdcTarget
// indiquer le contrôle de tirer lui-même sur nos (méta) DC
nTextPrinted := SendMessage(hWndRTF, EM_FORMATRANGE, 1, integer(@(fr)))
pEnd := nTextPrinted
Result := CloseEnhMetaFile( hMetaDC )
fin
// DumpRTFToPagedEMFs - illustre l'utilisation de RTFToEMF() pour créer un EMF
// pour chaque page dans un fichier au format RTF de contrôle
// Paramètres:
// hWndRTFControl - le contrôle
// szEMFFileTitleBase - nom de fichier de base pour les fichiers EMF, un numéro est ajouté
procédure DumpRTFToPagedEMFs(hWndRTFControl : HWND szEMFFileTitleBase : LPTSTR)
var
szMetaName : string
nRTFTextLength, nStart, nPage : integer
hRefDC : HDC
rcMeta : TRECT
hEMF : HENHMETAFILE
begin
// d'Abord déterminer combien de caractères sont dans le RTF
nRTFTextLength := GetRTFTextLength( hWndRTFControl )
// Obtenir une référence DC (basé sur une imprimante)
hRefDC := GetPrinterDC()
// définition de la méta-RECT de 0,01 mm unités
rcMeta := Classes.Rect( 0, 0, GetDeviceCaps(hRefDC, HORZSIZE)*100,
GetDeviceCaps(hRefDC, VERTSIZE)*100 )
nPage := 0
nStart := 0
alors que nStart // Boucle tant que nous n'avons pas atteint la fin du texte dans le contrôle
begin
// construire un nom de fichier pour la page
szMetaName := Format ('%s%d.FEM', [szEMFFileTitleBase, nPage])
// appel de la fonction ci-dessus pour dessiner cette partie de la RTF à la FEM
hEMF := RTFToEMF( hRefDC, PChar(szMetaName), rcMeta, hWndRTFControl,
nStart, nStart )
// nettoyer
DeleteEnhMetaFile( hEMF )
inc(nPage)
si nStart = 0, alors
break
fin
fin
procédure RichEditToMetaFile(AControl : TRichEdit AFileName : string)
begin
DumpRTFToPagedEMFs(AControl.Poignée, PChar(AFileName))
fin
à la fin.
Stocker le contenu d'un richedit dans un emf fichiers
Stocker le contenu d'un richedit dans un emf fichiers : Plusieurs milliers de conseils pour vous faciliter la vie.
Howto stocker le contenu d'un RichEdit dans un EMF fichiers
Parfois, vous pouvez stocker le contenu d'un controle rich edit dans un metafichier. Cet article presente une approche qui stocke ce type de contenu du controle des metafichiers ameliores, une page par metafichier. Le code suivant illustre une methode pour vider le contenu d'un controle rich edit dans les fichiers EMF (une par page):
unite RichEditEMFPrint interface
utilise
Windows, SysUtils, RichEdit, commdlg, des classes, des messages, des Comctrls
procedure RichEditToMetaFile(AControl : TRichEdit AFileName : string)
la mise en œuvre
// GetPrinterDC()
// renvoie une imprimante DC - utilise une Imprimante Commune de la boîte de Dialogue
fonction de GetPrinterDC : HDC
var
pdlg : TPRINTDLG
begin
FillChar(pdlg, sizeof(TPRINTDLG), 0)
pdlg.lStructSize := sizeof( TPRINTDLG )
pdlg.Drapeaux := PD_RETURNDC
PrintDlg(pdlg)
Result := pdlg.hDC
fin
// Obtenir la longueur, en nombre de caracteres du texte dans le controle
fonction de GetRTFTextLength(hWndRTF : HWND) : integer
begin
Result := SendMessage(hWndRTF, WM_GETTEXTLENGTH, 0, 0 )
fin
// RTFToEMF - Dire le controle de tirer lui-meme sur le FEM
// Parametres:
// hRefDC est utilise pour creer le FEM
// pszMetaFileName est le nom de fichier de la nouvelle EMF (peut etre nul)
// prcMeta est le RECT utilise dans le CreateEnhMetaFile(), 0,01 mm
// parts (ne doit pas etre nul)
// hWndRTF est le controle de l'interet
// nStart est le caractere de depart
// pEnd est un entier qui reçoit la position de
// le caractere suivant pour imprimer d'apres cette page
fonction de RTFToEMF(hRefDC : HDC pszMetaFileName : LPCTSTR prcMeta : TRECT
hWndRTF : HWND nStart : entier var pEnd : integer) : HENHMETAFILE
var
hMetaDC : HDC
fr : FORMATRANGE
nTextPrinted : integer
begin
// creation de la FEM
hMetaDC := CreateEnhMetaFile( hRefDC, pszMetaFileName, @prcMeta, nil )
if( hMetaDC = 0 ) then
begin
Result := 0
Sortie
fin
ZeroMemory(@fr, sizeof(fr))
// definition de la page (convertir 0,01 mm a twips)
fr.rcPage.haut := prcMeta.gauche*1440 div 2540
fr.rcPage.a gauche := prcMeta.haut*1440 div 2540
fr.rcPage.droit := prcMeta.droit*1440 div 2540
fr.rcPage.en bas := prcMeta.bas*1440 div 2540
// definition de pas de marge tout autour.
fr.rc := fr.rcPage
// definition de la plage de texte a imprimer en nStart a la fin du document
fr.chrg.cpMin := nStart
fr.chrg.cpMax := -1
fr.hdcTarget := hMetaDC
fr.hdc := fr.hdcTarget
// indiquer le controle de tirer lui-meme sur nos (meta) DC
nTextPrinted := SendMessage(hWndRTF, EM_FORMATRANGE, 1, integer(@(fr)))
pEnd := nTextPrinted
Result := CloseEnhMetaFile( hMetaDC )
fin
// DumpRTFToPagedEMFs - illustre l'utilisation de RTFToEMF() pour creer un EMF
// pour chaque page dans un fichier au format RTF de controle
// Parametres:
// hWndRTFControl - le controle
// szEMFFileTitleBase - nom de fichier de base pour les fichiers EMF, un numero est ajoute
procedure DumpRTFToPagedEMFs(hWndRTFControl : HWND szEMFFileTitleBase : LPTSTR)
var
szMetaName : string
nRTFTextLength, nStart, nPage : integer
hRefDC : HDC
rcMeta : TRECT
hEMF : HENHMETAFILE
begin
// d'Abord determiner combien de caracteres sont dans le RTF
nRTFTextLength := GetRTFTextLength( hWndRTFControl )
// Obtenir une reference DC (base sur une imprimante)
hRefDC := GetPrinterDC()
// definition de la meta-RECT de 0,01 mm unites
rcMeta := Classes.Rect( 0, 0, GetDeviceCaps(hRefDC, HORZSIZE)*100,
GetDeviceCaps(hRefDC, VERTSIZE)*100 )
nPage := 0
nStart := 0
alors que nStart // Boucle tant que nous n'avons pas atteint la fin du texte dans le controle
begin
// construire un nom de fichier pour la page
szMetaName := Format ('%s%d.FEM', [szEMFFileTitleBase, nPage])
// appel de la fonction ci-dessus pour dessiner cette partie de la RTF a la FEM
hEMF := RTFToEMF( hRefDC, PChar(szMetaName), rcMeta, hWndRTFControl,
nStart, nStart )
// nettoyer
DeleteEnhMetaFile( hEMF )
inc(nPage)
si nStart = 0, alors
break
fin
fin
procedure RichEditToMetaFile(AControl : TRichEdit AFileName : string)
begin
DumpRTFToPagedEMFs(AControl.Poignee, PChar(AFileName))
fin
a la fin.