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


Метод IOleInPlaceSiteWindowless::GetDC (ocidl.h)

Предоставляет объект с маркером контекста устройства или устройств для экрана совместимого из своего контейнера.

Синтаксис

HRESULT GetDC(
  [in]  LPCRECT pRect,
  [in]  DWORD   grfFlags,
  [out] HDC     *phDC
);

Параметры

[in] pRect

Указатель на прямоугольник, который объект хочет перерисовать, в клиентских координатах содержащего окна. Если этот параметр имеет значение NULL, выполняется перерисовка полного экстента объекта.

[in] grfFlags

Сочетание значений из перечисления OLEDCFLAGS .

[out] phDC

Указатель на возвращенный контекст устройства.

Возвращаемое значение

Этот метод возвращает значение S_OK при успешном завершении. Другие возможные возвращаемые значения включают следующее.

Код возврата Описание
OLE_E_NESTEDPAINT
Контейнер уже находится в середине сеанса рисования. То есть этот метод уже был вызван, а метод IOleInPlaceSiteWindowless::ReleaseDC еще не был вызван.

Комментарии

Контекст устройства, полученный этим методом, должен быть освобожден путем вызова IOleInPlaceSiteWindowless::ReleaseDC.

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

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

Примечания для разработчиков

В зависимости от того, возвращается ли контекст устройства на экране или за экраном, и в зависимости от того, насколько сложным он является, контейнер может использовать один из следующих алгоритмов:
  1. На экране, One Pass Drawing
    1. В методе IOleInPlaceSiteWindowless::GetDC контейнер должен:
      • Получение контекста устройства окна.
      • Если задано значение OLEDC_PAINTBKGND, нарисуйте DVASPECT_CONTENT аспект каждого объекта за объектом, запрашивающим контекст устройства.
      • Возвращает контекст устройства.
    2. В методе ReleaseDC контейнер должен:
      • Нарисуйте DVASPECT_CONTENT каждого перекрывающегося объекта.
      • Отпустите контекст устройства.
  2. На экране, документ с двумя проходами
    1. В методе IOleInPlaceSiteWindowless::GetDC контейнер должен:
      • Получение контекста устройства окна.
      • Вырезать непрозрачные области любого перекрывающегося объекта. Эти регионы не нужно перерисовывать, так как они уже верны на экране.
      • Если OLEDC_PAINTBKGND не задано, верните контекст устройства.
      • В противном случае вырезайте непрозрачные части объекта, запрашивающего контекст устройства, и нарисуйте непрозрачные части каждого объекта за ним, идущие вперед к спине.
      • Нарисуйте прозрачные аспекты каждого объекта позади, возвращаясь к переднему краю, каждый раз устанавливая соответствующую область обрезки.
      • Наконец, верните контекст устройства.
    2. В методе IOleInPlaceSiteWindowless::ReleaseDC контейнер должен:
      • Нарисуйте прозрачные части каждого перекрывающегося объекта.
      • Отпустите контекст устройства.
  3. Рисование вне экрана
    1. В методе IOleInPlaceSiteWindowless::GetDC контейнер должен:
      • Создайте совместимый с экраном контекст устройства памяти, содержащий совместимое растровое изображение соответствующего размера.
      • Сопоставьте источник окна просмотра контекста устройства, чтобы убедиться, что вызывающий объект может рисовать с помощью координат клиентской области содержащего окна.
      • Если задано OLEDC_PAINTBKGND, нарисуйте DVASPECT_CONTENT каждого объекта за вызывающим объектом.
      • Возвращает контекст устройства.
    2. В методе IOleInPlaceSiteWindowless::ReleaseDC контейнер должен:
      • Нарисуйте DVASPECT_CONTENT аспект каждого перекрывающегося объекта.
      • Скопируйте точечный рисунок вне экрана на экран в расположение вызывающего объекта, первоначально запрошенного в IOleInPlaceSiteWindowless::GetDC.
      • Удалите и отпустите контекст устройства памяти.
При возврате этого метода необходимо задать область обрезки в контексте устройства, чтобы объект не смог закрасить ни в одной области, в которую он не должен. Если объект не является непрозрачным, фон должен быть закрашен. Если контекстом устройства является экран, все перекрывающиеся непрозрачные области должны быть обрезанными.

Требования

Требование Значение
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Целевая платформа Windows
Header ocidl.h

См. также раздел

IOleInPlaceSiteWindowless

IOleInPlaceSiteWindowless::ReleaseDC

OLEDCFLAGS