Я пытаюсь понять, как именно gdi + графические контейнеры работают с разными графическими узлами. Взгляните на приведенный ниже код. Он компилируется, вы можете вставить его в новую новую форму.
void Form2_Paint(object sender, PaintEventArgs e)
{
var gfx = e.Graphics;
System.Diagnostics.Debug.WriteLine("DpiX={0}, DpiY={1}", gfx.DpiX, gfx.DpiY);
gfx.PageUnit = GraphicsUnit.Inch;
var pen = new Pen(Color.Black, 0.01f);
// Create outer container, 2 inches in size with X and Y set to 0.1 inches
var outerContainer = gfx.BeginContainer(
new RectangleF(0.1f, 0.1f, 2, 2),
new RectangleF(0, 0, 2, 2),
GraphicsUnit.Pixel);
// Draw the outer rectangle
gfx.DrawRectangle(pen, new Rectangle(0, 0, 2, 2));
// Create inner container, 1 inch in size with X and Y set to 0.1 inches
var innerContainer = gfx.BeginContainer(
new RectangleF(0.1f, 0.1f, 1, 1),
new RectangleF(0, 0, 1, 1),
GraphicsUnit.Pixel);
// Draw the inner rectangle
gfx.DrawRectangle(pen, new Rectangle(0, 0, 1, 1));
gfx.EndContainer(innerContainer);
gfx.EndContainer(outerContainer);
}
Выше код - довольно простой пример вложенных графических контейнеров, я не использовал преобразование масштабирования. Так выглядит форма при использовании выше обработчика краски:
Это довольно просто. Теперь я попытаюсь описать, в чем проблема.
Это сигнатура метода BeginContainer
:
public GraphicsContainer BeginContainer(
RectangleF dstrect,
RectangleF srcrect,
GraphicsUnit unit
)
То, что я не понимаю, - это аргумент GraphicsUnit unit
.
Из MSDN:
Член перечисления GraphicsUnit, который определяет единицу измерения для контейнера.
Это не соответствует действительности!
Как вы можете видеть в моем коде, я использую Inch-единицы как таковые: gfx.PageUnit = GraphicsUnit.Inch
.
Но когда я создаю контейнеры, это то, что я передаю как аргумент единиц в метод BeginContainer
: GraphicsUnit.Pixel
. Что происходит после создания контейнера? Используются дюймы (что я действительно хочу). Но если я передаю аргумент GraphicsUnit.Inch
(или миллиметры или что-то еще), пиксели используются. Итак, кажется, что для достижения того, что я хочу (использовать дюймы), я должен указать пиксели?
Это не имеет никакого смысла для меня. Вы можете попробовать сменить единицы в методах BeginContainer
в приведенном выше коде и наблюдать странные результаты. Я прочитал MSDN и все, что мог собрать, но я до сих пор не знаю.
Я пишу программное обеспечение, которое рисует много материала, используя gdi +, и использует миллиметровые единицы для печати. Когда я начал использовать контейнеры, я был очень удивлен, что мне, видимо, нужно указывать пиксели в единицах. Я действительно подозрительно отношусь к любому типу печати, где упоминаются пиксели. Должно быть, у меня есть большое недоразумение в этом вопросе.
Итак, все рассмотренное выше, мой вопрос: какова цель аргумента unit
в этом методе?