none
colore tabpage RRS feed

  • Domanda

  • Ciao ragazzi,

    volevo sapere se e' possibile cambiare il colore dei pulsanti di selezione delle tabpage.

    sulle opzioni non ho trovato niente

    GRazie

    venerdì 9 dicembre 2011 02:18

Risposte

  • Eccolo:

    private void DrawTabCaption(Graphics g, string caption, int tabIndex, Rectangle rect)
    {
        var font = this.tabControl1.Font;
        if (tabIndex == 0)
        {
            // Prima tab
            g.FillRectangle(Brushes.Red, rect); // Sfondo rosso
            g.DrawString(caption, font, Brushes.White, rect.X + 1, (rect.Height / 2) - 5);  // Testo bianco
        }
        else if (tabIndex == 1)
        {
            // Seconda tab
            g.FillRectangle(Brushes.Blue, rect); // Sfondo blu
            g.DrawString(caption, font, Brushes.Yellow, rect.X + 1, (rect.Height / 2) - 5);  // Testo giallo
        }
        else
        {
             // Per tutte le altre tab
             g.FillRectangle(Brushes.White, rect); // Sfondo bianco
             g.DrawString(caption, font, Brushes.Green, rect.X + 1, (rect.Height / 2) - 5);  // Testo verde
        }
    }
    


    Marco Minerva [MCPD], http://blogs.ugidotnet.org/marcom
    • Proposto come risposta Irina Turcu mercoledì 14 dicembre 2011 16:12
    • Contrassegnato come risposta 82_marco giovedì 15 dicembre 2011 22:46
    mercoledì 14 dicembre 2011 08:33
    Moderatore

