如何在c#中仅突出显示没有整个区域的图像?

时间:2013-04-03 22:53:09

标签: c# image highlight

我希望制作高亮显示图像,就像在谷歌应用程序中一样(谷歌g +在html中)当鼠标在它上面时只突出显示图像(没有边界,整个区域)。

在c#中,我使用图像来做到这一点,但每当我用鼠标到图像时,它会突出显示所有区域(边界+图像)。

所以现在我的问题是:如何仅突出显示没有整个区域的图像?

图片显示C#APPS突出显示图像以及整个区域(灰色矩形)。  如何绕过这些灰色矩形?

enter image description here

更多细节:Framework 4.5或更高版本,WinForms,Win7 如果其他控件以更智能的方式执行操作,那么应用程序不一定使用图像控件...请告诉我...

1 个答案:

答案 0 :(得分:2)

按钮控件就像你说过的那样,是一个好的开始。您需要一个按钮才能使图像可聚焦和可点击。 PictureBox不支持这两种方法。显然你可以编写代码来手动处理这些事情,但是由于Button已经内置了它,所以没有任何意义。所以现在战斗就是自定义Button控件来做你想做的事。

从截图中看,您已经发现需要处理EnterLeave事件才能将图像从“正常”状态更改为“热“状态,然后再回来。为了获得您想要的外观,您已将Button的FlatStyle属性设置为FlatStyle.Flat,将FlatAppearance.BorderSize属性设置为0.

所以唯一的问题是当焦点提示有焦点时,焦点提示会在Button控件周围绘制。通常,你会想要这个,因为用键盘导航你的应用程序的人需要某种方法来确定哪个控件当前具有焦点。但是你通过改变它显示的图像来给它们一个,所以你可以安全地禁用这些焦点线索。这样做的方法是继承Button类并覆盖ShowFocusCues property

向项目中添加一个包含以下类声明的新代码文件:

public class ImageButton : Button
{
   public ImageButton()
   {
      // Set default properties.
      this.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
      this.FlatAppearance.BorderSize = 0;
   }

   protected override bool ShowFocusCues
   {
      get  { return false; }
   }
}

然后,使用ImageButton类作为按钮控件,而不是内置的Button类。此类型的控件将自动具有您想要的行为。

如果您需要更多地控制自定义按钮的外观,可以覆盖其OnPaint方法。如果您不想要任何默认行为,请跳过调用基类实现。例如,我们可以简单地删除按钮的背景并绘制其图像:

protected override void OnPaint(PaintEventArgs pevent)
{
   // do not call the base class implementation
   // base.OnPaint(e);

   // erase the background
   pevent.Graphics.FillRectangle(SystemBrushes.Control, this.ClientRectangle);

   // draw the image at the top-left
   pevent.Graphics.DrawImage(this.Image, Point.Empty);
}