Como imprimir o conteúdo de controles de edição avançada
Esta seção contém informações sobre como imprimir o conteúdo de controles rich edit.
O que você precisa saber
Tecnologias
Pré-requisitos
- C/C++
- Programação da interface do usuário do Windows
Instruções
Usar a visualização de impressão
Para formatar o texto em um controle de edição avançada como ele aparecerá em um dispositivo de destino (geralmente a página impressa), envie a mensagem EM_SETTARGETDEVICE, passando o identificador para um contexto de dispositivo (HDC) do dispositivo de destino e a largura de linha desejada. Normalmente, você obterá a largura da linha chamando GetDeviceCaps para o HDC de destino.
Formatar impressão para um dispositivo específico
Para formatar parte do conteúdo de um controle de edição avançada para um dispositivo específico, envie a mensagem EM_FORMATRANGE. A estrutura FORMATRANGE usada com essa mensagem especifica o intervalo de texto a ser formatado, bem como o HDC do dispositivo de destino. Opcionalmente, essa mensagem também envia o texto para a impressora.
Usar bandas
Bandagem é o processo pelo qual uma única página de saída é gerada usando um ou mais retângulos separados, ou bandas. Quando todas as bandas são colocadas na página, uma imagem completa resulta. Essa abordagem é frequentemente usada por impressoras raster que não têm memória suficiente ou capacidade de criar imagens de uma página inteira ao mesmo tempo.
Para implementar a banda, use a mensagem EM_DISPLAYBAND para enviar partes sucessivas do conteúdo do controle de edição avançada para o dispositivo. Essa mensagem é impressa no dispositivo que foi especificado em uma chamada anterior para EM_FORMATRANGE. É claro que o parâmetro wParam da mensagem EM_FORMATRANGE deve ser zero, para que a impressão não seja iniciada por essa mensagem.
Exemplo de código PrintRTF
O código de exemplo a seguir imprime o conteúdo de um controle rich edit na impressora especificada.
// hwnd is the HWND of the rich edit control.
// hdc is the HDC of the printer. This value can be obtained for the
// default printer as follows:
//
// PRINTDLG pd = { sizeof(pd) };
// pd.Flags = PD_RETURNDC | PD_RETURNDEFAULT;
//
// if (PrintDlg(&pd))
// {
// HDC hdc = pd.hDC;
// ...
// }
BOOL PrintRTF(HWND hwnd, HDC hdc)
{
DOCINFO di = { sizeof(di) };
if (!StartDoc(hdc, &di))
{
return FALSE;
}
int cxPhysOffset = GetDeviceCaps(hdc, PHYSICALOFFSETX);
int cyPhysOffset = GetDeviceCaps(hdc, PHYSICALOFFSETY);
int cxPhys = GetDeviceCaps(hdc, PHYSICALWIDTH);
int cyPhys = GetDeviceCaps(hdc, PHYSICALHEIGHT);
// Create "print preview".
SendMessage(hwnd, EM_SETTARGETDEVICE, (WPARAM)hdc, cxPhys/2);
FORMATRANGE fr;
fr.hdc = hdc;
fr.hdcTarget = hdc;
// Set page rect to physical page size in twips.
fr.rcPage.top = 0;
fr.rcPage.left = 0;
fr.rcPage.right = MulDiv(cxPhys, 1440, GetDeviceCaps(hDC, LOGPIXELSX));
fr.rcPage.bottom = MulDiv(cyPhys, 1440, GetDeviceCaps(hDC, LOGPIXELSY));
// Set the rendering rectangle to the pintable area of the page.
fr.rc.left = cxPhysOffset;
fr.rc.right = cxPhysOffset + cxPhys;
fr.rc.top = cyPhysOffset;
fr.rc.bottom = cyPhysOffset + cyPhys;
SendMessage(hwnd, EM_SETSEL, 0, (LPARAM)-1); // Select the entire contents.
SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&fr.chrg); // Get the selection into a CHARRANGE.
BOOL fSuccess = TRUE;
// Use GDI to print successive pages.
while (fr.chrg.cpMin < fr.chrg.cpMax && fSuccess)
{
fSuccess = StartPage(hdc) > 0;
if (!fSuccess) break;
int cpMin = SendMessage(hwnd, EM_FORMATRANGE, TRUE, (LPARAM)&fr);
if (cpMin <= fr.chrg.cpMin)
{
fSuccess = FALSE;
break;
}
fr.chrg.cpMin = cpMin;
fSuccess = EndPage(hdc) > 0;
}
SendMessage(hwnd, EM_FORMATRANGE, FALSE, 0);
if (fSuccess)
{
EndDoc(hdc);
}
else
{
AbortDoc(hdc);
}
return fSuccess;
}
Tópicos relacionados