Create device context windows

Контекст устройства отображения

В многозадачной операционной системе семейства Windows отсутствует возможность прямого бесконтрольного вывода на экран (как это было во времена MSDOS), тут все подчинено некоему регламенту. С целью обеспечения возможности вывода на устройство (экран, принтер, память) одновременно от множества источников (приложений), в Windows был создан специализированный механизм под названием контекст устройства (device context, DC) и подмножество обеспечивающих его работу функций. Указанные функции определяют размер клиентской области, шрифт, цвета и другие GDI-атрибуты и возвращают (предоставляют) приложению так называемый дескриптор контекста устройства (Device Context Descriptor). Поскольку контекст устройства является одним из основополагающих понятий в понимании механизмов вывода информации на устройство, я постараюсь дать некоторое количество определений для погружения в тему:

  • Контекст устройства — логическое устройство вывода, посредством которого осуществляется вывод информации на устройство вывода (дисплей, принтер, память).
  • Контекст устройства — структура данных, описывающая устройство отображения информации.

В операционной системе Windows существует несколько типов контекстов устройства, а именно:

  • Контекст устройства отображения (display);
  • Контекст устройства печати (printer);
  • Контекст устройства памяти (memory, CompatibleDC);
  • Контекст информационного устройства (information);
  • если приложение создает/получает собственный контекст для отрисовки в собственном окне, такой контекст называется контекстом устройства отображения.
  • если приложению необходимо выполнить операцию ввода-вывода на аппаратное устройство (экран, принтер, память), такой контекст называется контекстом устройства печати, контекстом устройства памяти или контекстом информационного устройства.

Нас же в рамках данной статьи интересует контекст устройства отображения:

Существует несколько типов контекста отображения:

  • Контекст отображения класса окна (class display context);
  • Общий контекст отображения (common display context);
  • Личный контекст отображения (private display context);
  • Контекст отображения окна (window display context);
  • Родительский контекст отображения (parent display context);

Соответственно, методы получения (освобождения) контекста отображения различны для контекстов описанных типов.
В процессе изучения функционала GDI становится очевидным, что во многих функциях вывода графических примитивов в Windows одним из входных параметров является указатель на контекст устройства отображения.

Дескриптор (описатель) контекста отображения, возвращаемый функциями API, это своеобразный указатель, предоставляемый системой пользовательскому уровню приложения, посредством которого приложение получает доступ к устройству вывода (например, экран).

Каждое приложение в случае необходимости экранного вывода получает в свое распоряжение собственный контекст и осуществляет посредством него вывод изображения. Поэтому, более интуитивно дескриптор контекста устройства отображения воспринимается в качестве указателя на некую системную структуру в памяти ядра, через которую система выводит данные на физическое устройство отображения.

Структура контекста устройства

Надо учитывать, что контекст устройства является структурой, состоящей, в свою очередь, из описателей объектов графических примитивов (характеристик), используемых при работе с контекстом:

Атрибут контекста Значение по умолчанию Функция для изменения Функция для получения
Режим отображения (Mapping mode) MM_TEXT SetMapMode GetMapMode
Начало координат окна (Window origin) (0,0) SetWindowOrgEx GetWindowOrgEx
Начало координат области вывода (Viewport Origin) (0,0) SetViewportOrgEx GetViewportOrgEx
Протяженность окна (Window extent) (1,1) SetWindowExtEx GetWindowExtEx
Протяженность области вывода (Viewport extent) (1,1) SetViewportExtEx , SetMapMode GetViewportExtEx
Перо (Pen) BLACK_PEN SelectObject SelectObject
Кисть (Brush) WHITE_BRUSH SelectObject SelectObject
Шрифт (Font) SYSTEM_FONT SelectObject SelectObject
Битовый образ (Bitmap) NOT SelectObject SelectObject
Текущая позиция пера (Current pen position) (0,0) MoveToEx , LineTo , PolylineTo , PolyBezierTo GetCurrentPositionEx
Режим фона (Background mode) OPAQUE SetBkMode GetBkMode
Цвет фона (Background color) Обычно Белый (по Панели управления) SetBkColor GetBkColor
Цвет текста (TextColor) Обычно Черный (по Панели управления) SetTextColor GetTextColor
Режим рисования (Drawing mode) R2_COPYPEN SetROP2 GetROP2
Режим растяжения (Stretching mode) BLACKONWHITE SetStrethBltMode GetStrethBltMode
Режим закрашивания многоугольников (Polygon filling mode) ALTERNATE SetPolyFillMode GetPolyFillMode
Межсимвольный интервал (Intercharacter spacing) 0 SetTextCharacterExtra GetTextCharacterExtra
Начало координат кисти (Brush origin) (0,0) SetBrushOrgEx GetBrushOrgEx
Область отсечения (Clipping region) Not . Окно (рабочая область) с обновляемым регионом обрезается. SelectObject , SelectClipRgn GetClipBox
Читайте также:  Sculptris ��� mac os

