Newsgroup: it.comp.lang.visual-basic
Titolo: >>>>> PREVIEW DI STAMPA <<<<<

Io Crystal Report non riesco proprio a sopportarlo per cui mi sono
creato un mio preview di stampa personale. Devo dire che non è niente
male a parte il fatto che "ciuccia" un casino di memoria.
L'idea di fondo (se può interessare a qualcuno) è stata quella di
utilizzare un controllo PICTURE che ha le stesse dimensioni dell'oggetto
PRINTER ed in tale oggetto andare a piazzare il testo, le linee ecc..
Ora, al momento del preview a video utilizzo l'oggetto PICTURE e al
momento della stampa utilizzo l'oggetto PRINTER: con un'unica routine
riesco a gestire sia il preview che la stampa.
Il problema di fondo è questo: l'oggetto PICTURE inizializza un'area di
memoria per contenere i dati da visualizzare, e la quantità di memoria
utilizzata dipende dalla larghezza, dall'altezza e dalla profondità del
colore. Supponiamo ad es. che utilizzi una PICTURE che ha dimensione
100x100 pixel. L'area di memoria utilizzata sara:
100x100x4=40.000 bytes con 16 colori
100x100x8=80.000 bytes con 256 colori
100x100x16=160.000 bytes con 65.535 colori
100x100x24=240.000 bytes con 16M di colori
...
Il problema è che io da VB non riesco a gestire la profondità del colore
dell'oggetto PICTURE in quanto dipende dalla risoluzione video corrente
del sistema. Questo significa che per un preview di 100 pagine, ad una
profondità di colore di 65.535 colori, la quantità di memoria richiesta
è di 16.000.000 Mb per un solo quadrattino di 100x100 pixel!!!
Ora, visto che in genere le stampe sono in bianco e nero, a me
basterebbe una profondità di colore a 1 bit (...bianco e nero): questo
starebbe a significare che 100x100 pixel mi occupano 1250 bytes e la
cosa è più che accettabile.
ALLORA: chiedo se esiste una API che mi fa una decrementazione del
colore a 1 bit partendo un'immagine sorgente (un controllo PICTURE o un
file BMP) a qualsiasi profondità di colore e mi ritorna l'immagine
elaborata (su un altro controllo PICTURE o su un file BMP). In pratica
devo fare un po' come Paint Shop Pro/Photoshop/Corel Draw.. che da
un'immagine a x colori mi ritornano solo toni di bianco o nero. Non
importa se il metodo di decrementazione sia "colore più vicino" o
"diffusione d'errore" perchè comunque il sorgente avrà solo colori
bianco o nero.
Spero di essermi spiegato bene e soprattutto spero che qualcuno sia in
grado di darmi un aiuto.
Grazie, Massimo.

Premetto che non sono molto sicuro di quello che dico, ma la
visualizzazione di un'immagine sullo schermo dipende dalla risoluzione
del video, Windows fa automaticamente la conversione al dispositivo sul
quale vuoi stampare (schermo, stampante, plotter, ecc) quindi è
indipendente dal numero di colori.
N.B. per visualizzare 16,256,65535,24 colori sono necessari
rispettivamente 4,8,16,24 bit, non bytes.
Max ha scritto:


Premetto che non sono molto sicuro di quello che dico, ma la
visualizzazione di un'immagine sullo schermo dipende dalla risoluzione
del video, Windows fa automaticamente la conversione al dispositivo sul
quale vuoi stampare (schermo, stampante, plotter, ecc) quindi è
indipendente dal numero di colori.
N.B. per visualizzare 16,256,65535,24 colori sono necessari
rispettivamente 4,8,16,24 bit, non bytes.
Ciao Bruno

 along with the VB programmer's guide to the Win32 API.
... ma non mi è troppo chiaro...
Non sono stato troppo conciso.. ma almeno spero di essere stato chiaro.
Grazie a tutti quelli che mi risponderano.
Bruno La Torre ha scritto:



Il Modo ovviamente c'e'.
Ti posso solo indirizzare.
Devi craere una nuova bitmap a 2 colori, creare un nuovo
DeviceContest come quello del Video (printer.hDC) ed associargli la bitmap,
disegnare dentro al nuovo hDC, e poi fare un bel BitBlt() sulla
Picture.
Rimando a chi ha qualche sorgente sotto mano.
-- 
Hi, Ciao
Ettore                 By -MES-
http://freeweb.aspide.it/freeweb/ilmes
Il sito comune di programmatori VB
http://members.xoom.com/it_lang_vb

creato un mio preview di stampa personale......

Perchè quando devo fare stampe di recordset complessi (magari con dati che
derivano da più tabelle) creare il layout non sempre è cosa facile e non
sempre riesco a fare la stampa proprio come la volevo. Inoltre, come fai a
dirgli che se il record preso in considerazione ha un certo valore nel campo x
allora stampi anche qualcos'altro (magari andando in una pagina nuova) oppure
se ha valore negativo allora cambia colore e font...
Inoltre mi secca che CR vada a rifare un select sul Database quando a livello
di applicazione ne ho uno io già pronto (per quello che ne so non è possibile
passagli un rs già pronto). Metti il caso che abbia aperto il DB in accesso
esclusivo..?
Quella di creare gruppi di 2-3 pagine al colpo non è fattibile. Se devo
saltare alla pagina 54, quanti record del rs dovrei passare (tenendo presente
che non tutti i record possono avere la stessa dimensione nella pagina)?
Dovrei simulare la stampa di 53 pagine e poi prendere in considerazione la 54
ma tanto vale allora crearle tutte quante, salvarle in files BMP temporanei e
poi caricare al volo qualle necessaria. La mia richiesta era semplicemente
quella di fare una decrementazione del colore a 1 bit in modo da stare presto
a caricarle (ed ev. tenerle direttamente in memoria visto la dimensione
ridotta).
Giovanni Monasteri ha scritto:
