Нажмите и введите (WinForms) - PullRequest
2 голосов
/ 21 февраля 2010

Я использовал продукт Adobe (если я правильно помню, это был PDF Creator) на днях, и у них есть эта замечательная функция, где вы можете буквально щелкнуть в любом месте окна и просто начать печатать. И текст будет отображаться по мере ввода, куда бы вы ни нажали.

Может кто-нибудь указать мне правильное направление, где я могу научиться реализовывать что-то подобное?

Спасибо

Редактировать :


Шаги для нажатия и ввода:

  1. Захватите MouseDown и сохраните место, где пользователь нажал.
  2. Обработайте событие KeyDown, чтобы увидеть, какая клавиша была нажата.
  3. Нажата клавиша Foreach, создайте метку и поместите ее рядом с последним набранным символом.

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

Ответы [ 2 ]

1 голос
/ 21 февраля 2010

Вы можете просто нарисовать новый TextBox в вашей форме Windows, когда пользователь нажимает.Событие MouseClick предоставит все свойства, необходимые для рисования текстового поля, там, где они щелкают.

private void Form1_MouseClick(object sender, MouseEventArgs e)
{
    TextBox txtBox = new TextBox();
    txtBox.Location = new Point(e.X, e.Y);
    this.Controls.Add(txtBox);
    txtBox.Focus();
}

Вы можете сделать TextBox прозрачным или нет, если хотите скрыть тот факт, что они печатаютобычный текстовый ящик.

0 голосов
/ 21 февраля 2010

Допустим, вы хотели реализовать эту функцию в пользовательском контроле, который вы выполняли.Сначала вам нужно будет обработать событие нажатия мыши, чтобы зарегистрировать, где пользователь нажал, а после этого вы сможете обработать событие нажатия клавиши, чтобы зарегистрировать, какие клавиши нажимал пользователь.

Чтобы нарисовать фактический текств целевом месте у вас есть несколько вариантов.Вы можете использовать GDI + для рендеринга строк в элементе управления или вставлять метки, которые будут полезны вам из-за большого количества функциональных возможностей, которыми снабжены метки.

Вот пример прототипа того, как это можно реализовать с помощью GDI:

private Point? lastSelected;
private Dictionary<Point, string> renderedText = new Dictionary<Point, string>();

private Point LastSelected
{
    get
    {
        return (Point)lastSelected;
    }
}
private void Form1_Load(object sender, EventArgs e)
{
    this.MouseDown += Form1_MouseDown;
    this.KeyDown += Form1_KeyDown;
    this.Paint += Form1_Paint;
}

void Form1_Paint(object sender, PaintEventArgs e)
{
    foreach (KeyValuePair<Point, string> pair in renderedText)
{
        e.Graphics.DrawString(pair.Value, new Font("Arial", 12), Brushes.Black, 

pair.Key);
    }
   }

   void Form1_KeyDown(object sender, KeyEventArgs e)
   {
    if (lastSelected != null)
    {
        if (!renderedText.ContainsKey(LastSelected))
        {
            renderedText.Add(LastSelected, "");
        }
        renderedText[LastSelected] = renderedText[LastSelected] + e.KeyCode;
        this.Invalidate();
        }
    }

void Form1_MouseDown(object sender, MouseEventArgs e)
{
    lastSelected = e.Location;
}

Ответ на комментарий:

Приведенный выше код фиксирует расположение мыши, когда пользователь нажимает на форму, и сохраняет ее впеременная lastSelected.При каждом последующем нажатии клавиши в форме нажатая клавиша добавляется к строке, представляющей это местоположение.Кроме того, строки отображаются на экране в захваченном месте в краске.Строки визуализируются с использованием GDI +, что означает, что вам не нужно беспокоиться о длине отдельных символов.

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

...