Обычно данная структура содержит значения по умолчанию, определенные разработчиками из Microsoft.

Вы имеете возможность менять указанные атрибуты по собственному желанию уже после того, как получили дескриптор контекста устройства отображения. Но не надо забывать, что когда пользовательскому приложению требуется изменить какой-либо элемент структуры контекста устройства, оно должно производить эти действия исключительно через предназначенные для этого функции WinAPI, поскольку напрямую элементы структуры контекста устройства для изменения не доступны. Все описанные выше инструменты (и их параметры) доступны для выбора и переназначения, поскольку функции GDI используют только выбранные в контекст устройства параметры и инструменты рисования.

Помимо связывания функций вывода WinAPI с конкретным устройством, контекст устройства решает проблему чрезмерной нагрузки на систему при интенсивном вызове GDI-функций. Ведь если разобраться, то становится очевидным, что параметры в контексте устройства присутствуют для снижения нагрузки на подсистемы ядра от необходимости постоянной передачи одних и тех же атрибутов при каждом вызове GDI-функций.

Любой контекст устройства должен ассоциироваться с каким-либо аппаратным устройством (видеоадаптер, принтер, память). Например, для случая вывода текста в окно приложения, контекст устройства отображения для пользовательского приложения ассоциируется с областью окна приложения (не со всем экраном) и видеоадаптером/монитором. Сопряжение логического изображения с определенным видеоадаптером осуществляется уже на уровне ядра операционной системы на основе установленных в системе драйверов видеоадаптера. Контекст устройства дополнительно решает еще и задачу абстракции (независимости) от конкретной аппаратной архитектуры, позволяющей приложению записывать данные в аппаратное устройство, абсолютно не заботясь о том, правильно или неправильно будет представлена информация на огромном количестве существующих или перспективных аппаратных устройств, имеющих свою специфику. Таким образом обеспечивается идентичность изображения на всех конфигурациях, на которых работает операционная система Windows.

How to render by using a Direct2D device context

In this topic you will learn about creating Direct2D device context in WindowsВ 8. This information applies to you if you are developing Windows Store apps or a desktop app by using Direct2D. This topic describes the purpose of Direct2D device context objects, how to create that object , and a step by step guide about rendering and displaying Direct2D primitives and images. You will also learn about switching render targets and adding effects to your app.

Читайте также:  Установка omnisphere 2 пошаговая инструкция mac os

What is a Direct2D device?

You need a Direct2D device and a Direct3D device to create a Direct2D device context. A Direct2D device (exposes an ID2D1Device interface pointer) represents a display adapter. A Direct3D device (exposes an ID3D11Device interface pointer) is associated with a Direct2D device. Each app must have one Direct2D device, but can have more than one device.

What is a Direct2D device context?

A Direct2D device context (exposes an ID2D1DeviceContext interface pointer) represents a set of state and command buffers that you use to render to a target. You can call methods on the device context to set pipeline state and generate rendering commands by using the resources owned by a device.

Rendering with Direct2D on Windows 8

