.net WinForms:如何在图像上模拟按钮行为?

.net WinForms:如何在图像上模拟按钮行为?,.net,winforms,tabcontrol,.net,Winforms,Tabcontrol,我有一个winforms TabControl的扩展,它在每个选项卡上画一个X,允许用户关闭选项卡 将其与标准进行比较: 如何在该图像上模拟按钮的外观和感觉?我的意思是,当用户点击下来,它应该在视觉上表明这一点。按钮通过插入图像来完成此操作。为了获得额外的积分,我还想做悬停部分——当鼠标悬停时,图像将“点亮” 但是X不是按钮,也不是PictureBox控件。这根本不是控制。刚刚画在那里 有没有办法在MouseDown和MouseUp上画一个镶嵌边框?为“插入”阶段生成另一个图像会更好吗?

我有一个winforms TabControl的扩展,它在每个选项卡上画一个X,允许用户关闭选项卡

将其与标准进行比较:

如何在该图像上模拟按钮的外观和感觉?我的意思是,当用户点击下来,它应该在视觉上表明这一点。按钮通过插入图像来完成此操作。为了获得额外的积分,我还想做悬停部分——当鼠标悬停时,图像将“点亮”

但是X不是按钮,也不是PictureBox控件。这根本不是控制。刚刚画在那里

有没有办法在MouseDown和MouseUp上画一个镶嵌边框?为“插入”阶段生成另一个图像会更好吗?(另一个用于悬停)

以前有人这样做过吗


相关:
但这个问题是不同的,因为他实际上有一个PictureBox控件。我不知道


如果刚刚在此处绘制,则需要执行以下操作:

  • 为父控件设置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
作为一个数组或列表,允许您拥有每个选项卡的状态。

如果您刚刚在那里绘制了状态,则需要执行以下操作:

  • 为父控件设置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
作为一个数组或列表,允许您为每个选项卡设置一个状态。

查看
按钮说明类。它可以用来绘制标准外观的按钮。

查看
按钮描述器
类。它可以用于绘制标准外观的按钮。

您可以使用图像而不是绘制整个关闭按钮,这将更易于使用,例如,假设按钮有3种状态(MouseUp、MouseDown、Pressed),必须声明为枚举,在自定义控件的事件处理程序中,只需将枚举更改为MouseDown、MouseUp或Pressed

在OnPaint上绘制自定义控件时,请检查枚举并绘制图像


希望它能起作用。

您可以使用图像,而不是绘制整个关闭按钮,这样会更易于使用,例如,假设按钮有3种状态(MouseUp、MouseDown、Pressed),必须声明为枚举,在自定义控件的事件处理程序中,只需将枚举更改为MouseDown,鼠标按下或按下

在OnPaint上绘制自定义控件时,请检查枚举并绘制图像


希望它能起作用。

感谢您的回答。这给了我一些好主意

我想要一种“按钮”式的行为,带有悬停效果和显示。最后我选择了悬停,跳过了插入显示。它的外观和感觉符合我的要求,特别是考虑到按钮只是关闭了一个选项卡


我是这样做的

  • 在自定义TabControl类中,嵌入3个图像:Close、Close Grey和Close Hover。在构建时从资源流中读取这些图像。

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

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

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

    在该计时器上的已过事件中,将图像状态设置为“悬停”。画这个图像。在我的例子中,它从深灰色变成红色。

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

    如果图像因任何其他原因被绘制,它将根据状态正确绘制。
  • 要激活“按钮”,请单击。

    在该方法中,只需调用TabPages.Remove()。如果您想玩得更开心,可以触发BeforeTabClose事件来通知应用程序,并允许它抑制或取消操作。


  • 多亏了这些答案。这给了我一些好主意

    我想要一种“按钮”式的行为,带有悬停效果和显示。最后我选择了悬停,跳过了插入显示。它的外观和感觉符合我的要求,特别是考虑到按钮只是关闭了一个选项卡


    我是这样做的

  • 在自定义TabControl类中,嵌入3个图像:Close、Close Grey和Close Hover。在构建时从资源流中读取这些图像。

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

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

    在OnMouseMove中,测试MouseEventArgs.Location是否位于所选选项卡X的“热点”上。如果是,请启用System.Ti