Re[2]: Как правильно обращаться с перьями и рисовать в С# ?
От: Dmitry_Sharp2008  
Дата: 16.04.09 10:59
Оценка:
Здравствуйте, notacat, Вы писали:

N>А почему Inflate делаете в одном случае на половину толщины пера, в другом — на толщину пера?

N>Попробуйте оба раза сделать так:

N>
N>recf.Inflate(-gpen.Width, -gpen.Width);
N>


N>потом, вы из какой гипотезы исходите:

N>- границы прямоугольника рисуются снаружи указанного прямоугольника,
N>- внутри,
N>- половина границы снаружи, половина внутри?

N>Я склоняюсь ко второму варианту, хотя не проверяла.

N>Лучше всего нарисовать первый прямоугольник, потом уменьшить размер прямоугольника на толщину пера, потом уже внутри этого прямоугольника рисовать второй прямоугольник:

N>
N>// получаем ссылку на объект графики
N>Graphics g = e.Graphics;
N>// создаем перо для рамки графика
N>Pen gpen = new Pen(Color.Red, 5);
N>// рисуем рамку графика
N>g.DrawRectangle(gpen, recf.X, recf.Y, recf.Width, recf.Height);
N>// уменьшаем размер прямоугольной клиентской области на толщину пера рамки
N>recf.Inflate(-gpen.Width, -gpen.Width);

N>gpen.Width = 1;
N>gpen.Color = Color.Black;
N>g.DrawRectangle(gpen, recf.X, recf.Y, recf.Width, recf.Height); 
N>recf.Inflate(-gpen.Width , -gpen.Width );
N>// рисовать дальше внутри второго прямоугольника
N>


Вы правы насчет того, что упомянули о возможных "гипотезах", которые могут быть положенными в основу механизма отрисовки примитивов...
Я прямо так не сказал в своем посте, полагая, что это очевидно из его сути. Да, действительно меня интересовали варианты рисования,
которые учитывают различные возможности "выравнивания пера".
Известно, что стандарт в GDI+ это — примитив рисуется так, что 1/2 толщины пера рисуется снаружи, а другая внутри от заданного контура.
Однако проблема возникает именно при близких толщинах перьев к 0 и 1. Попробуйте приведенным Вами выше кодом нарисовать 2 вложенных друг друга прямоугольника толщинами 1, 0 и 2 пекселя так, чтобы они "вкладывались" друг в друга без зазора и не перекрывали себя. Пусть это будет контур клиентской области формы, для примера.
Если просто рисовать 1- прямоугольник делая инфлейт на всю толщину пера- тогда образуется зазор равный половине тощины пера... Поэтому инфлейт делается на 1/2 толщины пера.
Надеяться на корректность стандартного механизма заложенного в концепцию перьев в GDI+ — не приходится, даже сам автор его пишет, что он корректно не работает(на сайте Майкрософта об этом говорится..)
Графикой пользуюся все, а как обходят такие "подводные камни" что-то не особо пишут. Понимаю, что это для всех "очевидно", однако ответьте для "особо обделенных" этой очевидностью(вроде меня).
Спасибо всем за Ваши ответы. К сожалению они пока не дают ответы на мои вопросы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.