Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [VB.NET] DrawRectangle con DrawItem

    un saluto a tutto il forum..

    in una prova che sto eseguendo con l'oggetto TabControl, ho un problema, non riesco a far colorare lo sfondo del titolo delle schede di pagina. Ho utilizzato l'evento di TabControl.DrawItem con l'opportuno settaggio a priori di DrawItemMode=OwnerDrawFixed :

    questo è l'evento DrawItem del controllo TabControl:

    codice:
        Private Sub TabControl_DrawItem(sender As Object, e As DrawItemEventArgs) Handles TabControl.DrawItem
            Application.DoEvents()
            'se la scheda corrente è selezionata , il titolo viene visualizzato evidenziato
            If e.Index = sender.SelectedIndex Then e.DrawFocusRectangle() : e.DrawBackground()
    
            ' se in corso l'elaborazione dati per questa scheda allora disegna il progresso sulla barra del titolo scheda corrente
            If sender.TabPages(e.Index).text = "Palazzina " & DisegnoOggettoNome_InCorso Then e.Graphics.DrawRectangle(Pens.LimeGreen, e.Bounds) 
    
            ' disegna e centra il nome nel titolo della scheda corrente
            Dim StringM As New SizeF(e.Graphics.MeasureString(sender.TabPages(e.Index).text, sender.font)),
                LocationF As New Point(e.Bounds.X + (e.Bounds.Width / 2 - StringM.Width / 2), e.Bounds.Y + (e.Bounds.Height / 2 - StringM.Height / 2))
            e.Graphics.DrawString(sender.TabPages(e.Index).text, e.Font, New SolidBrush(e.ForeColor), LocationF)
    
        End Sub
    o meglio... il rettangolo viene disegnato...si nota perchè ai bordi delle schede s'intravede il colore LimeGreen, ma non su tutto lo sfondo del titolo scheda, come se ci fosse qualcos'altro in primo piano che lo copre.. non capisco a cosa sia dovuto.. dovrei capire il meccanismo per poter poi integrare una specie di barra progresso personalizzata... tramite la gestione dello sfondo in questione?

    ps. sò dell'esistenza del metodo e.DrawBackground() ma non fà al caso mio..
    Michele

  2. #2
    Utente di HTML.it L'avatar di Vinsent
    Registrato dal
    May 2011
    Messaggi
    314
    Bell' idea...mi piace!
    Il rettangolo viene sovrascritto dal disegno della tabpage stessa, prova a cambiare "apparence" e nota la differenza.
    Quindi, devi fare il rettangolo più piccolo in modo che non si intersechi con il bordo, es:
    codice:
    e.Graphics.DrawRectangle(Pens.LimeGreen, e.Bounds.X + 3, e.Bounds.Y + 3, e.Bounds.Width - 4, e.Bounds.Height - 4)
    e di conseguenza centrare il testo.
    Comunque, usando un tabcontrol credo sia bella tosta riuscire a integrare una barra di progresso, penso sia più semplice usare un paio di usercontrol, sopratutto se il numero delle tabpage sono fisse.

    ciao

  3. #3
    ho bisogno di riposo

    adesso mi accorgo dal codice postato da Vinsent che sono io che sbaglio a disegnare un rettangolo vuoto anzichè un rettangolo pieno

    con Draw... disegna solo il bordo del rettangolo:
    e.Graphics.DrawRectangle(Pens.LimeGreen, e.Bounds)

    mentre con fillRectangle:

    e.Graphics.FillRectangle(Brushes.LimeGreen, e.Bounds)

    disegna un rettangolo pieno.


    @Vinsent:
    adesso, per far comparire una semplice barra di progresso, con quel comando, basta passagli come argomento la dimensione del rettangolo che varia solo nella proprietà "Width", in base al progresso raggiunto si vedrà il rettangolo in questione che avanza .. ci sono tante vie...
    le mie tab, assieme al contenuto, vengono create dinamicamente dal altrettanti thread paraleli in background...

    domani provo a implementare questa feature..
    Michele

  4. #4
    Utente di HTML.it L'avatar di Vinsent
    Registrato dal
    May 2011
    Messaggi
    314
    OK per il FillRectangle come progressbar, complimenti sempre per l'idea!
    Ho un dubbio sul discorso dei Thread paralleli, nel senso che se ognuno gira in background ogni thread deve accedere allo stesso controllo di un processo differente con la possibilità di "accavallarsi" nell' invocare il drawitem del controllo in questione, non c' è pericolo di generare un' eccezione?

  5. #5
    si esattamente... il metodo DrawItem andrà invocato con il delegato non dovrebbe accavallarsi..
    Michele

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.