Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    98

    [VB.NET] Stampare testo in una picturebox

    Ciao,
    ho un altro problemino..

    ho bisogno di scrivere del testo in una picture.. in vb6 era abbastanza semplice bastava scrivere Picture1.print "Testo"

    Invece in vb.net le cose si complicano :P

    ho creato una sub:
    codice:
        Private Sub DrawText(ByVal pict As System.Object, ByVal Text As String) 'As Bitmap
            Dim TextBitmap As New Bitmap(100, 100)
            Dim Brush As New SolidBrush(Color.Black)
            Dim SelectedFont = New Font("Arial", 16)
            Using Graphic = Graphics.FromImage(TextBitmap)
                Graphic.DrawString(Text, SelectedFont, Brush, 0, 0)
                'Graphic.DrawImage(Graphic.DrawString(Text, SelectedFont, Brush, 0, 0), 0, 0)
                Dim Btn As PictureBox
    
                Btn = DirectCast(pict, PictureBox)
    
                Btn.CreateGraphics.DrawImage(TextBitmap, 0, 0)
            End Using
    
            'Return TextBitmap
        End Sub
    Il mio programma crea varie picturebox, e ogni volta che ne crea una ci carica un'immagine e poi vorrei che stampasse del testo (ma che non cancelli l'immagine sottostante, semplicemente si deve sovrapporre)

    Quindi poi richiamo questa sub per stampare il testo passandogli come parametri l'oggetto picture su cui deve scrivere il testo e la stringa di testo da scrivere.

    Il problema sta nel fatto che se richiamo questa sub nella sub in cui creo le picture non funziona. Se la richiamo ad esempio dall'evento click su di una picture funziona!

    Non capisco il perchè, mi sto dannando, non è che qualcuno mi possa aiutare?

  2. #2
    Secondo me per scrivere del testo nella PictureBox è più semplice sfruttare l' evento .Paint del controllo.

    Questo semplice codice visualizza 2 PictureBox create a runtime e ci scrive del testo:

    codice:
    Public Class Form1
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            'creo una PictureBox a runtime quando lancio il Form
            Dim PB As New PictureBox
            With PB
                .Name = "PB"
                .Image = My.Resources.image1
                .Location = New System.Drawing.Point(50, 50)
                .Size = New Size(My.Resources.image1.Width, My.Resources.image1.Height)
            End With
    
            Me.Controls.Add(PB)
            AddHandler PB.Paint, AddressOf PB_Paint
    
        End Sub
    
        Private Sub PB_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)
    
            Dim Font As New System.Drawing.Font("Arial", 12)
            e.Graphics.DrawString("Ciao", Font, Brushes.Blue, 4, 4)
    
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            'creo una seconda PictureBox a runtime quando clicco Button1
            Dim PB1 As New PictureBox
            With PB1
                .Name = "PB1"
                .Image = My.Resources.image2
                .Location = New System.Drawing.Point(90, 90)
                .Size = New Size(My.Resources.image2.Width, My.Resources.image2.Height)
            End With
    
            Me.Controls.Add(PB1)
            AddHandler PB1.Paint, AddressOf PB1_Paint
    
        End Sub
    
        Private Sub PB1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)
    
            Dim Font As New System.Drawing.Font("Arial", 10)
            e.Graphics.DrawString("Ave", Font, Brushes.Red, 6, 3)
    
        End Sub
    
    End Class
    Lo ho buttato giù velocemente, ovviamente si potrebbe creare una sola Sub Paint passandogli delle variabili globali per Testo, Font, Brush ecc...

    Bye
    .

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    98
    Ok avevo provato a fare qualcosa di simile ma evidentemente sbagliavo comando perchè questo funziona

    Solo che sorge un altro problemino...

    se si passa sopra l'immagine (su cui è disegnata la scritta) con il mouse si attiva l'evento corrispondente che cambia l'immagine di sfondo e questo automaticamente mi cancella la scritta... come posso fare per mantenere la scritta stampata sulla picture anche se vado a modificare backgroundimage?

    EDIT:
    Per risolvere sto cercando di fare (anche se non è il massimo) un codice che ogni volta che si cambia sfondo mi ridisegni la scritta ma non ci riesco perchè non riesco a gestire l'array di picture.

    In vb6 avrei creato un array di picture: Picture1(0), Picture1(1), Picture1(2), Pictur1(3),...

    Così potevo gestirmi ogni singola picture a mio piacimento, però qui in vb.net non riesco a capire come fare.. nel senso come posso richiamare una picture in particolare? che "nomi" hanno? Perchè mi pare che facendo Picture(x).ecc non va, da errore

  4. #4
    [b]... come posso fare per mantenere la scritta stampata sulla picture anche se vado a modificare backgroundimage?
    Ma se il tuo scopo principale è mentenere la scritta e cambiare l' immagine, io non userei un PictureBox, ma un Panel, che ha la proprietà .BackgroundImage

    Un codice del genere scrive una sola volta, e la scritta non si cancella quando si cambia immagine posizionando il mouse sopra al Panel:

    codice:
    Public Class Form1
    
        Dim PB As New Panel
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            'creo un Pannello a runtime quando lancio il Form
    
            With PB
                .Name = "PB"
                .BackgroundImage = My.Resources.image1
                .Location = New System.Drawing.Point(50, 50)
                .Size = New Size(My.Resources.image1.Width, My.Resources.image1.Height)
            End With
    
            Me.Controls.Add(PB)
            AddHandler PB.Paint, AddressOf PB_Paint
            AddHandler PB.MouseHover, AddressOf PB_MouseHover
    
        End Sub
    
        Private Sub PB_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)
    
            Dim Font As New System.Drawing.Font("Arial", 12)
            e.Graphics.DrawString("Ciao", Font, Brushes.Blue, 4, 4)
    
        End Sub
    
        Private Sub PB_MouseHover()
    
            PB.BackgroundImage = My.Resources.image2
    
        End Sub
    
    End Class

  5. #5
    In vb6 avrei creato un array di picture: Picture1(0), Picture1(1), Picture1(2), Pictur1(3),...Così potevo gestirmi ogni singola picture a mio piacimento, però qui in vb.net non riesco a capire come fare..
    Le immagini dove sono? La cosa migliore è inserire le immagini nelle Risorse e poi, se proprio vuoi averle in un array:

    codice:
    Dim img(10) As Image 'globale
    
    'al form load
    img(0) = My.Resources.Image1 
    img(1) = My.Resources.Image2
    ecc ecc

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    98
    allora io ho una serie di immagini caricate nelle risorse.

    Quando apro il programma, esso mi crea una serie di picturebox.

    Nel momento in cui le creo quando do i vari parametri come la posizioni, visible=true, ecc. utilizzo anche il drawimage per disegnare sopra esse un'immagine.

    Poi con il codice da te proposto ci scrivo sopra l'immagine (disegnata nella picture) un testo.

    Quando passo sopra una picture con il mouse faccio cambiare l'immagine di sfondo (che fino ad ora non c'era) però facendo cambiare l'immagine di sfondo, mentre l'immagine disegnata con drawimage resta il testo disegnato con il codice da te sopra postato sparisce.

    Questo era un problema.

    Riguardo più che altro la mia "curiosità": volevo sapere come poter modificare ad esempio lo sfondo di una singola picture alla premuta di un pulsante.

    Il fatto è che con vb6 creavo un array di picture quindi era facile, qui invece non so come modificare una singola picture perchè non so come indicare a vb che intendo agire su quella determinata picture..

    per capirci con me.controls.item(x) [vado a memoria, ma dovrei averlo scritto giusto] riesco ad agire sugli oggetti del form e quindi anche sulle picture (per modificarne ad esempio il colore di sfondo) però il problema è che questo è un array di tutti gli oggetti del form, a me servirebbe di avere una specie di "sottoarray" riguardo solo le picturebox presenti..

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    98
    ok, sono riuscito a capire come agire su una singola picture.. grazie a questo documento:
    http://www.acthompson.net/DotNet/ControlArrays.htm

    che riporto in parte:
    codice:
    [...]
    The array will be declared at the top of the class declaration after the controls on the form are declared. The statement will look something like:
    
    Public Class Form1
    
    Inherits System.Windows.Forms.Form
    
    Dim ships(4) As PictureBox
    
    Now that your picture boxes have been created and an array has been declared to hold references to them they must be copied into the array. This is done using a set of assignment statements in the class constructor after the call to the InitializeComponent method like the example below.
    
    InitializeComponent()
    
    ships(0) = PictureBox1
    
    ships(1) = PictureBox2
    
    ships(2) = PictureBox3
    
    ships(3) = PictureBox4
    
    This will allow you to move these objects using a loop. These objects can be moved by changing the location property of the object. A new point is determined and assigned to the location property of the object. This code might look something like the following:
    
    Dim i As Int16
    
    Dim newPoint As Point
    
    For i = 0 To 3
    
    newPoint.Y = ships(i).Location.Y + 5
    
    If newPoint.Y > 200 Then newPoint.Y = 0
    
    newPoint.X = ships(i).Location.X
    
    ships(i).Location = newPoint
    
    Next
    
    [...]
    Ora posso agire sulle singole picture.. ma mi ritrovo con il solito problema, come disegnare del testo sopra la picture senza cancellare ciò che già ci avevo disegnato sopra?

    Il problema è che nell'esempio che mi hai fatto sopra (PB_Paint) utilizzi "e.Graphics.DrawString" e so che "e As System.Windows.Forms.PaintEventArgs" quindi per risolvere a me basterebbe anche richiamare solo PB_Paint ma non so che valore passargli perchè non so "e" che cosa sia.. nel senso che non saprei come richiamarla..
    Call PB_Paint(????)

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    98
    ok ci sono quasi.. riesco finalmente a richiamare questa sub per disegnare del testo passandogli la picture precisa su cui disegnarlo:
    codice:
        Private Sub DrawText(ByVal pict As System.Object, ByVal Text As String) 'As Bitmap
            Dim TextBitmap As New Bitmap(100, 100)
            Dim Brush As New SolidBrush(Color.Black)
            Dim SelectedFont = New Font("Arial", 20)
            Using Graphic = Graphics.FromImage(TextBitmap)
                Graphic.DrawString(Text, SelectedFont, Brush, 0, 0)
                Dim Btn As PictureBox
    
                Btn = DirectCast(pict, PictureBox)
    
                Btn.CreateGraphics.DrawImage(TextBitmap, 0, 0)
            End Using
        End Sub
    Ma c'è un problema.. questa sub la richiamo dall'evento mouseenter della picture interessata, il problema è che il testo viene disegnato ma solo per un attimo, poi sparisce subito... invece se prima della terz'ultima riga della sub postata sopra metto un msgbox con scritto qualunque cosa il testo appare e anche dopo che chiudo il msgbox rimane.. come mai?

    questa è la sub da dove richiamo DrawText:

    codice:
        Private Sub MouseEnterPicture(ByVal sender As System.Object, ByVal e As System.EventArgs)
                Dim Btn As PictureBox
                Btn = DirectCast(sender, PictureBox)
                Btn.BackgroundImage = My.Resources.button
                Call DrawText(Btn, "AAAAA")
    End Sub
    ovviamente si tratta di picturedinamiche create in form_load e che collego a MouseEnterPicture con:

    codice:
     AddHandler Pic.MouseEnter, AddressOf MouseEnterPicture
    EDIT: Ho notato anche che basta mettere un msgbox in MouseEnterPicture per far funzionare tutto correttamente..

    codice:
                Btn.BackgroundImage = My.Resources.button
    msgbox "Prova"
                Call DrawText(Btn, "AAAAA")
    come mai questa stranezza O.o? Ho provato a mettere una pausa ma non funziona..
    il codice per la pausa utilizzato è questo:
    codice:
        Public Sub Pausa(ByVal tempo As Double)
            Dim Start, Finish, TotalTime As Double
            Start = Microsoft.VisualBasic.DateAndTime.Timer
            Finish = Start + tempo '5.0   ' Set end time for 5-second duration.
            Do While Microsoft.VisualBasic.DateAndTime.Timer < Finish
                ' Do other processing while waiting for 5 seconds to elapse.
            Loop
            TotalTime = Microsoft.VisualBasic.DateAndTime.Timer - Start
        End Sub

    RISOLTO: bastava mettere un refresh!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.