Как я могу сделать картинку для выбора? - PullRequest
10 голосов
/ 30 апреля 2010

Я делаю очень простой редактор карт. Я на полпути через это, и одна проблема, с которой я столкнулся, - как удалить объект.

Я хотел бы нажать "Удалить", но, как представляется, событие для нажатия клавиш отсутствует, и будет казаться, что оно будет отображаться только в моем списке.

Какое лучшее решение для удаления объекта в моем редакторе?

Ответы [ 3 ]

18 голосов
/ 30 апреля 2010

Вы хотите, чтобы 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);
    }
  }
}
1 голос
/ 30 апреля 2010

я думаю, что это лучший метод:

http://felix.pastebin.com/Q0YbMt22

0 голосов
/ 29 июля 2018

... 8 лет спустя ...

Альтернативой коду Ханса Пассанта, который не требует от вас создания нового класса просто для того, чтобы ваш 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, поэтому вы должны делать это в различных событиях по своему усмотрению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...