Отсечение каретки в программе на C#


Я создаю элемент управления WinForms в C# (используя VS2008, .net 3.5), который позволяет вводить текст. Я импортировал необходимые функции Win32 API из User32.dll для отображения нормального каре Windows, и они все работают нормально,но это не отображает точно, как я хотел бы.

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

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

Заранее спасибо за любую помощь!

2 2

2 ответа:

Итак, правильно ли я понял, что ваша проблема заключается в том, что каретка по умолчанию "кровоточит" в области вашего поля?

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

1-Используйте CreateCaret для создания меньшего курсора, который помещается в вырезанную область. Конечно, вам все равно нужно будет убедиться, что вы не устанавливаете каретку на границе пространство.

[DllImport("user32", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private extern static bool CreateCaret(IntPtr hWnd, IntPtr hBitmap, int nWidth, int nHeight);

// Create a caret which is 2 pixels wide by 8 high
CreateCaret(theControl.Handle, IntPtr.Zero, 2, 8);

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

Но в конце дня я думаю, что вы можете использовать суб-контроль обеспечит максимальный контроль.

Как насчет определения области, которую вы в настоящее время клип с SetClip() в качестве окон правда клиентской области? (путем переопределения WM_NCCALCSIZE).