On WindowsВ 7 and earlier, you use a ID2D1HwndRenderTarget or another render target interface to render to a window or surface. Starting with WindowsВ 8, we do not recommend rendering by using methods that rely on interfaces like ID2D1HwndRenderTarget because they won’t work with Windows Store apps. You can use a device context to render to an Hwnd if you want to make a desktop app and still take advantage of the device context’s additional features. However, the device context is required to render content in a Windows Store apps with Direct2D.

Why use a device context to render?

  • You can render for Windows Store apps.
  • You can change the render target at any time before, during, and after rendering. The device context ensures that the calls to drawing methods are executed in order and applies them when you switch the render target.
  • You can use more than one type of window with a device context. You can use a device context and a DXGI swap chain to render directly to a Windows::UI::Core::CoreWindow or a Windows::UI::XAML::SwapChainBackgroundPanel.
  • You can use the Direct2Ddevice context to create Direct2D effects and to render the output of an image effect or effect graph to a render target.
  • You can have multiple device contexts, which can be helpful for improving performance in a threaded app. See Multithreaded Direct2D apps for more information.
  • The device context interoperates closely with Direct3D, giving you more access to Direct3D options.

How to create a Direct2D device context for rendering

The code here shows you how to create a Direct3D11 device, get the associated DXGI device, create a Direct2D device, and then finally create the Direct2D device context for rendering.

Here is a diagram of the method calls and the interfaces this code uses.

This code assumes you already have an ID2D1Factory1 object, for more information see the ID2D1Factory reference page.

Let’s walk through the steps in the preceding code sample.

Читайте также:  Использование windows коммерческих целях

Get an ID3D11Device interface pointer you will need this to create the device context.

Declare the creation flags to set up the Direct3D device for BGRA support. Direct2D requires BGRA color order.

Declare an array of D3D_FEATURE_LEVEL entries representing the set of feature levels that your app will support.

Direct3D searches your list until it finds the feature level supported by the host system.

Use the D3D11CreateDevice function to create an ID3D11Device object, the function will also return an ID3D11DeviceContext object, but that object is not needed for this example.

Selecting a target

The code here shows you how to get the 2 dimensional Direct3D texture for the window back buffer and create a bitmap target that links to this texture to which the Direct2D device context renders.

Let’s walk through the steps in the preceding code example.

These settings show an example of how to create a swap chain that a Windows Store app can use.

Get the adapter that the Direct3D device and the DXGI Device are running on and get the IDXGIFactory object associated with them. You must use this DXGI factory to ensure the swap chain is created on the same adapter.

Call the IDXGIFactory2::CreateSwapChainForCoreWindow method to create the swap chain. Use the Windows::UI::CoreWindow class for the main window of a Windows Store app.

Make sure to set the maximum frame latency to 1 to minimize power consumption.

If you want to render Direct2D content in a Windows Store app, see the CreateSwapChainForComposition method.

Get the back buffer from the swap chain. The back buffer exposes an ID3D11Texture2D interface allocated by the swap chain

Declare a D2D1_BITMAP_PROPERTIES1 struct and set the property values. Set the pixel format to BGRA because this is the format the Direct3D device and the DXGI Device use.

Get the back buffer as an IDXGISurface to pass to Direct2D. Direct2D doesn’t accept an ID3D11Texture2D directly.

Now the Direct2D bitmap is linked to the back buffer. Set the target on the Direct2D device context to the bitmap.

How to render and display

Now that you have a target bitmap, you can draw primitives, images, image effects, and text to it using the Direct2D device context. The code here shows you how to draw a rectangle.

Let’s walk through the steps in the preceding code example.

  1. Call the CreateSolidColorBrush to create a brush to paint the rectangle.
  2. Call the BeginDraw method before issuing any drawing commands.
  3. Call the DrawRectangle method the rectangle to be drawn and the brush.
  4. Call the EndDraw method after you’ve finished issuing drawing commands.
  5. Display the result by calling the IDXGISwapChain::Present method.

Now you can use the Direct2D device context draw primitives, images, image effects, and text to the screen.

Оцените статью