Обрезка каретки в программе на C # - PullRequest
2 голосов
/ 07 мая 2010

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

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

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

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

Ответы [ 2 ]

1 голос
/ 09 мая 2010

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

0 голосов
/ 07 мая 2010

Итак, правильно ли я понял, что ваша проблема в том, что каретка по умолчанию «кровоточит» в вашей области поля?

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

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 - Еще один вариант, который, вероятно, менее полезен, но при этом он будет ограничивать каретку, поэтому я упомяну его. Используйте Control.Region, чтобы обрезать все окно до нужной вам области отсечения. Конечно, это также обрезает вашу границу, что может или не может быть проблемой для вас. Просто зависит, если фон имеет такой характер, что он не нарушает границы, в основном граница будет прозрачной.

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

...