Winforms 如何选择picturebox?
我正在制作一个非常基本的地图编辑器。我已经完成了一半,我遇到的一个问题是如何删除一个对象 我想按delete键,但pictureboxes似乎没有按键事件,似乎我只在我的列表框中显示Winforms 如何选择picturebox?,winforms,user-interface,Winforms,User Interface,我正在制作一个非常基本的地图编辑器。我已经完成了一半,我遇到的一个问题是如何删除一个对象 我想按delete键,但pictureboxes似乎没有按键事件,似乎我只在我的列表框中显示 在我的编辑器中删除对象的最佳解决方案是什么?我认为这是最好的方法: 您将希望PictureBox参与制表顺序并显示它具有焦点。那需要一点小手术。向项目中添加一个新类并粘贴如下所示的代码。编译。将新控件从工具箱顶部拖到窗体上。实现KeyDown事件 using System; using System.Drawing
在我的编辑器中删除对象的最佳解决方案是什么?我认为这是最好的方法:
您将希望PictureBox参与制表顺序并显示它具有焦点。那需要一点小手术。向项目中添加一个新类并粘贴如下所示的代码。编译。将新控件从工具箱顶部拖到窗体上。实现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);
}
}
}
。。。8年后
Hans Passant代码的另一种替代方法是将TabStop
设置为true
,并直接在PictureBox
上调用SetStyle()
,最好是在调用InitializeComponent()
后,在PictureBox
上创建一个新类
TabStop
是公共的,因此很容易设置,但是SetStyle()
是受保护的,所以反射就起了作用
myPictureBox.TabStop = true;
typeof(PictureBox)
.GetMethod("SetStyle", BindingFlags.Instance | BindingFlags.NonPublic)
.Invoke(myPictureBox, new object[] { ControlStyles.Selectable, true });
当然,这与点击图片盒时获得焦点没有任何区别,因此您必须在各种事件中按照您认为合适的方式进行聚焦。在巫婆语言中,您想这样做吗?@WARE:我想您可以假设C#或VB.NET。前者似乎更为常见。翻译代码本身应该是最小的问题,尽管.C#和我可以很好地阅读vb。也许我会考虑把对象拖动到一个删除的解决方案。糟糕的是,我没有马上想到。我明白你的意思了。你可以在PictureBox的Click事件处理程序中的委托方法中使用相同的效果。@Hans Passant-它真的参与了windows窗体上的制表顺序吗?因为,当从上一个控件按TAB或从下一个控件按CTRL+TAB时,它不会接收焦点。你是怎么想的?是的,这就是这条代码的要点。我只是又检查了一遍,就像一个母亲。别忘了用这个新控件替换图片框。@Hans Passant-告诉我我遗漏了什么。我创建了SelectablePictureBox,使其成为类库的一部分,将类库引用到我的测试床上;我添加了一个表单,其中只包含一个按钮和SelectablePictureBox。我们的控件只有在鼠标单击时才接收焦点。当焦点在控件上并按下TAB时,焦点会在按钮上设置,但在按下后续TAB时,焦点永远不会回到我们的控件。@Hans Passant-我的错误!忘记删除SelectablePictureBox类中容器的默认重载构造函数。很抱歉让您无缘无故地再次通读您的代码。@Hans Passant-但是,我只想确保SelectablePictureBox在默认情况下不会为我们提供KeyDown事件。因此,我们必须在承载SelectablePictureBox控件的表单中编写事件处理程序方法,并将其添加到表单构造函数中控件的KeyDown事件或显式加载事件中。如果我错了,请告诉我。你的帖子帮了大忙。许多人渴望PictureBox的可选行为。我一定会把这个链接交给他们。