Jedermann hat ein # Beispiel C einen Besitzer gezogen tabcontrol mit Hot-Tracking-Effekten zeigt?

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

Frage

Wer noch ein C # Beispiel zeigt einen Besitzer gezeichnet tabcontrol mit Hot-Tracking-Effekten?

ich einen netten Eigentümer gezeichnet tabcontrol mit C # und .NET 2.0 implementiert haben, aber ich bin ratlos, wenn es um die Umsetzung Hot-Tracking-Effekte kommt.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Hier ist eine Möglichkeit, es zu tun, mit MouseEnter- , Mouse und Leave die notwendige auszulösen neu gezeichnet. Ich habe es ein wenig komplizierter als die grundlegendsten Implementierung, um Flimmern zu vermeiden. Es liegt an Ihnen, wie Sie die aktuelle Hot-Spur Registerkarte anzuzeigen; im Beispiel wechselte ich von den Registerkarte nur die Hintergrundfarbe.

In meinem Fall war die Registerkarte Mitglied einer Form und ich behandeln die verschiedene Ereignisse in der Form, aber es leicht angepasst werden könnte virtuelle Überschreibungen in einer benutzerdefinierten abgeleiteten TabControl-Klasse zu verwenden.

// 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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top