Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Stampare PictureBox con textbox sovrapposte
Forum - C# / VB.NET - Stampare PictureBox con textbox sovrapposte

Avatar
gianni47 (Normal User)
Newbie


Messaggi: 16
Iscritto: 14/02/2020

Segnala al moderatore
Postato alle 16:33
Martedì, 10/03/2020
Sto realizzando una piccola utility per compilare in automatico un modulo di iscrizione.
Ho tentato con TextBox e RitchTextBox, ma per mantenere la fedeltà del documento
originale ho pensato di utilizzare una PictureBox e delle TextBox sovrapposte che
vengono popolate da codice durante la compilazione.

Ora mi trovo con il problema di stampare la PictureBox con i campi compilati,
ma dopo diversi tentativi non ho cavato un ragno dal buco.

Visto che evidentemente non si possono usare i controlli:

PrintPreviewDialog1.Document = PrintDocument1
PrintPreviewDialog1.ShowDialog()

Chiedo per cortesia di indicarmi il metodo che devo adottare.

Ringrazio e saluto.

Gianni  :d

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 694
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 21:41
Martedì, 10/03/2020
Per stampare il form, puoi usare l'oggetto PrintDocument.
Purtroppo eventuali label o text vanno sempre a finire dietro la picturebox, anche se le metti in primo piano.
Per avere dei testi all'interno delle picturebox però ci puoi scrivere:

Codice sorgente - presumibilmente VB.NET

  1. Imports System.Drawing.Printing
  2.  
  3. Public Class Form1
  4.  
  5.     Dim WithEvents STAMPA As New PrintDocument
  6.     Dim bmpSTAMPA As Bitmap
  7.  
  8.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  9.         ' una picturebox con una immagine qualsiasi
  10.         PictureBox1.Image = Image.FromFile(Application.StartupPath & "\Chrysanthemum.jpg")
  11.         PictureBox1.Width = PictureBox1.Image.Width
  12.         PictureBox1.Height = PictureBox1.Image.Height
  13.  
  14.         ' scrivo un testo nella picturebox
  15.         Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)
  16.         g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit
  17.         g.DrawString("Sono nella PictureBox", New Font("Microsoft san serif", 20), Brushes.Black, 10, 10) ' effetto ombra
  18.         g.DrawString("Sono nella PictureBox", New Font("Microsoft san serif", 20), Brushes.Yellow, 9, 9) ' testo
  19.  
  20.         ' mi assicuro che label e text siano in primo piano
  21.         TextBox1.BringToFront()
  22.         Label1.BringToFront()
  23.     End Sub
  24.  
  25.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  26.         Dim rectSTAMPA As System.Drawing.Rectangle
  27.         bmpSTAMPA = New Bitmap(Me.Width, Me.Width) ' bmp grande come tutto il form o scegli tu la grandezza
  28.         rectSTAMPA.Width = Me.Width ' rettangolo di stampa, tutto il form
  29.         rectSTAMPA.Height = Me.Height ' rettangolo di stampa, tutto il form
  30.         Me.DrawToBitmap(bmpSTAMPA, rectSTAMPA) ' l'immagine che compone il form finisce in bmpSTAMPA come rettangolo definito
  31.         STAMPA.Print()
  32.     End Sub
  33.  
  34.     'apre la stampante predefinita
  35.     Private Sub STAMPA_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles STAMPA.PrintPage
  36.         ' centro bmpSTAMPA nel foglio di stampa
  37.         Dim posWidth As Integer = e.MarginBounds.X + (e.MarginBounds.Width - bmpSTAMPA.Width) \ 2
  38.         Dim posHeight As Integer = e.MarginBounds.Y + (e.MarginBounds.Height - bmpSTAMPA.Height) \ 2
  39.         e.Graphics.DrawImage(bmpSTAMPA, posWidth, posHeight) ' scrittura sulla stampante
  40.         e.HasMorePages = False
  41.     End Sub
  42.  
  43.     Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
  44.         bmpSTAMPA = New Bitmap(PictureBox1.Width, PictureBox1.Height)
  45.         bmpSTAMPA = PictureBox1.Image
  46.         STAMPA.Print()
  47.     End Sub
  48.  
  49. End Class



Come al solito prendi spunti, chiedi per saperne di più. :asd:
Magari qualcuno sa come portare le label avanti. :asd:
allegato progetto completo in VB .NET


