Domanda

Ho una funzione di disegno che prende solo un HDC. Ma ho bisogno di mostrare una versione esatta in scala di quella che sarà la stampa.

Al momento, io uso CreateCompatibleDC () con un HDC stampante e CreateCompatibleBitmap () con HDC della stampante.

Immagino che in questo modo il DC avrà larghezza esatta della stampante e l'altezza. E quando seleziono i font in questo HDC, il testo verrà scalata esattamente come farebbe la stampante.

Purtroppo, non posso a uno StretchBlt () per copiare i pixel di questo HDC alla HDC del controllo dato che sono di diversi tipi HDC credo.

Se creo la "tela di memoria" da una finestra HDC con lo stesso w, h come page della stampante, i caratteri escono WAY Teeny dato che sono in scala per il grande schermo, non pagina ...

Dovrei CreateCompatibleDC () da DC della finestra e CreateCompatibleBitmap () da DC o qualcosa della stampante ??

Se qualcuno potrebbe spiegare il modo giusto per farlo. (E hanno ancora qualcosa che appare esattamente come farebbe su stampante) ...

Bene, io lo apprezzerei !!

... Steve

È stato utile?

Soluzione

A seconda di come precisa che si desidera essere, questo può ottenere difficile.

Ci sono molti approcci. Sembra che si sta cercando di attirare a una bitmap di stampa di dimensioni e poi restringersi verso il basso. I passi da fare sono che:

  1. Crea un DC (o, meglio ancora, un IC - informazioni di contesto). Per la stampante
  2. Interrogare la stampante DC per scoprire la risoluzione, il formato pagina, offset fisici, ecc.
  3. Creare una corrente continua per la finestra / schermo.
  4. Crea un DC compatibile (la memoria DC).
  5. Creare un bitmap compatibile per la finestra / schermo, ma la dimensione dovrebbe essere la dimensione dei pixel della pagina della stampante. (Il problema di questo approccio è che si tratta di una bitmap enorme e può fallire.)
  6. Selezionare la bitmap compatibile nella memoria DC.
  7. Disegna alla memoria DC, utilizzando le stesse coordinate si userebbe se il disegno alla stampante vera e propria. (Quando si seleziona i caratteri, assicurarsi che li scalare per pollice logico della stampante, non pollice logico dello schermo.)
  8. StretchBlt memoria controller alla finestra, che ridimensionare l'intera immagine. Si potrebbe desiderare di sperimentare la modalità di tratto per vedere cosa funziona meglio per il tipo di immagine che si vuole visualizzare.
  9. Release tutte le risorse.

Ma prima di testa in quella direzione, prendere in considerazione le alternative. Questo approccio prevede che attribuisce un enorme bitmap fuori schermo. Questo può fallire su computer con scarse risorse. Anche se così non fosse, si potrebbe essere morendo di fame altre applicazioni.

L'approccio metafile dato in un'altra risposta è una buona scelta per molte applicazioni. Mi piacerebbe iniziare con questo.

Un altro approccio è quello di capire tutti i formati in qualche unità ad alta risoluzione immaginario. Ad esempio, si supponga tutto è in 1000ths di pollice. Allora la vostra routine disegnare potrebbero scalare questa unità immaginaria alla dpi effettivamente utilizzato dal dispositivo di destinazione.

Il problema di questo ultimo approccio (e possibilmente il metafile uno) è che i font GDI non sono scalabili perfettamente lineare. Le larghezze di singoli caratteri vengono ottimizzato a seconda della risoluzione di destinazione. In un dispositivo ad alta risoluzione (come una stampante laser 300+ dpi), questo tweaking è minimo. Ma su uno schermo 96-dpi, le modifiche possono aggiungere fino a un errore significativo per tutta la lunghezza di una linea. Così potrebbe apparire il testo nella finestra di anteprima out-of-quota (in genere più larga) di quanto non faccia sulla pagina stampata.

