Newsgroup: it.comp.lang.visual-basic
Titolo: VB e la stampante

Salve a tutto il NG!
Ho questo problema: dalla mia applicazione VB dovrei stampare dei report e
dei moduli (tipo fattura, DDT, resoconti, ecc..). La cosa si risolve in
poco
tempo utilizzando l'oggetto PRINTER ed il metodo PRINT, magari specificando
formati e dimensioni del font ma.. mi piacerebbe visualizzare un preview di
stampa prima della stampa vera e propria. Allora, inserendo tutti i metodi
PRINT in una sub
Sub StampaReport(Oggetto as Object)
  Oggetto.Print "Stampa rapporto"
  Oggetto.Print "Data: " & Format$(Now, "dd/mm/yyyy")
  ...
End sub
e passando per Oggetto l'Oggetto VB "Printer" o "Picture" riesco a
ridirigere l'output sulla stampante o su un oggetto Picture che verrà
visualizzato in un form di Preview. In questa maniera, utilizzando una sola
Sub, riesco a scegliere dove fare l'output. Naturalmente l'oggetto Picture
ha le stesse caratteristiche dell'oggetto Printer; mi spiego meglio:
Sub Form_Load
  Printer.ScaleMode=vbMillemeters
  picPreview.ScaleMode=Printer.ScaleMode
  picPreview.Width=Printer.Width
  picPreview.Height=Printer.Height
end Sub
In questa maniera inizializzo un oggetto Picture che ha le stesse
dimensioni
dell'oggetto Printer e quindi utilizzando una stessa Sub per creare
l'output, in teoria, ho gli stessi risultati (cioè quello che vedo a
video
nell'oggetto Picture, è quello che mi viene stampato nell'oggetto
Printer).
MA.. PERO':
mentre l'oggetto Picture non ha bordi fisici (perchè è un oggetto che
ha
l'output a video), l'oggetto Printer ha dei margini minimi fisici (se
proviamo a stampare dal punto 0,0 della stampante, questa stampa mantenendo
un margine minimo dal bordo della pagina che varia da stampante a
stampante)
che possono venire modificati da "Pannello di
controllo/Stampanti/Proprietà/Imposta margini" di ogni singola stampante.
Nel mio caso specifico, dovendo stampare su una HP LaserJet 1100, i margini
minimi fisici dai bordi sono di 6 mm. Ora è chiaro che dall'output a
video
(che inizia a stampare proprio nel primo pixel della Picture) all'output su
stampante (che inizia a stampare a 6 mm dal bordo) passa una notevole
differenza (nel senso che la stampante ha uno "spazio utilie" di stampa
inferiore di 12 mm rispetto a quello della picture). Dovrei quindi sapere
quali siano i margini fisici minimi di stampa della stampante su cui dirigo
l'output e, supponendo che:
margine dx: 1 cm
margine sx: 1 cm
margine sup: 1,5 cm
margine inf: 1,5 cm
altezza foglio= 30 cm
larghezza foglio=20 cm
deduco che:
larghezza dell'area di stampa = 20 cm - 1 cm - 1 cm = 18 cm = 1800 mm
altezza dell'area di stampa = 30 cm - 1,5 cm - 1,5 cm = 27 cm = 2700
mm
e quindi devo creare una Picture che ha sì le dimensioni di 2000x3000 mm
ma,
quando chiamo la Sub StampaReport devo:
- se l'oggetto è "Printer" cominiciare a stampare dal punto 0,0;
- se l'oggetto è "Picture" cominciare a stampare dal punto 10,15 (visto
che
abbiamo detto che vi è un bordo dx di 10 mm e sup di 15 mm); in questa
maniera "simulo" che anche l'oggetto Picture abbia un margine minimo di 10
mm;
Ora, la mia domanda è:
COME FACCIO A SAPERE QUALI SONO I MARGINI FISICI _CORRENTEMENTE IMPOSTATI_
DELLA STAMPANTE? Ho trovato la funzione API GetDevigeCaps che passandogli
determinati parametri mi ritorna i margini della stampante ma:
- non so come farmi tornare tutti e 4 i margini (sup/inf/dx/sx) che
potrebbero essere diversi;
- i margini vengono ritornati in una unità di misura strana, e non so
come
trasformarla in mm o cm o pixel o twips o qualsiasi altra.
Sono grato a chiunque mi risponderà (E-mail: 
css...@tin.it
).
Grazie a tutti!

DELLA STAMPANTE? Ho trovato la funzione API GetDevigeCaps che passandogli
Public Sub GetPrinterCaps(ByRef SX As Long, ByRef Dx As Long, ByRef UP As
Long, ByRef DN As Long)
'ritorna l'area stampabile dalla stampante dove:
'SX e DX sono i margini sinistro e destro
'UP e DN sono i margini superiore e inferiore.
'TUTTO ESPRESSO IN TWIPS
'Dim TwipsPerMillimeter As Double
'Fa partire un job alla stampante per inizializzare l'oggetto printer
Printer.Print Space(1)
Printer.ScaleMode = vbTwips
TwipsPerMillimeter = Printer.ScaleX(1, vbMillimeters, vbTwips)
SX = (GetDeviceCaps(Printer.hdc, PHYSICALOFFSETX) * 25.4 *
TwipsPerMillimeter) / Printer.PrintQuality
UP = (GetDeviceCaps(Printer.hdc, PHYSICALOFFSETY) * 25.4 *
TwipsPerMillimeter) / Printer.PrintQuality
Dx = Printer.Width - Printer.ScaleWidth - SX
DN = Printer.Height - Printer.ScaleHeight - UP
'Abortisce la stampa temporanea
'Printer.KillDoc
End Sub

Grazie 1000!
Mi spieghi a cosa serve quel 25.4? E se non inizializzo la stampante ottengo
dei valori non corretti?
Grazie ancora, Max.

 dei valori non corretti?
Sono i millimetri contenuti in un pollice...
Ciao!