В общем ответа на предыдущий вопрос не дождался, поэтому попытаюсь объяснить что имел ввиду ещё раз.
Есть у меня такая практика, если встречается новый метод или группа методов, писать тестовую программку с интерфейсом в котором можно менять различные параметры вызова методов и смотреть что это даёт. Это просто удобно! Скажем подзабыл, что он делает и как, запускаешь такую программку, поюзаешь её и всё вспоминается.
Вот и в этот раз решил написать такую программу для группы методов TranslateTransform/RotateTransform/ScaleTransform/MultiplyTransform класса Graphics. Программка простая, форма с панелью и набор контролов для ввода параметров и выбора методов. На панели рисуется тестовый рисунок к которому выше перечисленные методы и применяются.
Текст программы занимает почти 500 строк, поэтому её я здесь приводить не буду. Попытаюсь объяснить всё на пальцах.
Методы применяются к рисунку в обработчике события Paint панели. И всё хорошо, только обнаружился один глюк. По идее по очереди применяя методы к рисунку(панели) вы должны наблюдать 'суммарный эффект' от всех применений. Но этого не наблюдалось! Каждый раз применяя очередной метод его предыдущее применение не учитывалось. Код обработчика выглядит так:
//Обработчик Paint
...
Graphics grfx = args.Graphics;
switch(comboOperation.SelectedIndex)
{
case 0:
grfx.TranslateTransform(X1, Y1, Order);
break;
case 1:
grfx.ScaleTransform(X1, Y1, Order);
//...и т.д.
}
grfx.FillRectangle(Brushes.Red, 159, 140, 120, 120);
...
Ну долго голову ломал, потом решил сделать grfx членом класса, создать его в конструкторе(так grfx = Panel.CreateGraphics()) и освободить в деструкторе. И всё заработало! Вот только почему я не понял
В связи с этим вопрос: В чём различие grfx получаемой из параметров события и созданной с помощью CreateGraphics() в конструкторе
Здравствуйте, Аноним, Вы писали:
А> В общем ответа на предыдущий вопрос не дождался, поэтому попытаюсь объяснить что имел ввиду ещё раз.
ответом на предыдущий вопрос служит изменение последовательности действий:
вместо translate -> rotate
нужно rotate -> translate
А> В чём различие grfx получаемой из параметров события и созданной с помощью CreateGraphics() в конструкторе
в обработчике Paint grfx у тебя создается каждый раз новенький. К нему применяется только одно преобразование
и потом он умирает (локальная же переменная!). А как член класса он живет вместе с панелью и "помнит" все преобразования, которые к нему применялись.
Здравствуйте, vgol, Вы писали:
V>Здравствуйте, Аноним, Вы писали:
А>> В общем ответа на предыдущий вопрос не дождался, поэтому попытаюсь объяснить что имел ввиду ещё раз.
V>ответом на предыдущий вопрос служит изменение последовательности действий:
V>вместо translate -> rotate
V>нужно rotate -> translate
А>> В чём различие grfx получаемой из параметров события и созданной с помощью CreateGraphics() в конструкторе
V>в обработчике Paint grfx у тебя создается каждый раз новенький. К нему применяется только одно преобразование
V>и потом он умирает (локальная же переменная!). А как член класса он живет вместе с панелью и "помнит" все преобразования, которые к нему применялись.
OK
На самом деле нужно просто задать вопрос — а когда вызывается методы Paint и OnPaint? А вызываются они при перерисовки формы. Поэтому-то и объект grfx постоянно обновляется. А если он создан полем класса и заунут в конструктор, то повторный вызов Paint ничего с ним не сделает.