Carlo ha allegato un file: ScriviSuPictureBox.zip (200289 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da Carlo il 10/03/2020 alle 21:48


in programmazione tutto è permesso
PM Quote
Avatar
gianni47 (Normal User)
Newbie


Messaggi: 16
Iscritto: 14/02/2020

Segnala al moderatore
Postato alle 18:08
Mercoledì, 11/03/2020
Ciao Carlo, ma non dovevamo rivederci su un altro thread?  Sono contento che hai risposto, grazie.

Nel frattempo le circostanze mi hanno regalato un altro impegno che voglio assolutamente chiudere
al più presto, perché altrimenti non ne esco più (già ne prevedo altri).

Ho letto la tua risposta,  effettivamente mi sembra di capire che mi sono di nuovo cacciato nella .........
Tu parli di stampare il Form mentre io pensavo di stampare solo la PictureBox.
Voglio comunque analizzare e provare ( se ci riesco ) il tuo codice per vedere quali possono essere i risultati.

Intanto ne approfitto per completare la spiegazione della situazione in cui ero arrivato:

--- Comando stampa ---
Private Sub Label_3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label_3.Click
   PrintPreviewDialog1.Document = PrintDocument1
   PrintPreviewDialog1.ShowDialog()
End Sub

1 - con questa  procedura mi visualizza una pagina vuota
Sub Print(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
        e.Graphics.DrawImage(PictureBox1.Image, New Point(0, 0))
    End Sub

2 - con questa  procedura ricevo errore " Il valore non può essere null"
  Private Sub PrintDocument1_PrintPage_1(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPage_
  EventArgs) Handles PrintDocument1.PrintPage
        e.Graphics.DrawImage(PictureBox1.Image, New Point(0, 0))
    End Sub

In entrambe i casi sembra che manchi qualcosa per completare il percorso, spero di essere riuscito a spiegarmi.

Ho ancora un codice che avevo trovato in rete e che avevo momentaneamente accantonato.
In sintesi si propone di stampare in due fasi, prima la PictureBox poi le Label ( o le TextBox ).

Ora vedo ( circostanze permettendo ) cosa riesco a fare di tutte quate cose, poi ti faccio sapere.

Momentaneamente ti saluto.

Gianni

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 694
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 19:32
Mercoledì, 11/03/2020
Testo quotato

Postato originariamente da gianni47:

2 - con questa  procedura ricevo errore " Il valore non può essere null"
  Private Sub PrintDocument1_PrintPage_1(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPage_
  EventArgs) Handles PrintDocument1.PrintPage
        e.Graphics.DrawImage(PictureBox1.Image, New Point(0, 0))
    End Sub



nella riga quotata ci sono errori.

Per stampare una PictureBox, prova con il codice nell'esempio cliccando [ STAMPA PictureBox ]

Per fare un codice nuovo devi importare l'oggetto:

Imports System.Drawing.Printing

Devi dichiarare l'oggetto con un nome di tuo gradimento nel caso specifico, "PrintDocument1" :

Dim WithEvents PrintDocument1 As New PrintDocument

se non carichi una immagine nella PictureBox hai Null
quando hai caricato una immagine in una PictureBox, devi richiamare la sub di stampa con:

PrintDocument1.Print()

la sub che effettua la stampa è:

Codice sorgente - presumibilmente VB.NET

  1. Private Sub PrintDocument1_PrintPage_1(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
  2.         e.Graphics.DrawImage(PictureBox1.Image, New Point(0, 0))
  3. End Sub



Per meglio identificare dove posizionare le righe sopramenzionate riguarda l'esempio.
La PictureBox verrà stampata sulla stampante predefinita, in alto a sinistra sul foglio di stampa.


Il PrintPreviewDialog1.ShowDialog()  non serve, rimuovilo anche da progettazione, lo rimetterai solo quando ti servirà per scegliere la stampante.

Per stampare le info ti consiglio di riguardare l'esempio e imparare a scrivere nella PictureBox, scrivi una routine che prende il testo dalle textbox e lo scrive in automatico nella PictureBox .

Se hai voglia puoi fare anche il rettangolino di sfondo per avere l'aspetto etichetta, l'istruzione per il rettangolo è:

e.Graphics.FillRectangle

per misurare il testo e fare il rettangolino giusto:

e.Graphics.MeasureString

devi rispettare l'ordine, prima l'immagine nella PictureBox, poi il rettangolino e in ultimo il testo, perché quello che fai dopo sovrascrive quello che hai fatto prima.







Ultima modifica effettuata da Carlo il 11/03/2020 alle 21:19


in programmazione tutto è permesso
PM Quote
Avatar
gianni47 (Normal User)
Newbie


Messaggi: 16
Iscritto: 14/02/2020

Segnala al moderatore
Postato alle 15:37
Sabato, 21/03/2020
Ciao Carlo. Le circostanze che prevedevo sono arrivate, ma non sono neanche quelle che mi aspettavo.
Sabato scorso, mentre facevo la doccia, sono caduto nella vasca ed ho picchiato il torace sul bordo, DOLOREEE .......
Probabilmente ci sono delle rotture, ma al momento non ho potuto nemmeno fare una radiografia per verificare i danni.

Ti  sto scrivendo coricato sul divano con un vecchio portatile con XP perché ovviamente ho difficoltà di movimenti.
Riesco a malapena a sguazzare sul web e pochissimo altro, dunque per ora niente VB.

Di positivo c'è che al momento sono blindato e spero che almeno il CV19 mi lasci in pace.

Mi auguro che tu stia bene e spero che riusciremo a risentirci presto. Saluti e salute.

Gianni:d

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 694
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 21:11
Sabato, 21/03/2020
Salute a te, guarisci presto. :)


in programmazione tutto è permesso
PM Quote