Newsgroup: it.comp.lang.visual-basic
Titolo: [!] - Conclusioni sul FontTransparent

A seguito di un paio di Thread su questo argomento
e tanto per chiarire la vicenda, riassumo qui il
problema, magari puo' servire a qualcun altro...
Problema iniziale:   creo un form con un command
button con il seguente codice:
'-------------------------------------------------
Private Sub Command1_Click()
Dim i As Long
    Printer.PaperSize = vbPRPSA5
    For i = 0 To 1
        Printer.Line (0, 0)-(3000, 1300), &HFFC0C0, BF
        Printer.Line (0, 0)-(3000, 1300), 0, B
        Printer.Font = "Arial"
        Printer.FontSize = 18
        Printer.FontBold = True
        Printer.CurrentX = 800
        Printer.CurrentY = 300
        Printer.Print "PROVA"
        Printer.NewPage
    Next
    Printer.EndDoc
End Sub
'-------------------------------------------------
le due pagine sono diverse l'una dall'altra, nella
prima la scritta PROVA e' circondata di bianco,
nella seconda lo sfondo colorato e' perfetto.
Poi il problema e' stato risolto grazie ad hal1961,
applicando la seguente modifica:
'-------------------------------------------------
Private Const TRANSPARENT = 1
Private Declare Function SetBkMode Lib "gdi32" _
   (ByVal hDC As Long, ByVal nBkMode As Integer) As Long
Private Sub Command1_Click()
Dim i As Long
    Printer.PaperSize = vbPRPSA5
    SetBkMode Printer.hDC, TRANSPARENT
    For i = 0 To 1
        Printer.Line (0, 0)-(3000, 1300), &HFFC0C0, BF
        Printer.Line (0, 0)-(3000, 1300), 0, B
        Printer.Font = "Arial"
        Printer.FontSize = 18
        Printer.FontBold = True
        Printer.CurrentX = 800
        Printer.CurrentY = 300
        Printer.Print "PROVA"
        Printer.NewPage
    Next
    Printer.EndDoc
End Sub
'-------------------------------------------------
e tutto sembrava funzionare bene su w2k e w98, con
stampanti Epson.    Poi invece dal cliente con w98 e
HP Deskjet 890 C di nuovo i problemi: prima pagina
con font non trasparenti, le successive ok.
Anche se ormai non mi aspetto piu' soluzioni miracolose
almeno mi farebbe piacere capire da cosa possa
dipendere, se dalla stampante o dalla versione del SO
o da cos'altro.    Almeno per poter dire ai clienti che il
sw non gira bene in determinate condizioni.
Qualcuno ha voglia di provare questo codice e dirmi cosa
combina sui vari SO e stampanti ?
Poi giuro che non rompo piu'
Grazie mille a tutti
Bepi

 ha scritto
| A seguito di un paio di Thread su questo argomento
| e tanto per chiarire la vicenda, riassumo qui il
| problema, magari puo' servire a qualcun altro...
Ho provato e, beh, posso dire di aver imparato...
Ho imparato che premendo F1 si scoprono tante belle cose... (vedi codice + giu)
| Anche se ormai non mi aspetto piu' soluzioni miracolose
Aspetta, aspetta...
| almeno mi farebbe piacere capire da cosa possa
| dipendere, se dalla stampante o dalla versione del SO
| o da cos'altro.
Te lo dico io: dipende da quello scottante tastino, F1... :))))
| Almeno per poter dire ai clienti che il
| sw non gira bene in determinate condizioni.
No, dopo aver provato il codice che ho scritto, non potrai + dirlo...
| Qualcuno ha voglia di provare questo codice e dirmi cosa
| combina sui vari SO e stampanti ?
Il codice originale non funzionava... nel senso che faceva esattamente quello da te descritto... ma
evidentemente non lo usavi nella maniera corretta.
Ed ora veniamo al codice: provalo e dimmi cosa ottieni... (ah, ho una HP LaserJet, quindi ho settato
la proprietą "Printer.ColorMode" a monocromatica).
'-------------------------------------------------
Private Sub Command1B_Click()
  Dim i As Integer
  Dim x, y As Long
  ' printer setting
  Printer.ScaleMode = vbTwips
  Printer.ColorMode = vbPRCMMonochrome
  Printer.PaperSize = vbPRPSA4
  Printer.Font = "Arial"
  Printer.FontSize = 10
  Printer.FontBold = True
  x = 0
  For i = 1 To 16
    y = (i - 1) * 500
    Printer.DrawMode = vbCopyPen ' set to default
    Printer.CurrentX = x: Printer.CurrentY = y: Printer.Print GetDrawModeAppearance(i)
    ' print box border
    Printer.Line (x, y)-(x + 2000, y + 300), 0, B
    ' fill box using a drawmode
    Printer.DrawMode = i: Printer.Line (x, y)-(x + 2000, y + 300), &HFFC0C0, BF
  Next
  Printer.NewPage
  Printer.EndDoc
