任何人都有一个 C# 示例,显示具有热跟踪效果的所有者绘制的选项卡控件?
我已经使用 C# 和 .NET 2.0 实现了一个不错的所有者绘制的 tabcontrol,但是在实现热跟踪效果时我被难住了。
有任何想法吗?
任何人都有一个 C# 示例,显示具有热跟踪效果的所有者绘制的选项卡控件?
我已经使用 C# 和 .NET 2.0 实现了一个不错的所有者绘制的 tabcontrol,但是在实现热跟踪效果时我被难住了。
有任何想法吗?
这是一种方法,使用MouseEnter、MouseMove和MouseLeave来触发必要的重绘。为了避免闪烁,我使它比最基本的实现复杂一点。如何指示当前的热门标签由您决定;在示例中,我只是更改了选项卡的背景颜色。
在我的情况下,选项卡是表单的成员,我处理了表单中的各种事件,但它可以很容易地适应在自定义派生的 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();
}