Stampare il contenuto di una DrawingArea: differenze tra le versioni
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| Riga 386: | Riga 386: | ||
With Paint | With Paint | ||
.DrawImage(Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>"), 0, 0) | .DrawImage(Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>"), 0, 0) | ||
.DrawText("Testo qualsiasi", 200, 100) | |||
.End | .End | ||
End With | End With | ||
Versione delle 11:56, 13 mag 2023
Per stampare il contenuto grafico presente in una DrawingArea, si potrà attuare il seguente procedimento:
- si provvede a disegnare e scrivere all'interno della DrawingArea mediante l'Evento "_Draw()";
- si imposta la fase di stampa con la Classe Printer;
- viene richiamato l'evento "_Draw()" della Classe Printer per ogni pagina da stampare;
- sia per disegnare nella DrawingArea sia per stampare il disegno si richiama una sub-procedura, nella quale sono presenti i necessari valori ed impostazioni.
Esempio generico
Public Sub DrawingArea1_Draw()
' Richiamiamo ai fini del disegno sulla "DrawingArea" le impostazioni presenti nella sub-procedura":
DisegnoStampa()
End
Public Sub Button1_Click()
With Printer1
.Configure
.Orientation = .Portrait
.Paper = .A4
.Resolution = Desktop.Resolution
.GrayScale = False
' Volendo, si può stampare/creare un file .pdf o .ps, anziché stampare su foglio con la stampante, inserendo questa riga di comando:
' .OutputFile = "/percorso/del/mio/file.pdf"
.Print
End With
End
Public Sub Printer1_Draw()
' Richiamiamo ai fini della stampa le impostazioni presenti nella sub-procedura":
DisegnoStampa()
End
Private Procedure DisegnoStampa()
With Paint
.Brush = Paint.Color(Color.Red)
.MoveTo(200, 200)
.RelLineTo(0, 100)
.Stroke
.DrawText("Testo qualsiasi", 10, 10, 20, 20)
.End
End With
End
Stampare garantendo la corrispondenza fra testo mostrato sulla DrawingArea e testo stampato
Nel caso sia necessaria una precisa corrispondenza fra quanto mostrato sulla DrawingArea e quanto stampato, è possibile utilizzare il seguente codice esemplificativo: [Nota 1]
Public Sub Form_Show()
Me.Center
DrawingArea1.Resize(1653, 2338) ' Dimensioni in pixel di un foglio A4 a 200 DPI
End
Public Sub DrawingArea1_Draw()
disegna()
Paint.End
End
Public Sub disegna()
Dim X, Y As Float
Dim dx, dy, DXT As Float
Dim IH, IW As Float
' Calcolo risolutore per linee e quadrati:
dx = DrawingArea1.W / 211
dy = DrawingArea1.H / 297
X = 20 * dx ' bordo di 20 mm
Y = 20 * dy ' bordo di 20 mm
Paint.Font.Name = "Ubuntu"
Paint.Font.Size = RIDIMENSIONA(11)
Paint.drawText("Testo Qualsiasi", X, y + Paint.Font.TextHeight("Testo Qualsiasi"))
' Disegnamo un rettangolo intorno al testo, per verificare la corrispondenza delle dimensioni del testo mostrato sullo schermo all'interno della "DrawingArea" e le dimensioni del testo stampato:
Paint.Rectangle(X, Y, Paint.Font.TextWidth("Testo Qualsiasi"), Paint.Font.TextHeight("Testo Qualsiasi"))
Paint.Stroke
End
Public Function RIDIMENSIONA(size As Integer) As Integer
If Paint.Device = DrawingArea1 Then
Return size * 2
Else
Return size
Endif
End
Public Sub Button1_Click()
If Printer1.Configure() Then Return
With Printer1
.FullPage = True
.Orientation = .Portrait
.Resolution = 200
.PaperHeight = 297
.PaperWidth = 211
' .OutputFile = "/tmp/file.pdf" Se si vuole una stampa su file .PDF, attivare anche questa riga
.Print
End With
End
Public Sub Printer1_Begin()
disegna()
End
Stampare il contenuto di una determinata DrawingArea scelta fra 2 o più
Se sul Form sono presenti due o più oggetti DrawingArea e si intende stampare solo il contenuto di una DrawingArea fra quelle, si potrà adottare un codice del seguente tenore, che tende a riconfermare nelle funzioni e proprietà di stampa i dati del disegno utilizzati all'interno della DrawingArea prescelta:
Public Sub Form_Open()
DrawingArea1.Name = "DrawingArea 1"
DrawingArea2.Name = "DrawingArea 2"
' Assegna le due "DrawingArea" al medesimo Gruppo di Eventi:
Object.Attach(DrawingArea1, Me, "DrAr")
Object.Attach(DrawingArea2, Me, "DrAr")
End
Public Sub DrAw_Draw()
With Paint
.Brush = Paint.Color(Color.Red)
.MoveTo(200, 200)
.RelLineTo(0, 200)
.Stroke
.DrawText("DrawingArea2", 200, 200, 20, 20)
.End
End With
End
Public Sub Button1_Click()
With Printer1
.Configure
.Orientation = .Portrait
.Paper = .A4
.Resolution = Desktop.Resolution
.GrayScale = False
' .OutputFile = "/tmp/prova.pdf"
.Print
End With
End
Public Sub Printer1_Draw()
Dim n As Byte
n = Val(InputBox("Quale DrawingArea vuoi stampare ?"))
' Richiamiamo ai fini della stampa le impostazioni presenti nella sub-procedura":
Stampa(n)
End
Private Procedure Stampa(d As Byte)
Dim mx, my, rY, dx, dy As Integer
Dim dS As String
If d = 1 Then
mx = 100
my = 100
rY = 100
dX = 10
dY = 10
dS = DrawingArea1.Name
Else
mx = 200
my = 200
rY = 200
dX = 200
dY = 200
dS = DrawingArea1.Name
Endif
With Paint
.Begin(Printer1)
.Brush = Paint.Color(Color.Red)
.MoveTo(mx, my)
.RelLineTo(0, rY)
.Stroke
.DrawText(dS, dX, dY, 20, 20)
.End
End With
End
Stampare il contenuto di due o più DrawingArea ciascuno su una pagina
Riprendendo il codice precedente, si stamperà il contenuto di ciascuna DrawingAea su una differente pagina.
Quindi in questo caso saranno stampate in totale 2 pagine: sulla prima sarà stampato il contenuto della prima DrawingAea, e sulla seconda pagina sarà stampato il contenuto della seconda DrawingAea.
Private n As Short
Public Sub Form_Open()
DrawingArea1.Name = "DrawingArea 1"
DrawingArea2.Name = "DrawingArea 2"
' Assegna le due "DrawingArea" al medesimo Gruppo di Eventi:
Object.Attach(DrawingArea1, Me, "DrAr")
Object.Attach(DrawingArea2, Me, "DrAr")
End
Public Sub DrAw_Draw()
With Paint
.Brush = Paint.Color(Color.Red)
.MoveTo(200, 200)
.RelLineTo(0, 200)
.Stroke
.DrawText("DrawingArea2", 200, 200, 20, 20)
.End
End With
End
Public Sub Button1_Click()
With Printer1
.Configure
.Orientation = .Portrait
.Paper = .A4
.Resolution = Desktop.Resolution
' Imposta il numero delle pagine da stampare:
.Count = 2
.GrayScale = False
' .OutputFile = "/tmp/prova.pdf"
.Print
End With
End
Public Sub Printer1_Draw()
' Incrementa il numero della pagina da stampare (il numero della prima pagina da stampare non deve essere = 0):
inc n
' Richiamiamo ai fini della stampa le impostazioni presenti nella sub-procedura":
Stampa(n)
End
Private Procedure Stampa(d As Byte)
Dim mx, my, rY, dx, dy As Integer
Dim dS As String
If d = 1 Then
mx = 100
my = 100
rY = 100
dX = 10
dY = 10
dS = DrawingArea1.Name
Else
mx = 200
my = 200
rY = 200
dX = 200
dY = 200
dS = DrawingArea1.Name
Endif
With Paint
.Begin(Printer1)
.Brush = Paint.Color(Color.Red)
.MoveTo(mx, my)
.RelLineTo(0, rY)
.Stroke
.DrawText(dS, dX, dY, 20, 20)
.End
End With
End
Stampare il contenuto di una DrawingArea mediante le risorse del Componente gb.media
Si potrà stampare il contenuto di una DrawingArea anche mediante le risorse del Componente gb.media:
Private appoggio As String
Public Sub Button1_Click()
Dim pl As MediaPipeline
Dim src, vdc, enc, snk As MediaControl
appoggio = Temp
pl = New MediaPipeline
src = New MediaControl(pl, "ximagesrc")
' Assegna alla proprietà "xid" del plugin "ximagesrc" il numero idetificativo della "DrawingArea", affinché ne catturi quanto da essa visualizzato:
src["xid"] = DrawingArea1.Id
vdc = New MediaControl(pl, "videoconvert")
enc = New MediaControl(pl, "pngenc")
snk = New MediaControl(pl, "filesink")
snk["location"] = appoggio
src.LinkTo(vdc)
vdc.LinkTo(enc)
enc.LinkTo(snk)
' Effettua la ripresa dell'immagine:
pl.Play()
' Attende che sia creato il file immagine di formato PNG:
Repeat
Wait 0.01
Until Right(File.Load(appoggio), SizeOf(gb.Integer)) = MkInt(&826042AE)
pl.Stop()
pl.Close()
Print "Cattura immagine effettuata"
With Printer1
.Configure
.Orientation = .Portrait
.Paper = .A4
.Resolution = Desktop.Resolution
.GrayScale = False
' Volendo, si può stampare/creare un file .pdf, anziché stampare su foglio con la stampante, inserendo questa riga di comando:
.OutputFile = "/tmp/file.pdf"
.Print
End With
End
Public Sub Printer1_Draw()
With Paint
.DrawImage(Image.Load(appoggio), 0, 0)
.End
End With
End
Public Sub DrawingArea1_Draw()
With Paint
.DrawImage(Image.Load("/percorso/del/file/immagine"), 0, 0)
.DrawText("Testo qualsiasi", 200, 100)
.End
End With
End
Note
[1] Il codice è stato realizzato dall'utente fsurfing del forum di www.gambas-it.org