Появление TextBox при щелчке мышью над PictureBox для добавления пользовательского примечания к изображению - PullRequest
0 голосов
/ 05 апреля 2011

В моем приложении C # winforms у меня есть картинка, в которую можно загрузить несколько растровых изображений.То, что я хочу сделать, - это если пользователь щелкает где-то в картинке, в месте мыши появится небольшое текстовое поле, и пользователь сможет добавить собственный текст (примечание) к картинке.

Я знаю, как написать строкув растровый файл, но я не смог найти способ POP UP текстового поля в месте мыши и автоматически добавить текст к изображению, когда пользователь что-то написал и нажал клавишу ввода.Как это текстовое поле и его свойства должны быть определены?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 05 апреля 2011

Вы можете встроить элемент управления в пользовательскую всплывающую форму, как показано ниже.

Последний аргумент в конструкторе PopupForm указывает действие, которое необходимо выполнить, когда пользователь нажимает Enter .В этом примере указан анонимный метод, устанавливающий заголовок формы.

Использование

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
  // in this case we create a TextBox, but the
  // PopupForm can hold any type of control.
  TextBox textBox = new TextBox();
  Point location = pictureBox1.PointToScreen(e.Location);
  PopupForm form = new PopupForm(textBox, location,
    () => this.Text = textBox.Text);
  form.Show();
}

PopupForm Class

public class PopupForm : Form
{
  private Action _onAccept;
  private Control _control;
  private Point _point;

  public PopupForm(Control control, int x, int y, Action onAccept)
    : this(control, new Point(x, y), onAccept)
  {
  }

  public PopupForm(Control control, Point point, Action onAccept)
  {
    if (control == null) throw new ArgumentNullException("control");

    this.FormBorderStyle = FormBorderStyle.None;
    this.ShowInTaskbar = false;
    this.KeyPreview = true;
    _point = point;
    _control = control;
    _onAccept = onAccept;
  }

  protected override void OnLoad(EventArgs e)
  {
    base.OnLoad(e);
    this.Controls.Add(_control);
    _control.Location = new Point(0, 0);
    this.Size = _control.Size;
    this.Location = _point;
  }

  protected override void OnKeyDown(KeyEventArgs e)
  {
    base.OnKeyDown(e);
    if (e.KeyCode == Keys.Enter)
    {
      _onAccept();
      this.Close();
    }
    else if (e.KeyCode == Keys.Escape)
    {
      this.Close();
    }
  }

  protected override void OnDeactivate(EventArgs e)
  {
    base.OnDeactivate(e);
    this.Close();
  }
}
0 голосов
/ 05 апреля 2011

Полагаю, вы можете динамически создавать Textbox по щелчку мыши и использовать его метод BringToFront (), если он не появится над рамкой с изображением. Когда пользователь нажимает Enter, обработайте это событие, получите текст из текстового поля и при необходимости удалите.

...