Итак, правильно ли я понял, что ваша проблема в том, что каретка по умолчанию «кровоточит» в вашей области поля?
Я думаю, что ваш лучший вариант - разместить текст на дополнительном или подчиненном элементе управления, как вы упомянули. Два других варианта, которые вы могли бы рассмотреть, которые могут соответствовать вашим требованиям
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, чтобы обрезать все окно до нужной вам области отсечения. Конечно, это также обрезает вашу границу, что может или не может быть проблемой для вас. Просто зависит, если фон имеет такой характер, что он не нарушает границы, в основном граница будет прозрачной.
Но, в конце концов, я думаю, что использование субконтроля даст вам больше всего контроля.