65.9K
CodeProject 正在变化。 阅读更多。
Home

确定点击了哪个TabPage

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2011 年 11 月 8 日

CPOL

1分钟阅读

viewsIcon

32151

一种二分查找技术,用于确定点击了TabControl的哪个TabPage

我正在开发的一个WinForms应用程序有很多TabControl,并且TabPages的数量是可变的(可能很多)。我想允许用户点击并拖动标签来重新排序TabPages。 快速查阅文档没有找到任何相关信息,并且在网上快速搜索后发现这是一个常见问题。 情况是TabPages不会接收鼠标事件,它们的父控件TabControl会接收,然后你必须使用TabControl的方法来确定点击了哪个TabPage。 我浏览了The Code Project上关于此主题的两篇文章,了解了其他人是如何实现这个功能的,它们提供了一个很好的起点,但是(因为是我)我提出了自己的解决方案。 我想要的是在MouseDownMouseUp时获取TabPage的索引。 最初,我实现了一个简单的迭代搜索TabPage,但今天我意识到使用二分查找技术会更好(至少在有大量TabPage的情况下),所以我进行了更改
private static int
GetTabIndexAt
(
  System.Windows.Forms.TabControl TabControl
,
  System.Drawing.Point            Point
)
{
  int result = -1 ;

  if ( TabControl != null )
  {
    int lo = 0 ;
    int hi = TabControl.TabPages.Count - 1 ;

    while ( ( result == -1 ) && ( lo <= hi ) )
    {
      int mid = lo + ( hi - lo ) / 2 ;
      System.Drawing.Rectangle rect = TabControl.GetTabRect ( mid ) ;

      if ( rect.Contains ( Point ) )
      {
        result = mid ;
      }
      else if ( ( Point.X < rect.Left ) || ( Point.Y < rect.Top ) )
      {
        hi = mid - 1 ;
      }
      else
      {
        lo = mid + 1 ;
      }
    }
  }

  return ( result ) ;
}
编辑:添加了( Point.Y < rect.Top )的测试,以处理左对齐的标签--但它仍然只适用于单行或单列的标签。
© . All rights reserved.