当前位置:  开发笔记 > 编程语言 > 正文

任何人都有一个C#示例显示所有者绘制的tabcontrol具有热跟踪效果?

如何解决《任何人都有一个C#示例显示所有者绘制的tabcontrol具有热跟踪效果?》经验,为你挑选了1个好方法。

任何人都有一个C#示例显示所有者绘制的tabcontrol具有热跟踪效果?

我使用C#和.NET 2.0实现了一个很好的所有者绘制的tabcontrol,但是在实现热跟踪效果时我很难过.

有任何想法吗?



1> Charlie..:

这是一种方法,使用MouseEnter,MouseMove和MouseLeave来触发必要的重绘.我使它比最基本的实现复杂一点,以避免闪烁.由您决定如何指示当前的热门选项卡; 在示例中,我刚刚更改了选项卡的背景颜色.

在我的情况下,选项卡是一个Form的成员,我处理了表单中的各种事件,但它可以很容易地适应在自定义派生的TabControl类中使用虚拟覆盖.

// 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();
}

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有