Я создаю текстовое поле с автоматической прокруткой, выполнив этот ответ .
В этом текстовом поле есть исходный текст, поэтому полоса прокрутки будет отображаться в начале.
Проблема в том, что когда я перетаскиваю границу формы, чтобы увеличить текстовое поле, сразу после исчезновения полосы прокрутки я получаю исключение "Ошибка создания дескриптора окна".
Как это исправить?
Вот код:
public class AutoScrollTextBox : TextBox
{
private bool mScrollbars;
public AutoScrollTextBox()
{
Multiline = true;
Dock = DockStyle.Fill;
Font = new System.Drawing.Font("Courier New", 9);
}
private void checkForScrollbars()
{
if (!IsHandleCreated)
return;
bool scroll = false;
int cnt = this.Lines.Length;
if (cnt > 1)
{
int ch0 = this.GetFirstCharIndexFromLine(0);
int pos0 = this.GetPositionFromCharIndex(ch0).Y;
if (pos0 >= 32768) pos0 -= 65536;
int ch1 = this.GetFirstCharIndexFromLine(1);
int pos1 = this.GetPositionFromCharIndex(ch1).Y;
if (pos1 >= 32768) pos1 -= 65536;
int h = pos1 - pos0;
scroll = cnt * h > (this.ClientSize.Height - 6); // 6 = padding
Debug.WriteLine($"scroll:{scroll},cnt:{cnt},h:{h},CH:{ClientSize.Height},ch0:{ch0},y0:{pos0},ch1:{ch1},y1:{pos1}");
}
if (scroll != mScrollbars)
{
mScrollbars = scroll;
this.ScrollBars = scroll ? ScrollBars.Vertical : ScrollBars.None;
}
}
protected override void OnClientSizeChanged(EventArgs e)
{
checkForScrollbars();
base.OnClientSizeChanged(e);
}
}
Лог, который я получил из окна вывода:
......
scroll:True,cnt:21,h:15,CH:314,ch0:0,y0:1,ch1:35,y1:16
scroll:True,cnt:21,h:15,CH:315,ch0:0,y0:1,ch1:35,y1:16
scroll:True,cnt:21,h:15,CH:317,ch0:0,y0:1,ch1:35,y1:16
scroll:True,cnt:21,h:15,CH:318,ch0:0,y0:1,ch1:35,y1:16
scroll:True,cnt:21,h:15,CH:320,ch0:0,y0:1,ch1:35,y1:16
scroll:False,cnt:21,h:15,CH:321,ch0:0,y0:1,ch1:35,y1:16
scroll:True,cnt:21,h:16,CH:321,ch0:0,y0:1,ch1:35,y1:17
Exception thrown: 'System.ComponentModel.Win32Exception' in System.Windows.Forms.dll
System.ComponentModel.Win32Exception (0x80004005): Error creating window handle.
at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
at System.Windows.Forms.Control.CreateHandle()
at System.Windows.Forms.TextBoxBase.CreateHandle()
at System.Windows.Forms.Control.RecreateHandleCore()
at System.Windows.Forms.TextBox.set_ScrollBars(ScrollBars value)
at MessageTester.AutoScrollTextBox.checkForScrollbars()
at MessageTester.AutoScrollTextBox.OnClientSizeChanged(EventArgs e)
......