Quelqu'un a-t-il un exemple en C # montrant un tabcontrol dessiné par le propriétaire avec des effets de suivi à chaud?

StackOverflow https://stackoverflow.com/questions/215758

Question

Quelqu'un a-t-il un exemple en C # montrant un contrôle tabulaire dessiné par le propriétaire avec des effets de suivi à chaud?

J'ai implémenté un tabcontrol bien dessiné par le propriétaire en utilisant C # et .NET 2.0, mais je suis perplexe quant à l'implémentation des effets de suivi à chaud.

Des idées?

Était-ce utile?

La solution

Voici un moyen de procéder en utilisant MouseEnter , MouseMove et MouseLeave pour déclencher les actions redessine. Je l'ai rendu un peu plus compliqué que la mise en œuvre la plus élémentaire, pour éviter le scintillement. C'est à vous de choisir comment indiquer l'onglet Hot-Track actuel; dans l'exemple que je viens de changer la couleur de fond de l'onglet.

Dans mon cas, l'onglet était membre d'un formulaire et je gérais les différents événements du formulaire, mais il pouvait facilement être adapté pour utiliser des remplacements virtuels dans une classe TabControl dérivée personnalisée.

// the index of the current hot-tracking tab
private int hotTrackTab = -1;

// returns the index of the tab under the cursor, or -1 if no tab is under
private int GetTabUnderCursor()
{
    Point cursor = this.tabs.PointToClient( Cursor.Position );
    for( int i = 0; i < this.tabs.TabPages.Count; i++ )
    {
        if( this.tabs.GetTabRect( i ).Contains( cursor ) )
            return i;
    }
    return -1;
}

// updates hot tracking based on the current cursor position
private void UpdateHotTrack()
{
    int hot = GetTabUnderCursor();
    if( hot != this.hotTrackTab )
    {
        // invalidate the old hot-track item to remove hot-track effects
        if( this.hotTrackTab != -1 )
            this.tabs.Invalidate( this.tabs.GetTabRect( this.hotTrackTab ) );

        this.hotTrackTab = hot;

        // invalidate the new hot-track item to add hot-track effects
        if( this.hotTrackTab != -1 )
            this.tabs.Invalidate( this.tabs.GetTabRect( this.hotTrackTab ) );

        // force the tab to redraw invalidated regions
        this.tabs.Update();
    }
}

private void tabs_DrawItem( object sender, DrawItemEventArgs e )
{
    // draw the background based on hot tracking
    if( e.Index == this.hotTrackTab )
    {
        using( Brush b = new SolidBrush( Color.Yellow ) )
            e.Graphics.FillRectangle( b, e.Bounds );
    }
    else
    {
        e.DrawBackground();
    }

    // draw the text label for the item, other effects, etc
}


private void tabs_MouseEnter( object sender, EventArgs e )
{
    UpdateHotTrack();
}

private void tabs_MouseLeave( object sender, EventArgs e )
{
    UpdateHotTrack();
}

private void tabs_MouseMove( object sender, MouseEventArgs e )
{
    UpdateHotTrack();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top