WinForms:如何模拟图像上的按钮行为?

时间:2010-04-16 15:10:43

标签: .net winforms tabcontrol

我有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控件。我不。

4 个答案:

答案 0 :(得分:5)

如果您刚刚在那里画了它,那么您需要执行以下操作:

  • 为父控件设置onmouseover / onleftclick事件。这可能是表单本身或制表符控件。
  • 在该功能中,检查鼠标是否在绘制图像的位置。
  • 如果它在您绘制图像的位置结束,则显示“单击”或“悬停”状态。

我拼凑了一些关于它看起来如何的代码

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)

感谢答案。这给了我一些好主意。

我想要一种“按钮”行为,具有悬停效果和显示效果。最后我决定悬停,并跳过插入显示。它的外观和感觉做了我想要的,特别是考虑到按钮只是关闭一个标签。


我是这样做的。

  1. 在自定义TabControl类中,嵌入3个图像:关闭,关闭灰色和关闭悬停。在构建时从资源流中读取这些图像。

    在PaintImage()方法内,根据“按钮”的状态选择要使用的图像。

  2. 现在,要更改按钮的状态:覆盖OnMouseMove和OnMouseLeave。

    在OnMouseMove中,测试MouseEventArgs.Location是否位于所选选项卡的X的“热点”上。如果是这样,请启用System.Timers.Timer,间隔为110毫秒。 (左右)当鼠标停止移动时计时器触发,并且它位于X上方。如果OnMouseMove检测到鼠标未在X上,则禁用计时器,如有必要,绘制X.

    在该计时器的Elapsed事件中,将图像状态设置为“Hover”。绘制图像。在我的情况下,它从深灰色变为红色。

    在OnMouseLeave方法中,将图像状态设置为“关闭”(正常)。绘制图像。这是为了处理鼠标悬停在图像上后快速退出控件的情况。在我的情况下,它从红色变为drak灰色。

    如果图像因任何其他原因而被绘制,则会根据状态正确绘制。

  3. 要激活“按钮”,请覆盖OnMouseClick。

    在该方法中,只需调用TabPages.Remove()。如果您想获得幻想,请触发BeforeTabClos​​e事件以通知应用程序,并允许它禁止或取消该操作。