logo
CSharp_Graphics

Различные уровни вложенных контейнеров

Нет ограничения на использование в объекте Graphics только одного контейнера. Можно создать последовательность контейнеров, вложенных друг в друга, и указать объемное преобразование, область обрезки и параметры качества для каждого из этих вложенных контейнеров. Если вызывается какой-либо метод рисования из контейнера наибольшего уровня вложенности, преобразования применяются по порядку, начиная с этого контейнера и оканчивая контейнером наименьшего уровня вложенности. Объекты, отображаемые из контейнера наибольшей степени вложенности, обрезаются по области, являющейся пересечением всех областей обрезки.

В следующем примере создается объект Graphics, для которого устанавливается режим сглаживания текста AntiAlias. В коде создаются два контейнера, один из них вложен в другой. Для режим сглаживания внешнего контейнера устанавливается значение SingleBitPerPixel, а для режима сглаживания внутреннего контейнера — AntiAlias. Код выводит на экран три строки: одну из внутреннего контейнера, одну из внешнего контейнера и одну из самого объекта Graphics.

Graphics graphics = e.Graphics;

GraphicsContainer innerContainer;

GraphicsContainer outerContainer;

SolidBrush brush = new SolidBrush(Color.Blue);

FontFamily fontFamily = new FontFamily("Times New Roman");

Font font = new Font(fontFamily, 36, FontStyle.Regular, GraphicsUnit.Pixel);

graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;

outerContainer = graphics.BeginContainer();

graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel;

innerContainer = graphics.BeginContainer();

graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;

graphics.DrawString(

"Inner Container",

font,

brush,

new PointF(20, 10));

graphics.EndContainer(innerContainer);

graphics.DrawString(

"Outer Container",

font,

brush,

new PointF(20, 50));

graphics.EndContainer(outerContainer);

graphics.DrawString(

"Graphics Object",

font,

brush,

new PointF(20, 90));

The following illustration shows the three strings. The strings drawn from the inner container and from the Graphics object are smoothed by antialiasing. The string drawn from the outer container is not smoothed by antialiasing because the TextRenderingHint property is set to SingleBitPerPixel.

--------------

Три нарисованные строки показаны на следующем рисунке. Строки, выводимые из внутреннего контейнера и из объекта Graphics, размываются с помощью сглаживания. Строка, выводимая из внешнего контейнера, не подвергается сглаживанию, потому что свойство TextRenderingHint в этом случае имеет значение SingleBitPerPixel.

Using Regions

The GDI+ Region class allows you to define a custom shape. The shape can be made up of lines, polygons, and curves.

Two common uses for regions are hit testing and clipping. Hit testing is determining whether the mouse was clicked in a certain region of the screen. Clipping is restricting drawing to a certain region.

How to: Use Hit Testing with a Region

The purpose of hit testing is to determine whether the cursor is over a given object, such as an icon or a button.

Example

The following example creates a plus-shaped region by forming the union of two rectangular regions. Assume that the variable point holds the location of the most recent click. The code checks to see whether point is in the plus-shaped region. If the point is in the region (a hit), the region is filled with an opaque red brush. Otherwise, the region is filled with a semitransparent red brush.

Point point = new Point(60, 10);

// Assume that the variable "point" contains the location of the

// most recent mouse click.

// To simulate a hit, assign (60, 10) to point.

// To simulate a miss, assign (0, 0) to point.

SolidBrush solidBrush = new SolidBrush(Color.Black);

Region region1 = new Region(new Rectangle(50, 0, 50, 150));

Region region2 = new Region(new Rectangle(0, 50, 150, 50));

// Create a plus-shaped region by forming the union of region1 and

// region2.

// The union replaces region1.

region1.Union(region2);

if (region1.IsVisible(point, e.Graphics))

{

// The point is in the region. Use an opaque brush.

solidBrush.Color = Color.FromArgb(255, 255, 0, 0);

}

else

{

// The point is not in the region. Use a semitransparent brush.

solidBrush.Color = Color.FromArgb(64, 255, 0, 0);

}

e.Graphics.FillRegion(solidBrush, region1);

Compiling the Code

The preceding example is designed for use with Windows Forms, and it requires PaintEventArgs e, which is a parameter of PaintEventHandler.