¿Alguien tiene un ejemplo de C # que muestre un control de tabulación dibujado por el propietario con efectos de seguimiento en caliente?

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

Pregunta

¿Alguien tiene un ejemplo de C # que muestre un control de tabulación dibujado por el propietario con efectos de seguimiento en caliente?

He implementado un buen control de tabulación dibujado por el propietario utilizando C # y .NET 2.0, pero estoy perplejo cuando se trata de implementar efectos de seguimiento en caliente.

¿Alguna idea?

¿Fue útil?

Solución

Aquí hay una forma de hacerlo, utilizando MouseEnter , MouseMove y MouseLeave para activar lo necesario redibujar Lo hice un poco más complicado que la implementación más básica, para evitar el parpadeo. Depende de usted cómo indicar la pestaña actual de hot-track; en el ejemplo, acabo de cambiar el color de fondo de la pestaña.

En mi caso, la pestaña era miembro de un Formulario y manejé los diversos eventos en el formulario, pero podría adaptarse fácilmente para usar sustituciones virtuales en una clase TabControl derivada personalizada.

// 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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top