Howto armazenar o conteúdo de um ficheiros RichEdit em um EMF

Às vezes, você pode querer armazenar o conteúdo de um controle rich edit em um metarquivo. Este artigo descreve uma abordagem que armazena este tipo de controlo do conteúdo na metarquivos reforçada, uma página por metarquivo. O seguinte código demonstra um método para despejar o conteúdo de um controle rich edit em arquivos EMF (um por página):

RichEditEMFPrint unidade;

interface

utilizações
Windows, SysUtils, RichEdit, commdlg, classes, mensagens, Comctrls;

procedimento RichEditToMetaFile (AControl: TRichEdit; AFileName: string);

execução

/ / GetPrinterDC ()
/ / Retorna uma impressora DC - impressora usa Common Dialog
GetPrinterDC função: HDC;
var
pdlg: TPRINTDLG;
começo
FillChar (pdlg, sizeof (TPRINTDLG), 0);
pdlg.lStructSize: = sizeof (TPRINTDLG);
pdlg.Flags: = PD_RETURNDC;
PrintDlg (pdlg);
Resultado: = pdlg.hDC;
final;

/ / Obtém o comprimento, em caracteres, do texto no controle
função GetRTFTextLength (hWndRTF: HWND): integer;
começo
Resultado: = SendMessage (hWndRTF, WM_GETTEXTLENGTH, 0, 0);
final;

/ / RTFToEMF - Diga o Controlo de chamar a si próprio sobre a EMF
/ / Parâmetros:
/ / HRefDC é utilizado para criar o EMF
/ / PszMetaFileName é o nome do arquivo do novo EMF (pode ser nulo)
/ / PrcMeta é usada para corrigir os no CreateEnhMetaFile (), com 0,01 milímetros
/ / Unidades (não deve ser nulo)
/ / HWndRTF é o controle dos juros
/ / NStart está iniciando o caráter local
/ / Pend é um inteiro que recebe o cargo de
/ / O próximo personagem depois de imprimir esta página
função RTFToEMF (hRefDC: HDC; pszMetaFileName: LPCTSTR; prcMeta: TRECT;
hWndRTF: HWND; nStart: integer; var Pend: integer): HENHMETAFILE;
var
hMetaDC: HDC;
fr: FORMATRANGE;
nTextPrinted: integer;
começo
/ / Cria o EMF
hMetaDC: = CreateEnhMetaFile (hRefDC, pszMetaFileName, @ prcMeta, nil);
if (hMetaDC = 0) então
começo
Resultado: = 0;
Exit;
final;

ZeroMemory (@ fr, sizeof (fr));
/ / Configurar a página (0.01 milímetros para converter 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 sem margens toda a volta.
fr.rc: = fr.rcPage;
/ / Definir o intervalo de texto a ser impresso como nStart ao final do documento
fr.chrg.cpMin: = nStart;
fr.chrg.cpMax: = -1;
fr.hdcTarget: = hMetaDC;
fr.hdc: = fr.hdcTarget;
/ / Diga o comando de chamar a si próprio no nosso (meta) DC
nTextPrinted: = SendMessage (hWndRTF, EM_FORMATRANGE, 1, integer (@ (fr)));
Pend: = nTextPrinted;
Resultado: = CloseEnhMetaFile (hMetaDC);
final;

/ / DumpRTFToPagedEMFs - demonstra usando RTFToEMF () para criar um EMF
/ / Para cada página de um controlo RTF
/ / Parâmetros:
/ / HWndRTFControl - o controle
/ / SzEMFFileTitleBase - base ficheiro para ficheiros EMF, o número é anexado
procedimento DumpRTFToPagedEMFs (hWndRTFControl: HWND; szEMFFileTitleBase: LPTSTR);
var
szMetaName: string;
nRTFTextLength, nStart, nPage: integer;
hRefDC: HDC;
rcMeta: TRECT;
hEMF: HENHMETAFILE;
começo
/ / Em primeiro lugar, determinar quantos caracteres estão no formato RTF
nRTFTextLength: = GetRTFTextLength (hWndRTFControl);
/ / Obtém uma referência DC (com base em uma impressora)
hRefDC: = GetPrinterDC ();
/ / Configurar a meta de 0,01 milímetros rect unidades
rcMeta: Classes.Rect = (0, 0, GetDeviceCaps (hRefDC, HORZSIZE) * 100,
GetDeviceCaps (hRefDC, VERTSIZE) * 100);
nPage: = 0;
nStart: = 0;
enquanto nStart <nRTFTextLength fazer
/ / Loop enquanto não tivermos chegado ao final do texto no controle
começo
/ / Construir um nome de arquivo para esta página
szMetaName: = Format ( '% s% d.EMF', [szEMFFileTitleBase, nPage]);
/ / Chamada função acima de chamar a esta parcela da TFCC sobre o EMF
hEMF: = RTFToEMF (hRefDC, PChar (szMetaName), rcMeta, hWndRTFControl,
nStart, nStart);
/ / Clean up
DeleteEnhMetaFile (hEMF);
inc (nPage);
= 0, em seguida, se nStart
break;
final;
final;

procedimento RichEditToMetaFile (AControl: TRichEdit; AFileName: string);
começo
DumpRTFToPagedEMFs (AControl.Handle, PChar (AFileName));
final;

fim.

Average rating: