Поделиться через


Отрисовка целевых объектов, устройств и ресурсов

Целевой объект отрисовки — это просто расположение, в котором будет отображаться программа. Как правило, целевой объект отрисовки — это окно (в частности, клиентская область окна). Это также может быть растровое изображение в памяти, которое не отображается. Целевой объект отрисовки представлен интерфейсом ID2D1RenderTarget .

Устройство — это абстракция, представляющая то, что на самом деле рисует пиксели. Аппаратное устройство использует GPU для повышения производительности, в то время как программное устройство использует ЦП. Приложение не создает устройство. Вместо этого устройство создается неявно, когда приложение создает целевой объект отрисовки. Каждый целевой объект отрисовки связан с определенным устройством либо оборудованием, либо программным обеспечением.

Схема, показывющая связь между целевым объектом отрисовки и устройством.

Ресурс — это объект, который программа использует для рисования. Ниже приведены некоторые примеры ресурсов, определенных в Direct2D:

  • Кисть. Определяет, как окрашены линии и регионы. Типы кистей включают кисти сплошным цветом и градиентные кисти.
  • Стиль росчерка. Определяет внешний вид строки, например тире или сплошной.
  • Геометрия. Представляет коллекцию линий и кривых.
  • Сетка. Фигура, сформированная из треугольников. Данные сетки можно использовать непосредственно GPU, в отличие от геометрических данных, которые необходимо преобразовать перед отрисовкой.

Целевые объекты отрисовки также считаются типом ресурса.

Некоторые ресурсы пользуются аппаратным ускорением. Ресурс этого типа всегда связан с определенным устройством, оборудованием (GPU) или программным обеспечением (ЦП). Этот тип ресурса называется зависимым от устройства. Кисти и сетки являются примерами ресурсов, зависимых от устройств. Если устройство становится недоступным, ресурс должен быть повторно создан для нового устройства.

Другие ресурсы хранятся в памяти ЦП независимо от используемого устройства. Эти ресурсы являются независимыми от устройств, так как они не связаны с определенным устройством. При изменении устройства не требуется повторно создавать ресурсы, независимые от устройств. Стили росчерка и геометрии — это независимые от устройства ресурсы.

Документация По Windows для каждого ресурса указывает, зависит ли ресурс от устройства или устройства независимо от устройства. Каждый тип ресурса представлен интерфейсом, производным от ID2D1Resource. Например, кисти представлены интерфейсом ID2D1Brush .

Объект фабрики Direct2D

Первым шагом при использовании Direct2D является создание экземпляра объекта фабрики Direct2D. В компьютерном программировании фабрика — это объект, который создает другие объекты. Фабрика Direct2D создает следующие типы объектов:

  • Целевые объекты отрисовки.
  • Независимые от устройства ресурсы, такие как стили штрихов и геометрии.

Ресурсы, зависящие от устройств, такие как кисти и растровые изображения, создаются целевым объектом отрисовки.

Схема, показывющая фабрику direct2d.

Чтобы создать объект фабрики Direct2D, вызовите функцию D2D1CreateFactory .

ID2D1Factory *pFactory = NULL;

HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory);

Первый параметр — это флаг, указывающий параметры создания. Флаг D2D1_FACTORY_TYPE_SINGLE_THREADED означает, что вы не будете вызывать Direct2D из нескольких потоков. Чтобы поддерживать вызовы из нескольких потоков, укажите D2D1_FACTORY_TYPE_MULTI_THREADED. Если программа использует один поток для вызова в Direct2D, то более эффективный вариант с одним потоком.

Второй параметр функции D2D1CreateFactory получает указатель на интерфейс ID2D1Factory.

Перед первым сообщением WM_PAINT необходимо создать объект фабрики Direct2D. Обработчик сообщений WM_CREATE является хорошим местом для создания фабрики:

    case WM_CREATE:
        if (FAILED(D2D1CreateFactory(
                D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory)))
        {
            return -1;  // Fail CreateWindowEx.
        }
        return 0;

Создание ресурсов Direct2D

Программа Circle использует следующие ресурсы, зависящие от устройств:

  • Целевой объект отрисовки, связанный с окном приложения.
  • Кисть сплошного цвета, чтобы закрасить круг.

Каждый из этих ресурсов представлен интерфейсом COM:

Программа Circle сохраняет указатели на эти интерфейсы в виде переменных-членов MainWindow класса:

ID2D1HwndRenderTarget   *pRenderTarget;
ID2D1SolidColorBrush    *pBrush;

Следующий код создает эти два ресурса.

HRESULT MainWindow::CreateGraphicsResources()
{
    HRESULT hr = S_OK;
    if (pRenderTarget == NULL)
    {
        RECT rc;
        GetClientRect(m_hwnd, &rc);

        D2D1_SIZE_U size = D2D1::SizeU(rc.right, rc.bottom);

        hr = pFactory->CreateHwndRenderTarget(
            D2D1::RenderTargetProperties(),
            D2D1::HwndRenderTargetProperties(m_hwnd, size),
            &pRenderTarget);

        if (SUCCEEDED(hr))
        {
            const D2D1_COLOR_F color = D2D1::ColorF(1.0f, 1.0f, 0);
            hr = pRenderTarget->CreateSolidColorBrush(color, &pBrush);

            if (SUCCEEDED(hr))
            {
                CalculateLayout();
            }
        }
    }
    return hr;
}

Чтобы создать целевой объект отрисовки для окна, вызовите метод ID2D1Factory::CreateHwndRenderTarget в фабрике Direct2D.

  • Первый параметр задает параметры, которые являются общими для любого типа целевого объекта отрисовки. Здесь мы передаваем параметры по умолчанию, вызывая вспомогательные функции D2D1::RenderTargetProperties.
  • Второй параметр задает дескриптор окна, а также размер целевого объекта отрисовки в пикселях.
  • Третий параметр получает указатель ID2D1HwndRenderTarget .

Чтобы создать кисть сплошным цветом, вызовите метод ID2D1RenderTarget::CreateSolidColorBrush в целевом объекте отрисовки. Цвет присваивается как значение D2D1_COLOR_F. Дополнительные сведения о цветах в Direct2D см. в разделе "Использование цвета" в Direct2D.

Кроме того, обратите внимание, что если целевой объект отрисовки уже существует, CreateGraphicsResources метод возвращает S_OK без каких-либо действий. Причина этого дизайна станет ясной в следующем разделе.

Следующий

Рисование с использованием Direct2D