Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,552

    [vb.net] evidenziare etichetta di tabcontrol

    salve a tutti
    vorrei evidenziare l'etichetta di una tab control di rosso
    ovviamente non cambiando il font, ma da drawstring!

    utilizzando il seguente codice:

    codice:
    'variabili
    Dim rect As New System.Drawing.Rectangle
        Dim RedPen As New Pen(Color.Red, 3)
        Dim graphics As System.Drawing.Graphics
    
    
            
            
             rect = TABControl1.Bounds 
            graphics.DrawRectangle(RedPen, rect)
            Dim ScreenLocation As Point
            Dim p As Point = New Point(rect.X, rect.Y)
            If Not parent Is Nothing Then
                ScreenLocation = parent.PointToScreen(p)
    il problema è che mi disegna una rettangolo rosso: TUTTO OK
    ma su tutta l'area della tab control
    mentre io voglio solo sulla linguetta in alto

    cosa sbaglio?
    in tutte le proprietà della tab control non c'è qualcosa che ti gestisce la linguetta
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  2. #2
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,521
    Quote Originariamente inviata da Kahm Visualizza il messaggio
    salve a tutti
    vorrei evidenziare l'etichetta di una tab control di rosso
    ovviamente non cambiando il font, ma da drawstring!

    utilizzando il seguente codice:

    codice:
    'variabili
    Dim rect As New System.Drawing.Rectangle
        Dim RedPen As New Pen(Color.Red, 3)
        Dim graphics As System.Drawing.Graphics
    
    
            
            
             rect = TABControl1.Bounds 
            graphics.DrawRectangle(RedPen, rect)
            Dim ScreenLocation As Point
            Dim p As Point = New Point(rect.X, rect.Y)
            If Not parent Is Nothing Then
                ScreenLocation = parent.PointToScreen(p)
    il problema è che mi disegna una rettangolo rosso: TUTTO OK
    ma su tutta l'area della tab control
    mentre io voglio solo sulla linguetta in alto

    cosa sbaglio?
    in tutte le proprietà della tab control non c'è qualcosa che ti gestisce la linguetta
    Ciao,
    in quel codice direi che sbagli le dimensioni del rettangolo....

    Le dimensioni della "label" si ottengono dal parametro di tipo DrawItemEventArgs che viene passato al metodo (o funzione in vb) OnDrawItem del TabControl, ti basta fare un override di quest'ultimo e non dovresti più avere problemi. Non dimenticare di impostare DrawMode del TabControl a TabDrawMode.OwnerDrawFixed

    codice:
    Public Class MyTabControl
        Inherits TabControl
    
    Public Sub New()
            Me.DrawMode = TabDrawMode.OwnerDrawFixed
        End Sub
    
       Protected Overrides Sub OnDrawItem(e As DrawItemEventArgs)
           Dim coloreTesto As Brush = New System.Drawing.SolidBrush(e.ForeColor)
           If e.State = DrawItemState.Selected Then
               coloreTesto = ColoreTestoSelezionato
               e.Graphics.FillRectangle(ColoreSfondoSelezionato, e.Bounds)
           Else
               e.DrawBackground()
           End If
           e.Graphics.DrawString(Me.TabPages(e.Index).Text, Font, coloreTesto, Me.GetTabRect(e.Index), New StringFormat(Me.AllineamentoScritta))
           MyBase.OnDrawItem(e)
       End Sub
    
        Private m_coloreTestoSelezionato As Brush = New SolidBrush(Color.WhiteSmoke)
        Public Property ColoreTestoSelezionato() As Brush
            Get
                Return Me.m_coloreTestoSelezionato
            End Get
            Set(value As Brush)
                Me.m_coloreTestoSelezionato = value
            End Set
        End Property
        Private m_coloreSfondoSelezionato As Brush = New SolidBrush(Color.Red)
        Public Property ColoreSfondoSelezionato() As Brush
            Get
                Return Me.m_coloreSfondoSelezionato
            End Get
            Set(value As Brush)
                Me.m_coloreSfondoSelezionato = value
            End Set
        End Property
        Private m_allineamentoScritta As New StringFormat() With { _
             .Alignment = StringAlignment.Center, _
             .LineAlignment = StringAlignment.Center _
        }
        Public Property AllineamentoScritta() As StringFormat
            Get
                Return Me.m_allineamentoScritta
            End Get
            Set(value As StringFormat)
                Me.m_allineamentoScritta = value
            End Set
        End Property     
    End Class
    Comunque se vuoi personalizzare davvero le tue applicazioni senza troppi sbattimenti, ti consiglio di passare a WPF, parliamo di un altro mondo...

    Ultima modifica di U235; 05-10-2013 a 03:13

  3. #3
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,552
    che intendi con altro mondo?
    per il codice: grazie ora è sabato e lunedi provo

    volevo passare delle mie applicazioni a WPF ma penso che sia un lavoro enorme fare una conversione
    e non esistono tool di conversione

    tu ti trovi bene vero? e perchè? se posso saperlo brevemente?
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  4. #4
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,521
    Quote Originariamente inviata da Kahm Visualizza il messaggio
    che intendi con altro mondo?
    per il codice: grazie ora è sabato e lunedi provo

    volevo passare delle mie applicazioni a WPF ma penso che sia un lavoro enorme fare una conversione
    e non esistono tool di conversione

    tu ti trovi bene vero? e perchè? se posso saperlo brevemente?
    Ciao,
    si, io mi trovo benissimo con WPF. Non ti nego che all'inizio ho dovuto sudare per abituarmi alla logica WPF (quella corretta però ) , ma dopo mi sono reso conto quanto facile sia creare interfacce grafiche accattivanti, creare esattamente i comportamenti e i controlli desiderati con poco sforzo (confronto allo sforzo da fare con win form). Ad esempio prendendo il tuo caso del tabcontrol sarebbe bastato impostare la Header del TabItem (etichetta del tab) con qualsiasi elemento voglia ed impostarlo a mio piacimento, senza dover scrivere nemmeno una riga di codice. Esempio :
    codice:
    <TabControl Height="42">
                    <TabItem>
                        <TabItem.Header>
                            <Ellipse Name="Ellipse1" StrokeThickness="5" Stroke="Blue"/>
                        </TabItem.Header>
                    </TabItem>
                    <TabItem Background="Red">
                        <TabItem.Header>
                            <TextBlock Text="Testo" Background="Bisque"></TextBlock>
                        </TabItem.Header>
                    </TabItem>
                </TabControl>
    nel codice sopra ottengo un TabControl con 2 schede (ovviamente è solo un esempio...), la prima ha nella "linguetta" un ellissi blu, mentre la seconda ha del testo con uno sfondo, inoltre la seconda ha anche un colore di sfondo rosso quando non è selezionata.
    Come vedi in WPF puoi mettere qualsiasi cosa dentro qualsiasi cosa... se avessi voluto avrei potuto mettere dentro la linguetta ad esempio un combobox, o un listbox o un bottone o qualsiasi altra cosa ti possa venire in mente.


    Inoltre applicando MVVM la separazione tra gli strati dell'applicazione è resa molto semplice dal potentissimo motore di binding di WPF.
    Se poi scrivi bene il ViewModel e magari usi EF che ti permette con code first il massimo controllo sul codice, puoi scrivere applicazioni che girano sia su web (Silverlight), sia su desktop (WPF), ma anche Win RT e per windows phone senza troppe modifiche, ovviamente userai anche i RIA Service in questo caso, ma con EF è sostanzialmente una formalità, è davvero semplice esporre un RIA da EF con poco codice.

    Riguardo alla conversione da WinForm a WPF è chiaro che dipende da come hai scritto le tua applicazioni, ma credo che ci sia un bel po di lavoro da fare e non è semplicissimo, sopratutto se non conosci ancora bene WPF... Però ne avresti grandi vantaggi se scrivi bene il tutto. In sostanza ti direi di lasciare ciò che hai già fatto in winForm, ma per il futuro tieni in considerazione WPF...

  5. #5
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,552
    ciao
    ti rispondo per dirti che
    la soluzione WPF è ottima, ma dovrei aggiungere un nuovo progetto al mio windows Form
    sarebbe un lavorone enorme tradurre ogni windows FOrm in WPF

    per ora ho lasciato il rettangolo su tutto il tabControl, in attesa di migrazione
    che sicuramente farò
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  6. #6
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,521
    Quote Originariamente inviata da Kahm Visualizza il messaggio
    ciao
    ti rispondo per dirti che
    la soluzione WPF è ottima, ma dovrei aggiungere un nuovo progetto al mio windows Form
    sarebbe un lavorone enorme tradurre ogni windows FOrm in WPF

    per ora ho lasciato il rettangolo su tutto il tabControl, in attesa di migrazione
    che sicuramente farò
    Ciao Kahm,
    la soluzione in WPF era solo per rispondere alla tua domanda :

    tu ti trovi bene vero? e perchè? se posso saperlo brevemente?

    ed era solo un esempio per mostrarti la differenza tra WinForm e WPF, ma il primo codice era per WinForm, non per WPF, e se ho compreso la tua domanda dovrebbe fare quello che chiedi

    Guarda il mio primo post, quello è il codice VB per WinForm. Per l'esattezza è un derivato del TabControl che sovrascrive la label dei tabItem, basta usarlo al posto del TabControl.

    Ultima modifica di U235; 17-10-2013 a 11:40

  7. #7
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,552
    Quote Originariamente inviata da U235 Visualizza il messaggio
    Ciao Kahm,
    la soluzione in WPF era solo per rispondere alla tua domanda :

    tu ti trovi bene vero? e perchè? se posso saperlo brevemente?

    ed era solo un esempio per mostrarti la differenza tra WinForm e WPF, ma il primo codice era per WinForm, non per WPF, e se ho compreso la tua domanda dovrebbe fare quello che chiedi

    Guarda il mio primo post, quello è il codice VB per WinForm. Per l'esattezza è un derivato del TabControl che sovrascrive la label dei tabItem, basta usarlo al posto del TabControl.

    si infatti, ho subito capito che ne crei un'altro ad HOC che eredita dal tabControl e imposta quello che vuoi tu
    a mano

    il tuo codice è stato utilissimo, e messo da parte (commentato nel progetto) in attesa di utilizzo
    mi ha molto colpito WPF e penso che se non riesco a farlo in WPF lo farò come dal tuo esempio

    ovviamente ora cerco di fare la migrazionei di una singola Form, quindi il tempo che neccessita...eh beh..
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  8. #8
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,521
    Buon lavoro.
    Se hai bisogno sai dove scrivere

    Ciao.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.