Tutte le risposte

  • ciao

    stai usando windowsforms?

    asp.net?

    wpf?


    Antonio Esposito
    MCT, MCPD, MCTS, MCP
    http://dotnetlombardia.org

    Italy
    venerdì 9 dicembre 2011 09:42
    Postatore
  • windowsforms

    cioe' riesco a cambiare il colore della pagina pero' quello della tab no

    sabato 10 dicembre 2011 11:26
  • ciao

     

    se non erro, windows forms non ha proprietà per definire quel colore....

    a differenza di wpf che usa sempre dei template modificabili o alterabili da stili.....

     

     


    Antonio Esposito
    MCT, MCPD, MCTS, MCP
    http://dotnetlombardia.org

    Italy
    sabato 10 dicembre 2011 13:16
    Postatore
  • Quindi posso solo cambiare colore alla pagina ma non al tab?

    sabato 10 dicembre 2011 20:15
  • Ciao 82_marco,

    Quindi posso solo cambiare colore alla pagina ma non al tab?


    confermo , con windowsForm puoi solamente cambiare il colore di sfondo su tutta la scheda e non solamente sul bordo superiore.

    Ciao.


    • Contrassegnato come risposta 82_marco domenica 11 dicembre 2011 03:52
    • Contrassegno come risposta annullato 82_marco domenica 11 dicembre 2011 03:52
    sabato 10 dicembre 2011 20:29
  • Ciao!

    Se vuoi cambiare il colore della Tab, devi gestire l'evento DrawItem: http://msdn.microsoft.com/en-us/library/system.windows.forms.tabcontrol.drawitem.aspx.

    Se può servirti, puoi anche dare un'occhiata a questo post: http://social.msdn.microsoft.com/forums/en-US/Vsexpressvb/thread/2c6ea859-7c46-4ce8-9f49-35eded645961/.


    Marco Minerva [MCPD], http://blogs.ugidotnet.org/marcom
    • Proposto come risposta Irina Turcu mercoledì 14 dicembre 2011 16:11
    domenica 11 dicembre 2011 12:26
    Moderatore
  • Ciao

    Ho visto gli esempi, penso sia quello che mi serve pero' se provo gli esempi mi da errore.

    sulle proprieta' dell tabcontrol metto DrawMode su OwnerDraw Fixed e poi gestisco l'evento DrawItem ma non riesco a fare funzionare l'esempio.

    qualcuno ci e' riuscito?

    lunedì 12 dicembre 2011 00:31
  • Ciao!

    Con questo codice ho ottenuto l'effetto desiderato:

    public Form1()
    {
        InitializeComponent();
        tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
    }
    
    private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
    {
        using (var g = e.Graphics)
        {
            for (int i = 0; i < tabControl1.TabCount; i++)
                this.DrawTabCaption(g, tabControl1.TabPages[i].Text, tabControl1.GetTabRect(i));
        }
    }
    
    private void DrawTabCaption(Graphics g, string caption, Rectangle rect)
    {
        var font = this.tabControl1.Font;
        g.FillRectangle(Brushes.Red, rect); // Sfondo rosso
        g.DrawString(caption, font, Brushes.White, rect.X + 1, (rect.Height / 2) - 5);  // Testo bianco
    }
    

    Tramite il metodo DrawTabCaption, ogni tab viene disegnata con sfondo rosso e testo bianco.

    Fammi sapere se così ti funziona correttamente. 


    Marco Minerva [MCPD], http://blogs.ugidotnet.org/marcom
    lunedì 12 dicembre 2011 01:44
    Moderatore
  • Si funziona perfettamente .-)

    e se volessi un colore per ogni tab?


    L' uso che ne dovrei fare e' questo: a seguito di determinate condizioni durante il funzionamento del programma il colore delle tab dovrebbe cambiare, alcune addirittura lampeggiare.

    L'evento drawitem viene ripetuto ad ogni ciclo di programma o devo procedere in un altro modo?

    • Modificato 82_marco lunedì 12 dicembre 2011 20:45
    lunedì 12 dicembre 2011 20:38
  • Se vuoi cambiare il colore per ogni tab, ti basta modificare il metodo DrawTabCaption, dove si impostano colore di sfondo e del testo (come indicato dai commenti). Ad esempio, potresti passare al metodo anche l'indice della tab, e quindi assegnare ad ognuna un colore diverso.

    Se vuoi forzare l'invocazione dell'evento DrawItem, puoi invocare il metodo Refresh del TabControl.


    Marco Minerva [MCPD], http://blogs.ugidotnet.org/marcom
    lunedì 12 dicembre 2011 22:28
    Moderatore
  • adesso e' un po' tardi per provare, domani ci provo e poi ti dico come e' andata.

    Dove passo l'indice della tab?

     

    lunedì 12 dicembre 2011 23:18
  • Lo puoi passare al metodo DrawTabCaption, ad esempio così:

    private void DrawTabCaption(Graphics g, string caption, int tabIndex, Rectangle rect)
    {
        var font = this.tabControl1.Font;
        g.FillRectangle(Brushes.Red, rect); // Sfondo rosso
        g.DrawString(caption, font, Brushes.White, rect.X + 1, (rect.Height / 2) - 5);  // Testo bianco
    }
    
    
    Nel ciclo for dell'evento tabControl1_DrawItem, quando richiami tale metodo passi anche la variabile i, che già usi per ciclare su tutte le tab.


    Marco Minerva [MCPD], http://blogs.ugidotnet.org/marcom
    lunedì 12 dicembre 2011 23:25
    Moderatore
  • Ciao in che senso passo anche la variabile i?

    ho provato ma mi da il seguente errore: Errore 1 Nessun overload del metodo 'DrawTabCaption' accetta argomenti '3' 

    martedì 13 dicembre 2011 17:37
  • Se stai utilizzando la nuova versione del metodo DrawTabCaption che ti ho passato, devi modificare di consiguenza l'evento tabControl1_DrawItem, facendo in modo che, quando dentro il ciclo for richiami il metodo DrawTabCaption, passi ad esso anche il valore di i. Ovvero:

    private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
    {
        using (var g = e.Graphics)
        {
            for (int i = 0; i < tabControl1.TabCount; i++)
                this.DrawTabCaption(g, tabControl1.TabPages[i].Text, i, tabControl1.GetTabRect(i));
        }
    }
    
    


    Marco Minerva [MCPD], http://blogs.ugidotnet.org/marcom
    martedì 13 dicembre 2011 17:45
    Moderatore
  •     public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
            }
    
            private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
            {
                using (var g = e.Graphics)
                {
                    for (int i = 0; i < tabControl1.TabCount; i++)
                        this.DrawTabCaption(g, tabControl1.TabPages[i].Text, i, tabControl1.GetTabRect(i));
                }
            }
    
    
            private void DrawTabCaption(Graphics g, string caption, int tabIndex, Rectangle rect)
            {
                var font = this.tabControl1.Font;
                g.FillRectangle(Brushes.Red, rect); // Sfondo rosso
                g.DrawString(caption, font, Brushes.White, rect.X + 1, (rect.Height / 2) - 5);  // Testo bianco
            }
    
    
        }
    

     Ho fatto cosi ma il colore cambia su tutte le tab
    martedì 13 dicembre 2011 19:05
  • Certo... Io ti ho solo scritto lo scheletro dell'algoritmo, ma tu che devi modificare il metodo DrawTabCaption per impostare colori diversi per le tab in base al valore del parametro i :-)
    Marco Minerva [MCPD], http://blogs.ugidotnet.org/marcom
    martedì 13 dicembre 2011 20:01
    Moderatore
  • Ma se i=0 assegno il colore alla tab1, giusto?

    mi sfugge qualcosa mi sa....

    mi potresti fare vedere come assegni i colori a 2 tab per favore?

    mercoledì 14 dicembre 2011 00:53
  • Eccolo:

    private void DrawTabCaption(Graphics g, string caption, int tabIndex, Rectangle rect)
    {
        var font = this.tabControl1.Font;
        if (tabIndex == 0)
        {
            // Prima tab
            g.FillRectangle(Brushes.Red, rect); // Sfondo rosso
            g.DrawString(caption, font, Brushes.White, rect.X + 1, (rect.Height / 2) - 5);  // Testo bianco
        }
        else if (tabIndex == 1)
        {
            // Seconda tab
            g.FillRectangle(Brushes.Blue, rect); // Sfondo blu
            g.DrawString(caption, font, Brushes.Yellow, rect.X + 1, (rect.Height / 2) - 5);  // Testo giallo
        }
        else
        {
             // Per tutte le altre tab
             g.FillRectangle(Brushes.White, rect); // Sfondo bianco
             g.DrawString(caption, font, Brushes.Green, rect.X + 1, (rect.Height / 2) - 5);  // Testo verde
        }
    }
    


    Marco Minerva [MCPD], http://blogs.ugidotnet.org/marcom
    • Proposto come risposta Irina Turcu mercoledì 14 dicembre 2011 16:12
    • Contrassegnato come risposta 82_marco giovedì 15 dicembre 2011 22:46
    mercoledì 14 dicembre 2011 08:33
    Moderatore
  • Ecco cosa mi mancava... il ciclo if sui tab index :-(

    ora mi funziona, sto facendo delle prove per addatarlo ai miei bisogni.

     

    Riguardo il cambio di colore durante il funzionamento del programma come devo usare la funzione refresh?

    giovedì 15 dicembre 2011 00:48
  • Basta che richiami il metodo Refresh del TabControl: questa invocazione scatenerà a sua volta l'invocazione del metodo DrawItem, che forzerà il ridisegno delle tab tramite il solito metodo DrawTabCaption. Ti basta inserire all'interno di quest'ultimo la logica per utilizzare colori diversi sulle tab: ad esempio, potresti fare in modo che la prima tab abbia sfondo rosso se una certa variabile del tuo programma vale 0, verde se vale 1, blu in tutti gli altri casi (giusto per farti un esempio).
    Marco Minerva [MCPD], http://blogs.ugidotnet.org/marcom
    giovedì 15 dicembre 2011 01:11
    Moderatore
  • da dove richiamo il metodo refresh?
    giovedì 15 dicembre 2011 09:39
  • Lo devi richiamare nel momento in cui hai bisogno di effettuare il cambio di colore delle tab.
    Marco Minerva [MCPD], http://blogs.ugidotnet.org/marcom
    giovedì 15 dicembre 2011 09:53
    Moderatore
  • scusa ma non riesco a capire la sintassi  del codice :-(
    giovedì 15 dicembre 2011 17:34
  • Quale sintassi non capisci?
    Marco Minerva [MCPD], http://blogs.ugidotnet.org/marcom
    giovedì 15 dicembre 2011 17:36
    Moderatore
  • dove mettere il comando di refresh
    giovedì 15 dicembre 2011 20:49
  • Questo non lo so... Dipende dalla tua applicazione, devi essere tu a decidere in quale momento vuoi cambiare il colore delle etichette delle tab: in quel momento, devi invocare il metodo Refresh, che scatenerà il ridisegno del controllo, ad esempio utilizzando i nuovi colori che avrai impostato.
    Marco Minerva [MCPD], http://blogs.ugidotnet.org/marcom
    giovedì 15 dicembre 2011 21:33
    Moderatore
  • Allora dovrei cambiare colore quando una variabile va ad 1.

    quindi 

    if var1 = 1

    {

    // qui dovrei invocare il refresh, giusto? qual e' il comando per invocarlo?

    }

     

    giovedì 15 dicembre 2011 21:42
  • Sì, lo devi invocare il quel punto. Il comando, supponendo che il tuo controllo si chiami TabControl1, è TabControl1.Refresh(). Ovviamente, all'interno del metodo DrawTabCaption, devi aggiungere logica per controllare il valore di var1 e impostare di conseguenza il colore delle tab.
    Marco Minerva [MCPD], http://blogs.ugidotnet.org/marcom
    giovedì 15 dicembre 2011 21:45
    Moderatore
  • quindi:

    if var1 = 1

    {

    TabControl1.REfresh();

    }

     

    e poi dentro DrawTabCaption metto che se var1 = 1 le tab devono essere di un certo colore

    ho capito bene? :-)

    giovedì 15 dicembre 2011 22:12
  • Esatto :-)
    Marco Minerva [MCPD], http://blogs.ugidotnet.org/marcom
    giovedì 15 dicembre 2011 22:14
    Moderatore
  • finalmente :-) grazie
    giovedì 15 dicembre 2011 22:45
  • Ce l'abbiamo fatta :-)

    Alla prossima!


    Marco Minerva [MCPD], http://blogs.ugidotnet.org/marcom
    giovedì 15 dicembre 2011 22:54
    Moderatore