我已经将TabControl扩展为支持单个选项卡的关闭按钮。看到这个截图:扩展.net的一些问题TabControl
问题1
悬停在关闭按钮不会立即触发按钮的MouseHover事件。有一个约200毫秒的小延迟,导致图像悬停状态显示延迟。如果我将鼠标悬停在按钮上,事件根本不会触发。
我用下面的代码放置该按钮到TabControl的(使按钮的的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中使用?
#1:问题是,用OwnerDrawFixed我会失去视觉风格。这不是一个选项。 #2:我想我必须手动绘制。尽管现在我对结果感到满意。 #3:仅适用于OwnerDrawFixed或固定的选项卡宽度,这不是选项。我申请了黑客(追加空格),工作正常。 #4:我猜到了。在我的尝试中,我发现它不可能是非常麻烦的。当前状态:http://imgur.com/jzZZtDC – user990827
@ user990827您必须通过OwnerDraw丢失视觉样式,但确实触摸很复杂。有一些信息[这里](http://msdn.microsoft.com/en-gb/library/windows/desktop/dd373487(v = vs.85).aspx) –
谢谢你看起来很有趣。虽然看起来很复杂。 – user990827