Button 控件,就像您说的那样,是一个好的开始。您需要一个按钮才能使图像具有焦点和可点击性。PictureBox 不支持其中任何一个。您显然可以编写代码来手动处理这些事情,但是没有任何意义,因为 Button 已经内置了它。所以现在战斗变成了自定义 Button 控件以执行您想要的操作。
从您的屏幕截图中也可以看出,您已经发现需要处理Enter
andLeave
事件才能将图像从“正常”状态更改为“热”状态,然后再返回。为了获得您想要的外观,您已将 Button 的FlatStyle
属性设置为FlatStyle.Flat
并将该FlatAppearance.BorderSize
属性设置为 0。
所以唯一的问题是,当 Button 控件获得焦点时,焦点提示会围绕它绘制。通常,您会希望这样做,因为使用键盘导航您的应用程序的人需要某种方法来确定当前哪个控件具有焦点。但是你通过改变它显示的图像给他们一个,所以你可以安全地禁用这些焦点提示。做到这一点的方法是从 Button 类继承并覆盖ShowFocusCues
属性。
将包含以下类声明的新代码文件添加到您的项目中:
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);
}