Как включить курсор (каретку) в пользовательский элемент управления? - PullRequest
2 голосов
/ 12 февраля 2009

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

Кто-нибудь знает, как это сделать со стандартным текстовым полем? Есть ли стандартная конструкция фреймворка, которая сделает это для меня?

Очевидно, я могу установить таймер и нарисовать курсор сам, но мне было интересно, есть ли лучший вариант. Обратите внимание, что это полностью нарисованный пользователем элемент управления, а не производная UserControl, и что подклассы существующего класса по разным причинам недоступны.

Ответы [ 3 ]

10 голосов
/ 12 февраля 2009

Вот, пожалуйста:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

public class MyWidget : Control {
  public MyWidget() {
    this.BackColor = Color.Yellow;
  }
  protected override void OnGotFocus(EventArgs e) {
    CreateCaret(this.Handle, IntPtr.Zero, 2, this.Height - 2);
    SetCaretPos(2, 1);
    ShowCaret(this.Handle);
    base.OnGotFocus(e);
  }
  protected override void OnLostFocus(EventArgs e) {
    DestroyCaret();
    base.OnLostFocus(e);
  }
  [DllImport("user32.dll", SetLastError = true)]
  private static extern bool CreateCaret(IntPtr hWnd, IntPtr hBmp, int w, int h);
  [DllImport("user32.dll", SetLastError = true)]
  private static extern bool SetCaretPos(int x, int y);
  [DllImport("user32.dll", SetLastError = true)]
  private static extern bool ShowCaret(IntPtr hWnd);
  [DllImport("user32.dll", SetLastError = true)]
  private static extern bool DestroyCaret();
}

Я с удовольствием передам доллар, выяснив, где его поставить.

0 голосов
/ 12 февраля 2009

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

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

Если вы хотите пойти нелегким путем, у Microsoft есть несколько старых библиотек, которые могут предоставить виртуальную текстовую область (или что-то подобное, очень длинную).

0 голосов
/ 12 февраля 2009

Ссылка MSDN о Carets здесь . В последний раз, когда я смотрел (что было в 2.0 фреймворка), каретки не были доступны в качестве управляемого API: вам нужно использовать неуправляемый API или нарисовать свою карету.

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

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