End Sub
Private Function GetDrawModeAppearance(j As Integer) As String
  Select Case j
    Case 1: GetDrawModeAppearance = "VbBlackness"
    Case 2: GetDrawModeAppearance = "VbNotMergePen"
    Case 3: GetDrawModeAppearance = "VbMaskNotPen"
    Case 4: GetDrawModeAppearance = "VbNotCopyPen"
    Case 5: GetDrawModeAppearance = "VbMaskPenNot"
    Case 6: GetDrawModeAppearance = "VbInvert"
    Case 7: GetDrawModeAppearance = "VbXorPen"
    Case 8: GetDrawModeAppearance = "VbNotMaskPen"
    Case 9: GetDrawModeAppearance = "VbMaskPen"
    Case 10: GetDrawModeAppearance = "VbNotXorPen"
    Case 11: GetDrawModeAppearance = "VbNop"
    Case 12: GetDrawModeAppearance = "VbMergeNotPen"
    Case 13: GetDrawModeAppearance = "VbCopyPen"
    Case 14: GetDrawModeAppearance = "VbMergePenNot"
    Case 15: GetDrawModeAppearance = "VbMergePen"
    Case 16: GetDrawModeAppearance = "VbWhiteness"
  End Select
End Function
'-------------------------------------------------
Da MSDN:
-----------
DrawMode Property
Returns or sets a value that determines the appearance of output fromgraphics method or the
appearance of a Shape or Line control.
Syntax
object.DrawMode [= number]
[...]
Remarks
Use this property to produce visual effects with Shape or Line controls or when drawing with the
graphics methods.


Avevo fatto delle prove con il DrawMode, ma non avevo
cavato un ragno dal buco.   Provero' come dici tu, poi ti faccio
sapere.    (intanto pero' se la colpa e' mia, continuo a non
capire perche' si comporta in modo diverso tra la prima e
la seconda pagina)
A proposito dello 'scottante' F1, ti assicuro che prima di
strarompere qui ne ho premuti di F1, F2, ecc.    Ho cercato
su:   MSDN, ApiViewer 2001, Api Guide, Win32 API di Appleman,
in rete, e solo ultimamente qui sul NG.    Non amo fare la figura
dello scemo, quindi mi sono documentato prima, e ho fatto
prove a sufficienza.    Quella del DrawMode e' stata proprio
la prima prova, ma in un caso (ora non ricordo piu') con un certo
tipo di pen mi andava addirittura in GPF.... e quindi ho
abbandonato quella strada.
Comunque non importa, pur di risolvere questa cosa sono
anche disposto a farmi dare del lamerino da strapazzo.
Per ora grazie anche a te, come anche a tutti gli altri.
Ciao
Bepi

 ha scritto
[...]
|
| Avevo fatto delle prove con il DrawMode, ma non avevo
| cavato un ragno dal buco.   Provero' come dici tu, poi ti faccio
| sapere.    (intanto pero' se la colpa e' mia, continuo a non
| capire perche' si comporta in modo diverso tra la prima e
| la seconda pagina)
Vedi se il codice che ho scritto ti soddisfa...
| A proposito dello 'scottante' F1, ti assicuro che prima di
| strarompere qui ne ho premuti di F1, F2, ecc.    Ho cercato
Si, si... magari e' solo un problema con l'inglese, o con una certa superficialità nel leggere la
guida... non preoccuparti, capita di sbagliare, di lasciarsi sfuggire qualcosa, un dettaglio, di
averlo avuto sotto mano e di non essersi resi conto che c'era... :)))))
[...]
| quindi mi sono documentato prima, e ho fatto
| prove a sufficienza.
Prove a sufficienza? Come quella del mio test? Ma forse e' sbagliato pure il mio test... dimmi cosa
ne pensi
| Quella del DrawMode e' stata proprio
| la prima prova, ma in un caso (ora non ricordo piu') con un certo
| tipo di pen mi andava addirittura in GPF.... e quindi ho
| abbandonato quella strada.
devi resettare il pen a quello di default... il n° 13