代码之家  ›  专栏  ›  技术社区  ›  Cheeso

winforms:如何在图像上模拟按钮行为?

  •  1
  • Cheeso  · 技术社区  · 15 年前

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

    alt text http://i41.tinypic.com/bhelqp.jpg

    与标准相比:

    alt text http://i42.tinypic.com/2zqa2c3.jpg

    如何在该图像上模拟按钮的外观和感觉?我的意思是,当用户点击的时候,它应该在视觉上表明这一点。按钮对插入图像执行此操作。为了获得额外的积分,我想做的悬停部分,也-那里的图像将“点亮”当鼠标悬停。

    但X不是一个按钮,也不是PictureBox控件。它根本不是一个控件。刚刚画在那里。

    有没有办法在慕斯敦画一个嵌入的边界,在慕斯堡画一个凸起的边界?对于“插入”阶段,我最好生成另一个图像吗?(另一个用于悬停)。

    以前有人做过吗?


    相关: Simulate Winforms Button Click Animation
    但这个问题不同,因为他实际上有一个picturebox控件。我不。

    4 回复  |  直到 15 年前
        1
  •  5
  •   Chris    15 年前

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

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

        2
  •  1
  •   Eric    15 年前

    查看 ButtonRenderer 班级。它可以用来绘制标准外观的按钮。

        3
  •  1
  •   Peymankh    15 年前

    您可以使用图像而不是绘制整个“关闭”按钮,这将更容易使用,例如,假设您有3个必须声明为枚举的按钮状态(mouseup、mousedown、pressed),并且在自定义控件的事件处理程序只需将枚举更改为moused自己的,鼠标或按。

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

    希望能成功。

        4
  •  0
  •   Cheeso    15 年前

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

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


    我就是这样做的。

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

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

    2. 现在,更改按钮的状态:覆盖onmousemove和onmouseleve。

      在onmousemove中,测试mouseeventargs.location是否位于所选选项卡的x的“热点”上。如果是,请启用System.Timers.Timer,间隔为110毫秒(或更长时间),当鼠标停止移动时,计时器将触发,并将其定位在X上。如果OnMouseMove检测到鼠标不在X上,请禁用计时器,如有必要,请绘制X。

      在计时器上的已用事件中,将图像状态设置为“悬停”。绘制图像。在我的情况下,它从深灰色变成红色。

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

      如果图像由于其他原因被绘制,它将根据状态被正确地绘制。

    3. 要激活“按钮”,请重写onmouseclick。

      在该方法中,只需调用tabpages.remove()。如果您想了解,请启动beforetabclose事件来通知应用程序,并允许它取消或取消该操作。