In questo modo l'approccio Hardcore è quello di misurare il testo nel contesto della stampante, e misurare di nuovo nel contesto dello schermo, e regolare per la discrepanza. Per esempio (usando numeri fatti-up), si potrebbe misurare la larghezza del testo nel contesto della stampante, e si esce a 900 pixel di stampante. Supponiamo che il rapporto di pixel stampante per schermare pixel è 3: 1. Ci si aspetterebbe lo stesso testo sullo schermo per essere di 300 pixel di larghezza dello schermo. Ma si misura nel contesto dello schermo e si ottiene un valore come 325 pixel dello schermo. Quando si disegna sullo schermo, si dovrà fare in qualche modo il testo 25 pixel più stretto. È possibile ram i personaggi più vicini, o scegliere un font leggermente più piccolo e poi stendere.

L'approccio Hardcore comporta maggiore complessità. Si potrebbe, per esempio, provare a rilevare le sostituzioni di carattere è composto dal driver della stampante e li corrispondere il più possibile con i caratteri dello schermo disponibili.

Ho avuto buona fortuna con un ibrido del big-bitmap e gli approcci hardcore. Invece di fare una bitmap gigante per l'intera pagina, faccio uno abbastanza grande per una riga di testo. Poi disegno a grandezza stampante al bitmap fuori schermo e StretchBlt verso il basso per la dimensione dello schermo. Questo elimina trattare con la discrepanza dimensioni con una leggera degradazione della qualità del carattere. E 'adatto per reale anteprima di stampa, ma non si vuole costruire un editor WYSIWYG del genere. La bitmap di una riga è abbastanza piccolo da rendere questa pratica.

La buona notizia è solo il testo è difficile. Tutti gli altri disegno è una semplice scala di coordinatiche e le dimensioni.

non ho usato GDI + molto, ma penso che ha eliminato con il ridimensionamento del carattere non lineare. Quindi, se si sta utilizzando GDI +, si dovrebbe solo avere per scalare le coordinate. Lo svantaggio è che non credo che la qualità del carattere in GDI + è buono.

E, infine, se sei un'applicazione nativa su Vista o poi, assicurati di aver segnato il processo come " DPI-aware". In caso contrario, se l'utente si trova su uno schermo ad alta DPI, Windows mentire a voi e sostengono che la risoluzione è soltanto 96 dpi e poi fare un Fuzzy up-scaling di qualsiasi si disegna. Questo degrada la qualità visiva e può fare il debug di anteprima di stampa ancora più complicata. Dal momento che così tanti programmi non si adattano bene alle alte schermi DPI, Microsoft ha aggiunto "scaling ad alta DPI" di partenza di default in Vista.

A cura di aggiungere

Un altro avvertimento: Se si seleziona un HFONT nella memoria CC con la bitmap della stampante di dimensioni, è possibile che si ottiene un tipo di carattere diverso rispetto a quello che sarebbe ottenere quando si seleziona la stessa HFONT nella stampante reale DC. Questo perché alcuni driver di stampante sostituiranno caratteri comuni con quelli in memoria. Ad esempio, alcune stampanti PostScript sostituirà un carattere interno PostScript per determinati tipi di carattere TrueType comune.

È possibile selezionare prima la HFONT nella stampante IC, quindi utilizzare funzioni GDI come GetTextFace, GetTextMetrics, e magari GetOutlineTextMetrics per scoprire il font effettivo selezionato. Quindi è possibile creare un nuovo LOGFONT per cercare di avvicinarsi di più ciò che la stampa avrebbe usato, trasformarla in un HFONT, e selezionare che nella vostra memoria DC. Questo è il segno di una buona implementazione.

Altri suggerimenti

Una cosa che potrebbe essere la pena di provare è quello di creare un metafile avanzato DC, disegnare ad esso come normale e poi scalare questa metafile utilizzando il formato stampante. Questo è l'approccio utilizzato dal WTL campione BmpView - Non so quanto accurata questo sarà ma potrebbe essere la pena di guardare (dovrebbe essere facile da porta le classi rilevanti per Win32, ma WTL è un ottimo sostituto per la programmazione Win32 quindi forse vale la pena utilizzare.)

Beh, non avrà lo stesso aspetto, perché si ha una risoluzione più alta nella stampante DC, quindi dovrete scrivere una funzione di conversione di sorta. Mi piacerebbe andare con il metodo che devi lavorare, ma il testo era troppo piccolo e basta moltiplicare ogni dimensione della posizione / font dalla larghezza della finestra della stampante e dividere per la larghezza della finestra di origine.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top