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


Метод IViewObjectEx::QueryHitPoint (ocidl.h)

Указывает, находится ли точка в пределах заданного аспекта объекта.

Синтаксис

HRESULT QueryHitPoint(
  [in]  DWORD   dwAspect,
  [in]  LPCRECT pRectBounds,
  [in]  POINT   ptlLoc,
  [in]  LONG    lCloseHint,
  [out] DWORD   *pHitResult
);

Параметры

[in] dwAspect

Запрошенный аспект рисования.

[in] pRectBounds

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

[in] ptlLoc

Расположение попадания в клиентских координатах содержащего окна.

[in] lCloseHint

Предлагаемое расстояние в единицах HIMETRIC , которое контейнер считает близким. Это значение является подсказкой, и объекты могут интерпретировать его по-своему. Объекты также могут использовать это указание для приблизительного вывода разрешения выходных данных, чтобы выбрать расширяемость реализации теста попадания.

[out] pHitResult

Указатель на возвращаемые сведения о попадании, выраженные в виде значений перечисления HITRESULT .

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

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

Код возврата Описание
E_FAIL
Этот метод не реализован для запрошенного аспекта. Вместо этого используйте DVASPECT_CONTENT .

Комментарии

Для поддержки обнаружения попаданий в непрямоугольных объектах контейнеру требуется надежный способ запроса объекта, находится ли данное расположение внутри одного из его аспектов рисования. Эта функция предоставляется IViewObjectEx::QueryHitPoint.

Примечание Так как этот метод является частью интерфейса IViewObjectEx , контейнер может определить, находится ли нажатие мыши на объект без необходимости запуска сервера. Если попадание окажется внутри объекта , то, скорее всего, объект будет активирован на месте и запущен сервер.
 
Как правило, контейнер сначала быстро определяет, находится ли заданное расположение в прямоугольной области объекта. Если расположение находится в прямоугольной области объекта, контейнер вызывает IViewObjectEx::QueryHitPoint , чтобы получить подтверждение того, что расположение находится внутри объекта. Расположение попадания передается в клиентских координатах окна контейнера. Так как объект может быть неактивным при вызове этого метода, ограничивающий прямоугольник объекта в той же системе координат также передается этому методу, аналогично тому, что происходит в IPointerInactive::OnInactiveSetCursor.

Возможные возвращаемые значения:

  • Снаружи, в прозрачной области
  • Достаточно близко, чтобы считаться попаданием (может использоваться небольшими или тонкими объектами)
  • Ударил
IViewObjectEx::QueryHitPoint не связан с подобъектами вызываемого объекта. Он просто указывает, был ли удар мыши внутри объекта.

IViewObjectEx::QueryHitPoint можно вызывать для любого из аспектов рисования, поддерживаемых объектом . Он должен завершиться ошибкой, если не поддерживается для запрошенного аспекта рисования.

Прозрачные объекты могут захотеть реализовать сложный механизм обнаружения попаданий, при котором пользователь может выбрать либо прозрачный объект, либо объект за ним, в зависимости от того, где именно происходит щелчок внутри объекта. Например, прозрачное текстовое поле с достаточно большим текстом может позволить пользователю выбрать объект позади, например растровое изображение, когда пользователь щелкает между символами. По этой причине сведения, возвращаемые IViewObjectEx::QueryHitPoint , содержат сведения о том, происходит ли попадание в непрозрачную или прозрачную область.

Примером непрямоугольного и прозрачного обнаружения попадания является элемент управления "Прозрачный круг" с объектом за ним (строка в примере ниже):

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

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

На рисунке выше точки, отмеченные как Hit, Close и Transparent, будут попаданиями различной силы на круге, за исключением пометки Transparent (но для линии close). Это иллюстрирует влияние разной силы попаданий. Так как круг реагирует прозрачным, пока линия утверждает, что она закрывается, а прозрачная линия слабее, чем близко, линия принимает удар.

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

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

Требования

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

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

HITRESULT

IPointerInactive::OnInactiveSetCursor

IViewObjectEx