Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms 如何选择picturebox?_Winforms_User Interface - Fatal编程技术网

Winforms 如何选择picturebox?

Winforms 如何选择picturebox?,winforms,user-interface,Winforms,User Interface,我正在制作一个非常基本的地图编辑器。我已经完成了一半,我遇到的一个问题是如何删除一个对象 我想按delete键,但pictureboxes似乎没有按键事件,似乎我只在我的列表框中显示 在我的编辑器中删除对象的最佳解决方案是什么?我认为这是最好的方法: 您将希望PictureBox参与制表顺序并显示它具有焦点。那需要一点小手术。向项目中添加一个新类并粘贴如下所示的代码。编译。将新控件从工具箱顶部拖到窗体上。实现KeyDown事件 using System; using System.Drawing

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

我想按delete键,但pictureboxes似乎没有按键事件,似乎我只在我的列表框中显示


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

我认为这是最好的方法:


您将希望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的可选行为。我一定会把这个链接交给他们。