logo search
CSharp_Graphics

Обрезка во вложенных контейнерах

В приведенном ниже примере демонстрируется, каким образом вложенные контейнеры работают с областями обрезки. В приведенном примере создаются объект Graphics и контейнер внутри этого объекта Graphics. Областью обрезки объекта Graphics является прямоугольник, а областью обрезки контейнера — эллипс. В коде осуществляются два вызова метода DrawLine. Первый вызов DrawLine осуществляется внутри контейнера, а второй вызов DrawLine — вне контейнера (после вызова метода EndContainer). Первая линия обрезается по области, являющейся пересечением двух указанных областей отсечения. Вторая линия обрезается по прямоугольнику, являющемуся областью обрезки объекта Graphics.

------

Две обрезанные линии показаны на следующем рисунке.

As the two preceding examples show, transformations and clipping regions are cumulative in nested containers. If you set the world transformations of the container and the Graphics object, both transformations will apply to items drawn from inside the container. The transformation of the container will be applied first, and the transformation of the Graphics object will be applied second. If you set the clipping regions of the container and the Graphics object, items drawn from inside the container will be clipped by the intersection of the two clipping regions.

Quality Settings in Nested Containers

Quality settings (SmoothingMode, TextRenderingHint, and the like) in nested containers are not cumulative; rather, the quality settings of the container temporarily replace the quality settings of a Graphics object. When you create a new container, the quality settings for that container are set to default values. For example, suppose you have a Graphics object with a smoothing mode of AntiAlias. When you create a container, the smoothing mode inside the container is the default smoothing mode. You are free to set the smoothing mode of the container, and any items drawn from inside the container will be drawn according to the mode you set. Items drawn after the call to EndContainer will be drawn according to the smoothing mode (AntiAlias) that was in place before the call to BeginContainer.

Several Layers of Nested Containers

You are not limited to one container in a Graphics object. You can create a sequence of containers, each nested in the preceding, and you can specify the world transformation, clipping region, and quality settings of each of those nested containers. If you call a drawing method from inside the innermost container, the transformations will be applied in order, starting with the innermost container and ending with the outermost container. Items drawn from inside the innermost container will be clipped by the intersection of all the clipping regions.

The following example creates a Graphics object and sets its text rendering hint to AntiAlias. The code creates two containers, one nested within the other. The text rendering hint of the outer container is set to SingleBitPerPixel, and the text rendering hint of the inner container is set to AntiAlias. The code draws three strings: one from the inner container, one from the outer container, and one from the Graphics object itself.

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