我有winforms TabControl的扩展,它在每个选项卡上绘制一个X,以允许用户关闭选项卡。
alt text http://i41.tinypic.com/bhelqp.jpg
将其与标准相比较:
alt text http://i42.tinypic.com/2zqa2c3.jpg
如何在该图像上模拟按钮外观和感觉?我的意思是,当用户点击时,它应该在视觉上表明。按钮使用插入图像执行此操作。对于奖励积分,我也想做悬停部分 - 鼠标悬停时图像将“亮起”。
但是X不是一个按钮,它不是PictureBox控件。它根本不是一种控制。它刚刚被吸引到那里。
有没有办法在MouseDp上绘制插入边框并在MouseUp上提升?对于“插入”阶段,我会更好地生成另一个图像吗? (和另一个悬停)。
之前有人这么做过吗?相关:Simulate Winforms Button Click Animation
但这个问题不同,因为他实际上有一个PictureBox控件。我不。
答案 0 :(得分:5)
如果您刚刚在那里画了它,那么您需要执行以下操作:
我拼凑了一些关于它看起来如何的代码
myControl.MouseClick += new EventHandler(myClickHandler);
private void myClickHandler(EventArgs e)
{
//Check e to see if left button was pressed
//Check e location to see if mouse is in correct location, i.e. over the "X"
//If so then alter a state variable i.e. tabstates[0] = TabStates.HOVER;
}
private void myDrawingFunc()
{
//Draw X
if (tabstates[0] == TabStates.HOVER)
{
//Draw hover state
}
else
{
//Draw other state
}
}
这显然只是一个例子,但大致表明你将如何做到这一点。注意我添加了tabstates
作为数组或列表,以允许您为每个选项卡设置状态。
答案 1 :(得分:1)
查看ButtonRenderer
课程。它可以用来绘制标准的按钮。
答案 2 :(得分:1)
你可以使用图像而不是绘制整个关闭按钮,它会更容易使用,例如,想象你有3个状态的按钮(MouseUp,MouseDown,Pressed),必须声明为枚举,并在自定义控件的事件处理程序只需要将枚举更改为MouseDown,MouseUp或Pressed。
在OnPaint上绘制自定义控件时,请检查枚举并绘制图像。
希望它能奏效。
答案 3 :(得分:0)
感谢答案。这给了我一些好主意。
我想要一种“按钮”行为,具有悬停效果和显示效果。最后我决定悬停,并跳过插入显示。它的外观和感觉做了我想要的,特别是考虑到按钮只是关闭一个标签。
我是这样做的。
在自定义TabControl类中,嵌入3个图像:关闭,关闭灰色和关闭悬停。在构建时从资源流中读取这些图像。
在PaintImage()方法内,根据“按钮”的状态选择要使用的图像。
现在,要更改按钮的状态:覆盖OnMouseMove和OnMouseLeave。
在OnMouseMove中,测试MouseEventArgs.Location是否位于所选选项卡的X的“热点”上。如果是这样,请启用System.Timers.Timer,间隔为110毫秒。 (左右)当鼠标停止移动时计时器触发,并且它位于X上方。如果OnMouseMove检测到鼠标未在X上,则禁用计时器,如有必要,绘制X.
在该计时器的Elapsed事件中,将图像状态设置为“Hover”。绘制图像。在我的情况下,它从深灰色变为红色。
在OnMouseLeave方法中,将图像状态设置为“关闭”(正常)。绘制图像。这是为了处理鼠标悬停在图像上后快速退出控件的情况。在我的情况下,它从红色变为drak灰色。
如果图像因任何其他原因而被绘制,则会根据状态正确绘制。
要激活“按钮”,请覆盖OnMouseClick。
在该方法中,只需调用TabPages.Remove()。如果您想获得幻想,请触发BeforeTabClose事件以通知应用程序,并允许它禁止或取消该操作。