мне нужно рисовать прямоугольники в Winform что-то вроде этого изображения:Как нарисовать прямоугольники последовательно в СТГ, как петли в Winform
Я также должен быть более ясным. Я хочу достичь этого сценария: предположим, что есть текст в форме «ABCDEFG». Когда пользователь нажимает букву B, я хочу добавить фона прямоугольника с цветом (выделить) на эту букву и последовательные 3 буквы (в этом случае, Я хочу выделить BCD).
В методе я попытался это:
for (int i = 0; i < 5; i++)
{
letterArea = new Rectangle(rectStartX, rectStartY, (int)Math.Ceiling(charSize.Width), (int)Math.Ceiling(charSize.Height));
rectStartX += (int)Math.Ceiling(charSize.Width);
}
Слово Invalidate() в конце этого метода. В OnPaintBackGround у меня есть следующие строки:
Rectangle rectContent = vsr.GetBackgroundContentRectangle(e.Graphics, this.ClientRectangle);
e.Graphics.FillRectangle(new SolidBrush(Color.Red), letterArea);
где letterArea - поле класса. Я прочитал в другом вопросе, что вызов Invalidate() в цикле не гарантирует вызов OnPaintBackground. Мне не интересно вычислять координаты, вместо этого меня интересует, какой метод я должен нарисовать прямоугольники и где вызвать Invalidate() и что является эффективным решением? Спасибо, заранее.
* Invalidate * отправляет красное сообщение в окно. Краска посылает соответственно * erasebackground *. Отправка одного или 1000 недействительных в цикле ничего не меняет. В конце будет отправлено только одно сообщение с краской. Общепринятой практикой является рисование * paint * –
_calling Invalidate() в цикле не гарантирует вызов OnPaintBackground._ Да, это так. Может быть, не сразу и не чаще, чем необходимо, но вы можете смело полагаться на контроль, который будет дергаться. – TaW
В вашем методе вы создаете несколько Rectangles, но вы ничего не делаете с ними? Если вы добавите их в список классов, ваше событие рисования может использовать его для заполнения каждого из них. –
TaW