Sono un nuovo utente entusiasta (nuovo solo per dire avendo ai me superato la sessantina) di Linux e di Gambas che trovo fantastici. Mi scuso anticipatamente se il tema in oggetto è stato già trattato ma io non sono stato capace di scovarlo.
Lavoro con:
[System]
Gambas=3.5.90
OperatingSystem=Linux
Kernel=3.11.0-15-generic
Architecture=x86_64
Distribution=Ubuntu 13.10
Desktop=GNOME
Theme=QGtk
Language=it_IT.UTF-8
Memory=15978M
[Libraries]
Cairo=libcairo.so.2.11200.16
Curl=libcurl.so.4.3.0
DBus=libdbus-1.so.3.7.4
GStreamer=libgstreamer-0.10.so.0.30.0
GStreamer=libgstreamer-1.0.so.0.200.0
GTK+3=libgtk-3.so.0.800.6
GTK+=libgtk-x11-2.0.so.0.2400.20
OpenGL=libGL.so.1.2.0
Poppler=libpoppler.so.43.0.0
Qt4=libQtCore.so.4.8.4
SDL=libSDL-1.2.so.0.11.4
[SVN]
3.5.99.1+svn20140131+build18~ubuntu13.10.1
Ho avuto conoscenza in Windows con VBA su VBE e li la stampa era gestita in automatico, quindi per me disegnare testo per la stampante è una nuova esperienza.
Problema:
non riesco a far combaciare le misure del testo disegnato sulla DrawingArea con le misure stampate su foglio.
Se io stampo la stringa “TESTOCORTO” con carattere “Ubuntu” 11 otterrò un testo di circa millimetri 3 in altezza per 24,5 di lunghezza qualunque software io usi per scrivere.
Perché invece Gambas mi da misure diverse?
Per esemplificare quanto chiedo ho creato un programmino il cui codice allego, è un progetto grafico con una DrawingArea denominata “da” su cui il codice disegna per poi mandare alla stampa (metodo commentato per evitare sprechi di carta) la scritta “TESTOCORTO” che viene riquadrata sulla base delle misure fornite da Paint.Font.TestWidth e Paint.Font.TextHeight e poi disegna anche un riquadro giallo che è quello delle misure giuste usate dalla stampante.
Cosa sbaglio? Cosa non ho capito? Dove posso avere una risposta elementare adeguata alla mia bassa conoscenza della programmazione?
Tante grazie anticipate a chiunque vorrà aiutarmi.
Gianluigi
' Gambas class file
'' Ho creato questo esempio come progetto grafico con l'aggiunta alla Main form di una DrawingArea nominata "da".
Private miaStampante As Printer
Private Const MM_X_PX As Float = 0.3527 'per mutare millimetri in pixel e viceversa
Public Sub _new()
End
Public Sub Form_Open()
miaStampante = New Printer As "Stampa"
' mie misure arbitrarie.
Me.W = 600
Me.H = 450
da.Left = 0
da.Top = 0
da.W = 550
da.H = 400
da.Background = Color.White
' Crea subito il disegno e la stampa
StampoSu("Video")
'Stampare()
End
Public Sub Stampare()
With miaStampante
'Verticale
.Orientation = 0
' A4 orizzontale
'.Orientation = 1
'.PaperWidth = 297
'.PaperHeight = 210
.Resolution = Desktop.Resolution '300
.FullPage = True 'parte da X0 e Y0 di paper
'Print .Resolution
End With
Me.Enabled = False
Inc Application.Busy
miaStampante.Print
Dec Application.Busy
Me.Enabled = True
End
Public Sub Stampa_Draw()
StampoSu("Stampante")
End
Public Sub StampoSu(sDevice As String)
Dim iH, iW As Integer
Dim fSpazInLarg, fSpazInAlt, fLargRet, fAltRet As Float
Dim sTesto As String
Dim fTratteggio As Float[] = [3.0, 2.0]
Select Case sDevice
Case "Video"
da.Cached = True
da.Clear
Paint.Begin(da)
'Paint.Scale(2, 2)
Case "Stampante"
Paint.Begin(miaStampante)
Case Else
Return
End Select
'Spazi iniziali di 20 mm.
fSpazInLarg = 20 / MM_X_PX
fSpazInAlt = 20 / MM_X_PX
Paint.Background = Color.Black
Paint.Save
'Disegna testo
'Paint.Font.Name = "Sans Serif"
Paint.Font.Name = "Ubuntu"
Paint.Font.Size = "11"
'Paint.Font.Bold = True
sTesto = "TESTOCORTO"
iW = Paint.Font.TextWidth(sTesto)
iH = Paint.Font.TextHeight(sTesto)
Print Paint.Font.Size
Print Paint.Font.Name
Print "H testo = " & iH
Print "L teso = " & iW
Paint.DrawText(sTesto, fSpazInLarg, fSpazInAlt, 1, 1, 17) '35 = bottom; 33 = BottomLeft; 32 = BottomNormal; 17 = TopLeft
Paint.Restore
' Disegna rettangolo
fLargRet = CFloat(iW)
fAltRet = CFloat(iH)
Paint.LineWidth = 0.5
'Paint.Background = Color.Black
Paint.Rectangle(fSpazInLarg, fSpazInAlt, fLargRet, fAltRet)
Paint.Stroke(True)
Paint.Clip
' Visualizza a schermo (rettangolo giallo) l'ingombro reale della scritta sul foglio stampato.
fLargRet = 24.5 / MM_X_PX
fAltRet = 3 / MM_X_PX
Paint.Rectangle(fSpazInLarg, fSpazInAlt + (1 / MM_X_PX), fLargRet, fAltRet)
Paint.Background = Color.RGB(255, 218, 90, 0)
Paint.Dash = fTratteggio
Paint.Stroke(True)
Paint.Background = Color.RGB(255, 218, 90, 180)
Paint.Fill
Paint.End
End