Ho preso una piccola pausa di riflessione ma nel frattempo non sono stato con le mani in mano e grazie ai favolosi consigli di
fsurfing penso di essere arrivato ad una più che soddisfacente risoluzione del problema.
Be a dire il vero mi è stato brillantemente risolto da
fsurfing ma non bisogna dimenticare il fattivo stimolante aiuto di
vuott, specialmente quando mi ha mandato l'ambulanza, il ricovero penso (o almeno spero) che mi abbia fatto bene.
In effetti in questa discussione ho inserito del codice che può nuocere gravemente alla salute mentale e me ne scuso.
A parte gli scherzi grazie davvero dei vari aiuti e consigli.
Però siccome al peggio non c'è mai fine insisto e vi propino la (mia?) soluzione.
Occorre fare una premessa all'inizio della terza pagina di questa discussione fsurfing mi consigliava già la soluzione:
procedendo empiricamente, nel tuo programma il rapporto per il font dovrebb essere 0.744....
ti consiglio di creare la seguente funzione:
public sub ridimensiona(size as float)as float
If Paint.Device = da Then
Return size * 0.744
Else
Return size
Endif
end
in questo modo nel modulo disegno per cambiare font darai
paint.font.size=ridimensiona(15)
così il programma cambierà automaticamente la dimensione del font nel caso tu stia stampando oppure disegnando a schermo
ma ai me io non l'ho capita subito e siccome sono di coccio anche dopo che mi sono reso conto che funzionava benissimo ho avuto bisogno di ulteriori delucidazioni e voi non ci crederete ma ho ancora delle domande da pormi e da porvi.
Comunque andiamo per ordine ho esemplificato “a modo mio” come ottenere un preciso riscontro fra il testo e il disegno mostrato a video, con quanto andremo poi a stampare.
Per il codice che segue ho tratto ispirazione dal codice mostrato negli esempi di Gambas – esempi di disegno.
' Gambas class file
'' Ho creato questo esempio come progetto grafico con l'aggiunta alla Main form (l.800x500 circa)di una DrawingArea nominata "da".
'' Una textbox1 e tre button Disegna, Stampa e Cancella.
'' Questo esempio è stato ispirato dall'esempio di disegno degli esempi di Ganbas.
Private fFontVideo As Float
Private fFontOrig As Float
'Private sFont As String
Private sTestoText As String
Private miaStampante As Printer
Private Const MM_X_PX As Float = 0.352778 'per mutare millimetri in pixel e viceversa
Private Const F_FSURFING_VIDEO As Float = 0.744 ' Per creare il giusto font a video :)
Private Const F_GAMBERETTO_STAMPA As Float = 1.3441 ' Per riportare il font alle giuste proporzioni :)
Public Sub _new()
End
Public Sub Form_Open()
miaStampante = New Printer As "Stampa"
'Avrei voluto usare una fontbox ma non sono riuscito a capire come funziona
'e allora accontentiamoci.
sTestoText = "TO BE OR NOT TO BE: THAT IS THE QUESTION"
fFontOrig = 26
da.W = 210 / MM_X_PX
End
'' Non ho inserito questa bella funzione di fsurfing nel codice perchè mi confondevo durante il ciclo di ridimensionamento
'' ma occorre che ci ritorni su comunque la riporto per conoscenza.
'' Poi nel codice la si usa così: Paint.Font.size = ridimensiona(11)
''Public Sub ridimensiona(size As Float) As Float
' If Paint.Device = da Then
' Return size * 0.744
' Else
' Return size
' Endif
''End
Public Sub Stampa_Draw()
DisegnoX("Stampante")
End
'' Qui si sarebbe dovuta(?) usare la funzione Paint.Device al posto della string sDevice
'' ...ma le vecchie abitudini sono dure a morire.
Public Sub DisegnoX(sDevice As String)
Dim fLarghezza, fAltezza As Float
Dim fSpazInLarg, fSpazInAlt As Float
Select Case sDevice
Case "Video"
da.Cached = True
da.Clear
Paint.Begin(da)
'Paint.Scale(1.2, 1.2) '' Qui non ho capito bene se si può zoomare senza agire sui font!
Case "Stampante"
Paint.Begin(miaStampante)
Case Else
' Avete idea di quale altro caso?
Return
End Select
'Spazi iniziali di 20 mm.
fSpazInLarg = 20 / MM_X_PX
fSpazInAlt = 20 / MM_X_PX
fLarghezza = 150 / MM_X_PX
fAltezza = 80 / MM_X_PX
Paint.Background = Color.Black
Paint.Rectangle(fSpazInLarg, fSpazInAlt, fLarghezza, fAltezza)
Paint.Stroke(True)
Paint.Save
Paint.Clip
Paint.Font.Size = fFontVideo
Print Paint.Font.Size
Print Paint.Font.TextWidth(sTestoText)
'Qui inserisco un ciclo per ridurre la scritta e farla stare all'interno del rettangolo.
While Paint.Font.TextWidth(sTestoText) > fLarghezza
Paint.Font.Size = Paint.Font.Size - 0.1
Wend
If sDevice = "Stampante" Then Paint.Font.Size = Round(Paint.Font.Size * F_GAMBERETTO_STAMPA, -2)
Print Paint.Font.Size
'Paint.Restore
Paint.Text(sTestoText, fSpazInLarg, fSpazInAlt + 50)
Print sTestoText
Paint.Fill(True)
Paint.Restore
Paint.Font.Size = fFontVideo
If sDevice = "Stampante" Then Paint.Font.Size = Round(Paint.Font.Size * F_GAMBERETTO_STAMPA, -2)
Print Paint.Font.Size
'Paint.Background = Color.Blue
Paint.Text(sTestoText, fSpazInLarg, fSpazInAlt + 100)
Paint.Fill
Paint.End
End
Public Sub Button3_Click()
' Invece di cancellare e basta ripristina la scritta di default
' altro trucco copiato ma non mi ricordo più da chi :)
TextBox1.Text = "TO BE OR NOT TO BE: THAT IS THE QUESTION"
End
Public Sub Button1_Click()
fFontVideo = Round(fFontOrig * F_FSURFING_VIDEO, -2)
Print fFontVideo
'Disegna
DisegnoX("Video")
End
Public Sub TextBox1_Change()
sTestoText = TextBox1.Text
End
Public Sub Button2_Click()
'' Come giustamente ricorda fsurfing se vuoi risparmiare carta stampa le prove su file PDF.
fFontVideo = Round(fFontOrig * F_FSURFING_VIDEO, -2)
With miaStampante
If .Configure() Then Return
'Verticale
.Orientation = 0
.PaperWidth = 210
.PaperHeight = 297
'.OutputFile = "/home/gianluigi/ProvaGambas.pdf" ' vedi sotto!
'' metti il tuo nome^
.Resolution = 300 ' Desktop.Resolution '200 '100
.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
Per quelli che come me sono poco istruiti riporto l'esemplificazione di come è stato ottenuto il fattore video fattami da fsurfing che è veramente chiara, io per mia maggiore comprensione ho inserito dei numeri che ho lasciato e messo fra parentesi:
''###################################codice di esempio####################################################
Paint.Font.Name = "Ubuntu"
Paint.Font.size = 11
'sapento che un il testo "TESTOCORTO" IN UBUNTU 11 in stampa occupa 24mm in larghezza
'procedo empiricamente costringendo il programma a diminuire il font finchè la larghezza corrisponde
While Paint.Font.TextWidth("TESTOCORTO") > 24 / fMm_x_Dot ' (0.352778)
Paint.Font.Size = Paint.Font.Size - 0.1
Wend
'uscendo da while il font avrà la dimensione corretta
font_finale = Paint.Font.size
'ora creo un equazione
'dim_font_campione:font_finale=nuovo_font:x
'quindi:
'dim_font_campione/font_finale=nuovo_font/x
'********* (11) **** (8.184) **(es.26)
'ovvero
'xr=nuovo_font*(font_finale/dim_font_campione)
'
'considerando
r = font_finale / 11
'e quindi
'il font da usare per mostrare a video le giuste proporzioni va moltiplicato per r
Message.Info("il rapporto per il video è: " & Chr(10) & Round(r, -4)) ' round serve per arrotondare
'##################fine codice di esempio########################################################################################
Continuando con lo stesso ragionamento e udite udite si potrebbe quasi sostenere che è farina del mio sacco:
z = Round(11/8.184,-4) che corrisponde a
1.3441 ora abbiamo anche il fattore che ci riporta un font proporzionato alla stampa e che serve come avete visto nell'esempio di codice quando dobbiamo rimpicciolire i caratteri per far rientrare la stringa in uno spazio più piccolo.
Bene io spero che questa discussione sia stata proficua, per me lo è stata moltissimo ho imparato diverse cose fra cui una molto confortevole che ci sono persone che si aiutano e questo fa sempre bene all'umore.
Comunque prima di mettere RISOLTO sarà meglio che attenda un attimino i vostri pareri e poi non vorreste rispondere alle ultime domande scusate?