【问题标题】:How can I get a TabPage from a TabControl based on a Point?如何从基于点的 TabControl 中获取 TabPage?
【发布时间】:2010-10-29 15:37:43
【问题描述】:

当然,这得到很容易;我只是运气不好。

如何获得标签包含给定Point 的给定TabControlTabPage?例如,如果我正在处理 MouseUp 事件,并且我想知道鼠标在释放时位于哪个选项卡上。

我试过GetChildAtPoint,但这似乎总是返回第一个标签(除非我用错了)。

【问题讨论】:

  • 你的意思是你想要它的标题悬停的页面,对吧?
  • @Homam:对,我想知道该点位于哪个 tab 内(标签本身,而不是它所附加到的较大页面)。

标签: .net winforms mouse tabcontrol tabpage


【解决方案1】:

试试这个:

TabPage GetPageByPoint(TabControl tabControl, Point point)
{
    for (int i = 0; i < tabControl.TabPages.Count; i++)
    {
        TabPage page = tabControl.TabPages[i];
        if (tabControl.GetTabRect(i).Contains(point))
            return page;
    }
    return null;
}

祝你好运!

【讨论】:

  • 我确实试过这个,但没有运气!伙计,我认为问题在于我正在处理 screen 上的一个点,而不是与选项卡控件的客户区相关。也许我可以很快完成翻译...
  • 你提到你正在使用 [MouseUp] 事件,我已经尝试过了,只需将 [e.Location] 传递给方法即可。
  • 啊哈!只需要添加一点TabControl.PointToClient 魔法来将屏幕坐标转换为相对于选项卡控件位置的Point。很好,谢谢!
  • 对不起,我不应该说MouseUp(虽然我最初使用的是那个);我最终需要在提供屏幕坐标的DragDrop 上处理这个问题。
【解决方案2】:

您可以尝试将 GetChildAtPoint 的重载与 GetChildAtPointSkip 一起使用 - this Connect bug 表明它可以工作。

【讨论】:

  • 绝对是一个有用的重载,但我似乎无法弄清楚如何在这里应用它。 GetChildAtPointSkip 枚举的可用标志是 InvisibleDisabledTransparent;但事实上,我实际上并不想“跳过”任何页。我只想要给定点的实际标签。我认为声称该错误已通过 Connect 上的此重载修复的 MS 代表要么是错误的,要么是指一个稍微不同的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多