我扩展了 TabControl 以支持单个选项卡的关闭按钮。看这个截图:
问题 1
将鼠标悬停在关闭按钮上不会立即触发按钮的 MouseHover 事件。大约 200 毫秒的小延迟导致悬停状态的图像显示延迟。如果我将鼠标悬停在按钮上的速度足够快,则该事件根本不会触发。
我使用以下代码将按钮放在 TabControl 上(使 Button 成为 TabControl 的子项):
[DllImport("User32", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent);
...
SetParent(closeButton.Handle, this.Handle);
顺便说一句,这是不可能的:
closeButton.Parent = this; // this == instance of TabControl
它会导致异常,这就是我使用 API 调用的原因。
知道为什么 MouseHover 会延迟吗?
问题 2
关闭按钮不能使用具有透明背景的图像,因为背景将显示为系统控制颜色。我确实读过BackColor设置为透明的控件将采用父控件的BackColor。我的父控件是没有 BackColor 属性的 TabControl 实例。
有没有办法将 TabControl 的 BackColor 动态设置为透明?也许用winapi调用?
问题 3
正如您在屏幕截图中看到的那样,选项卡文本上缺少填充,导致关闭按钮覆盖文本。如何在不使用诸如在文本中添加一些空格之类的肮脏技巧的情况下解决此问题?
要获取选项卡标题项的位置,我使用 winapi 调用:
WinApi.RECT myRect = new WinApi.RECT();
WinApi.SendMessage(this.Handle, WinApi.TCM_GETITEMRECT, (IntPtr)this.TabPages.IndexOf(tab), ref myRect);
Rectangle realRect = new Rectangle(myRect.Left, myRect.Top, myRect.Width, myRect.Height);
也许有一种方法可以通过 api 调用来设置大小?可以设置 TCM_SETMINTABWIDTH,但这会更改所有选项卡的最小宽度。
问题 4
要定义哪个选项卡是可关闭的,我目前使用自定义方法:
ExtendedTabControl.SetTabCloseable(TabPage tab)
实现需要如何才能在 DesignMode 中工作?扩展 TabPage 类(添加属性“Closeable”),然后通知 VisualStudio(通过注释?)我的自定义 TabPage 类应该在 DesignMode 中使用?