Как включить курсор (каретку) в пользовательский элемент управления?

2

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

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

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

Теги:
winforms

3 ответа

10
Лучший ответ

Здесь вы идете:

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

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

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

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

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню