我正在制作一个非常基本的地图编辑器。我已经完成了一半,我遇到的一个问题是如何删除一个对象。
我想按删除,但似乎没有关于图片盒的keydown事件,看起来我只会在我的列表框上。
在我的编辑器中删除对象的最佳解决方案是什么?
答案 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)
我认为这是最好的方法:
答案 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
时获得焦点那样,因此,您必须在自己认为合适的各种事件中进行操作。