Работаю на WinForms приложением, в котором нужно реализовать проверку правописания.
Для перерисовки формы использую перехват Windows message.
/// <summary>
/// Processes Windows messages.
/// </summary>
/// <param name="msg">
/// A Windows Message object.
/// </param>
protected override void WndProc(ref Message msg)
{
switch (msg.Msg)
{
case WM_PAINT:
Invalidate();
base.WndProc(ref msg);
if (IsSpellingAutoEnabled)
{
CustomPaint();
}
break;
...
default:
base.WndProc(ref msg);
break;
}
}
Метод CustomPaint() выглядит так:
private void CustomPaint()
{
Bitmap tempBitmap;
Graphics bufferGraphics;
tempBitmap = new Bitmap(Width, Height);
bufferGraphics = Graphics.FromImage(tempBitmap);
bufferGraphics.Clip = new Region(ClientRectangle);
_textBoxGraphics = CreateGraphics();
bufferGraphics.Clear(Color.Transparent);
foreach (var wordStartIndex in UnderlinedSections.Keys)
{
UnderlineWords(wordStartIndex, bufferGraphics);
}
_textBoxGraphics.DrawImageUnscaled(tempBitmap, 0, 0);
}
В UnderlineWords в буфер добавляются линии, которые нужно нарисовать с пом. такого метода:
private void DrawWave(Graphics bufferGraphics, Point startOfLine, Point endOfLine)
{
startOfLine.Y--;
endOfLine.Y--;
// kvv: Определяем цвет линий подчеркивания.
var pen = Pens.Red;
if ((endOfLine.X - startOfLine.X) >= 4)
{
var points = new ArrayList();
for (int i = startOfLine.X; i <= (endOfLine.X - 2); i += 4)
{
points.Add(new Point(i, startOfLine.Y));
points.Add(new Point(i + 2, startOfLine.Y + 2));
}
var p = (Point[])points.ToArray(typeof(Point));
bufferGraphics.DrawLines(pen, p);
}
}
При работе этого кода на тексте размером больше 500 символов начинаются сильные тормоза и подвисания приложения. Как можно от этого избавиться? В какую сторону копать?