Аффинные преобразования 2 ???
От: Аноним  
Дата: 04.01.08 13:46
Оценка:
В общем ответа на предыдущий вопрос не дождался, поэтому попытаюсь объяснить что имел ввиду ещё раз.
Есть у меня такая практика, если встречается новый метод или группа методов, писать тестовую программку с интерфейсом в котором можно менять различные параметры вызова методов и смотреть что это даёт. Это просто удобно! Скажем подзабыл, что он делает и как, запускаешь такую программку, поюзаешь её и всё вспоминается.
Вот и в этот раз решил написать такую программу для группы методов 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() в конструкторе
Re: Аффинные преобразования 2 ???
От: vgol  
Дата: 04.01.08 14:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А> В общем ответа на предыдущий вопрос не дождался, поэтому попытаюсь объяснить что имел ввиду ещё раз.


ответом на предыдущий вопрос служит изменение последовательности действий:
вместо translate -> rotate
нужно rotate -> translate

А> В чём различие grfx получаемой из параметров события и созданной с помощью CreateGraphics() в конструкторе


в обработчике Paint grfx у тебя создается каждый раз новенький. К нему применяется только одно преобразование
и потом он умирает (локальная же переменная!). А как член класса он живет вместе с панелью и "помнит" все преобразования, которые к нему применялись.
Re[2]: Аффинные преобразования 2 ???
От: Аноним  
Дата: 04.01.08 14:13
Оценка:
Здравствуйте, vgol, Вы писали:

V>Здравствуйте, Аноним, Вы писали:


А>> В общем ответа на предыдущий вопрос не дождался, поэтому попытаюсь объяснить что имел ввиду ещё раз.


V>ответом на предыдущий вопрос служит изменение последовательности действий:

V>вместо translate -> rotate
V>нужно rotate -> translate

А>> В чём различие grfx получаемой из параметров события и созданной с помощью CreateGraphics() в конструкторе


V>в обработчике Paint grfx у тебя создается каждый раз новенький. К нему применяется только одно преобразование

V>и потом он умирает (локальная же переменная!). А как член класса он живет вместе с панелью и "помнит" все преобразования, которые к нему применялись.

OK
Re: Аффинные преобразования 2 ???
От: Аноним  
Дата: 07.01.08 00:57
Оценка:
На самом деле нужно просто задать вопрос — а когда вызывается методы Paint и OnPaint? А вызываются они при перерисовки формы. Поэтому-то и объект grfx постоянно обновляется. А если он создан полем класса и заунут в конструктор, то повторный вызов Paint ничего с ним не сделает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.