【问题标题】:How do i make a picturebox selectable?如何使图片框可选择?
【发布时间】:2011-02-14 03:36:35
【问题描述】:

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

我想按删除,但似乎没有图片框的 keydown 事件,看起来我只会在我的列表框中拥有它。

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

【问题讨论】:

  • 用女巫的语言,你想做吗?
  • @were:我认为你可以假设 C# 或 VB.NET。前者似乎更常见。不过,翻译代码本身应该是最少的问题。
  • C# 我可以很好地阅读 vb。也许我会考虑将对象拖出屏幕作为删除解决方案。可惜我没有马上想到。

标签: winforms user-interface


【解决方案1】:

您会希望 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);
    }
  }
}

【讨论】:

  • @Hans Passant- 它真的参与 Windows 窗体上的跳格顺序吗?因为,当从上一个控件按下 TAB 或从下一个控件按下 CTRL+TAB 时,它不会获得焦点。你对它有什么看法?问候。
  • 是的,这就是这段代码的重点。我刚刚又检查了一遍,像妈妈一样的标签。不要忘记用这个新控件实际替换图片框。
  • @Hans Passant- 告诉我我错过了什么。我创建了 SelectablePictureBox,使其成为类库的一部分,将类库引用到我的 TestBed;我在其中添加了一个仅包含按钮和 SelectablePictureBox 的表单。我们的控件只有在鼠标点击时才会获得焦点。当焦点在控件上并按下 TAB 时,焦点设置在按钮上,但在按下后续 TAB 时永远不会回到我们的控件。
  • @Hans Passant- 我的错!忘记删除 SelectablePictureBox 类中容器的默认重载构造函数。很抱歉让您再次无缘无故地完成所有代码。
  • @Hans Passant- 但是,我只想确保 SelectablePictureBox 在默认情况下不会为我们提供 KeyDown 事件。因此,我们必须在承载 SelectablePictureBox 控件的表单中编写事件处理程序方法,并将其添加到表单构造函数中的控件的 KeyDown 事件或显式加载事件中。告诉我我是否错了。你的帖子很有帮助。很多人都渴望 PictureBox 的可选行为。我一定会把这个链接推荐给他们。
【解决方案2】:

我认为这是最好的方法:

http://felix.pastebin.com/Q0YbMt22

【讨论】:

  • 我知道你的目标是什么。
  • 您可以在 PictureBox 的 Click 事件处理程序中使用委托方法中的相同效果。
【解决方案3】:

... 8 年后...

Hans Passant 的代码的替代方法(不需要您创建新类以使您的 PictureBox 处于 Tab 键顺序)是将 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 时获得焦点那样做任何事情,因此您必须在您认为合适的各种事件中这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多