如何使图片框可选?

时间:2010-04-30 08:19:13

标签: winforms user-interface

我正在制作一个非常基本的地图编辑器。我已经完成了一半,我遇到的一个问题是如何删除一个对象。

我想按删除,但似乎没有关于图片盒的keydown事件,看起来我只会在我的列表框上。

在我的编辑器中删除对象的最佳解决方案是什么?

3 个答案:

答案 0 :(得分:18)

您希望PictureBox参与Tab键顺序并显示它具有焦点。这需要一些小手术。在项目中添加一个新类并粘贴下面显示的代码。编译。将新控件从工具箱顶部拖放到表单上。实现KeyDown事件。

using System;
using System.Drawing;
using System.Windows.Forms;

class SelectablePictureBox : PictureBox {
  public SelectablePictureBox() {
    this.SetStyle(ControlStyles.Selectable, true);
    this.TabStop = true;
  }
  protected override void OnMouseDown(MouseEventArgs e) {
    this.Focus();
    base.OnMouseDown(e);
  }
  protected override void OnEnter(EventArgs e) {
    this.Invalidate();
    base.OnEnter(e);
  }
  protected override void OnLeave(EventArgs e) {
    this.Invalidate();
    base.OnLeave(e);
  }
  protected override void OnPaint(PaintEventArgs pe) {
    base.OnPaint(pe);
    if (this.Focused) {
      var rc = this.ClientRectangle;
      rc.Inflate(-2, -2);
      ControlPaint.DrawFocusRectangle(pe.Graphics, rc);
    }
  }
}

答案 1 :(得分:1)

我认为这是最好的方法:

http://felix.pastebin.com/Q0YbMt22

答案 2 :(得分:0)

... 8年后...

Hans Passant代码的另一种选择是将PictureBox设置为TabStop,它不需要您创建新类,而只是使true处于制表符顺序,并最好在调用SetStyle()之后直接在PictureBox上调用InitializeComponent()

TabStop是公开的,因此易于设置,但是SetStyle()受保护,因此可以进行反思!

myPictureBox.TabStop = true;
typeof(PictureBox)
    .GetMethod("SetStyle", BindingFlags.Instance | BindingFlags.NonPublic)
    .Invoke(myPictureBox, new object[] { ControlStyles.Selectable, true });

这当然不像单击PictureBox时获得焦点那样,因此,您必须在自己认为合适的各种事件中进行操作。