Come stampare il contenuto dei controlli Rich Edit
Questa sezione contiene informazioni su come stampare il contenuto dei controlli di modifica avanzati.
Informazioni importanti
Tecnologie
Prerequisiti
- C/C++
- Programmazione dell'interfaccia utente di Windows
Istruzioni
Usare l'anteprima di stampa
Per formattare il testo in un controllo di modifica rtf come verrà visualizzato in un dispositivo di destinazione (in genere la pagina stampata), inviare il messaggio EM_edizione Standard TTARGETDEVICE, passando l'handle a un contesto di dispositivo (HDC) del dispositivo di destinazione e la larghezza della linea desiderata. In genere si otterrà la larghezza della linea chiamando GetDeviceCaps per l'HDC di destinazione.
Formattare la stampa per un dispositivo specifico
Per formattare parte del contenuto di un controllo di modifica avanzato per un dispositivo specifico, inviare il messaggio di EM_FORMATRANGE . La struttura FORMATRANGE usata con questo messaggio specifica l'intervallo di testo da formattare e l'HDC per il dispositivo di destinazione. Facoltativamente, questo messaggio invia anche il testo alla stampante.
Usare il banding
Banding è il processo in base al quale viene generata una singola pagina di output usando uno o più rettangoli separati o bande. Quando tutte le bande vengono posizionate nella pagina, viene restituita un'immagine completa. Questo approccio viene spesso usato dalle stampanti raster che non hanno memoria sufficiente o capacità di creare un'immagine di una pagina intera contemporaneamente.
Per implementare il raggruppamento, usare il messaggio EM_DISPLAYBAND per inviare parti successive del contenuto del controllo di modifica rtf al dispositivo. Questo messaggio viene stampato nel dispositivo specificato in una chiamata precedente a EM_FORMATRANGE. Naturalmente, il parametro wParam del messaggio di EM_FORMATRANGE deve essere zero, in modo che la stampa non venga avviata da tale messaggio.
Esempio di codice PrintRTF
Il codice di esempio seguente stampa il contenuto di un controllo rich edit sulla stampante specificata.
// 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;
}
Argomenti correlati