Compartir a través de


Método IViewObjectEx::QueryHitPoint (ocidl.h)

Indica si un punto está dentro de un aspecto determinado de un objeto.

Sintaxis

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

Parámetros

[in] dwAspect

Aspecto de dibujo solicitado.

[in] pRectBounds

Rectángulo delimitador de objetos en coordenadas de cliente de la ventana contenedora. El contenedor calcula y pasa este rectángulo para que el objeto pueda interpretar significativamente la ubicación de acierto.

[in] ptlLoc

Ubicación de aciertos en las coordenadas de cliente de la ventana contenedora.

[in] lCloseHint

Distancia sugerida en unidades HIMETRIC que el contenedor considera cerrar. Este valor es una sugerencia y los objetos pueden interpretarlo de forma propia. Los objetos también pueden usar esta sugerencia para deducir aproximadamente la resolución de salida para elegir la amplitud de la implementación de la prueba de posicionamiento.

[out] pHitResult

Puntero a la información devuelta sobre el acierto expresado como los valores de enumeración HITRESULT .

Valor devuelto

Este método devuelve S_OK si se ejecuta correctamente. Otros posibles valores devueltos son los siguientes.

Código devuelto Descripción
E_FAIL
Este método no se implementa para el aspecto solicitado. Use DVASPECT_CONTENT en su lugar.

Comentarios

Para admitir la detección de aciertos en objetos no rectangulares, el contenedor necesita una manera confiable de preguntar a un objeto si una ubicación determinada está dentro de uno de sus aspectos de dibujo. IViewObjectEx::QueryHitPoint proporciona esta función.

Nota Dado que este método forma parte de la interfaz IViewObjectEx , el contenedor puede averiguar si un clic del mouse está sobre un objeto sin tener que iniciar necesariamente el servidor. Si el acierto se produce dentro del objeto, es probable que el objeto se active en contexto y se inicie el servidor.
 
Normalmente, el contenedor primero determina rápidamente si una ubicación determinada está dentro de la extensión rectangular de un objeto. Si la ubicación está dentro de la extensión rectangular de un objeto, el contenedor llama a IViewObjectEx::QueryHitPoint para obtener la confirmación de que la ubicación está realmente dentro del objeto . La ubicación de acierto se pasa en las coordenadas de cliente de la ventana del contenedor. Dado que el objeto puede estar inactivo cuando se llama a este método, el rectángulo delimitador del objeto en el mismo sistema de coordenadas también se pasa a este método, de forma similar a lo que sucede en IPointerInactive::OnInactiveSetCursor.

Entre los valores devueltos posibles se incluyen:

  • Fuera, en una región transparente
  • Lo suficientemente cerca como para considerarse un acierto (puede ser utilizado por objetos pequeños o finos)
  • Golpe
IViewObjectEx::QueryHitPoint no le preocupa el subobjeto del objeto al que se llama. Simplemente indica si el clic del mouse estaba dentro del objeto o no.

Se puede llamar a IViewObjectEx::QueryHitPoint para cualquiera de los aspectos de dibujo que admite un objeto. Debe producir un error si no se admite para el aspecto de dibujo solicitado.

Es posible que los objetos transparentes deseen implementar un mecanismo de detección de posicionamiento complejo en el que el usuario pueda seleccionar el objeto transparente o un objeto detrás de él, dependiendo de dónde se produzca exactamente el clic dentro del objeto. Por ejemplo, un cuadro de texto transparente que muestra texto lo suficientemente grande puede permitir al usuario seleccionar el objeto detrás, por ejemplo, un mapa de bits, cuando el usuario hace clic entre los caracteres. Por este motivo, la información devuelta por IViewObjectEx::QueryHitPoint incluye una indicación de si el acierto se produce en una región opaca o transparente.

Un ejemplo de detección de aciertos no rectangular y transparente es un control de círculo transparente con un objeto detrás de él (una línea en el ejemplo siguiente):

Diagrama de un círculo con una línea diagonal a través de él, que muestra los valores de detección de aciertos para las áreas dentro y fuera del círculo y cerca de la línea.

Los valores que se muestran son para las pruebas de posicionamiento en el círculo; Las regiones grises no forman parte del control, pero se muestran aquí para indicar un área alrededor de la imagen que se considera cercana. Cada objeto implementa su propia definición de cierre, pero es asistida por una sugerencia proporcionada por el contenedor para que la proximidad se pueda ajustar a medida que las imágenes se acerquen más o menos.

En la imagen anterior, los puntos marcados como Hit, Close y Transparent serían todos aciertos de intensidad variable en el círculo, con la excepción del marcado Transparent( pero para la línea, close). Esto muestra el efecto de la diferente fuerza de los golpes. Dado que el círculo responde de forma transparente mientras se cierran las notificaciones de línea y es más débil que cerrar, la línea toma el acierto.

Notas para los implementadores

Se requiere un objeto compatible con IViewObjectEx para implementar este método al menos para el aspecto DVASPECT_CONTENT . El objeto no debe realizar ninguna otra acción en respuesta a este método que no sea para devolver la información; no debe haber efectos secundarios.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows 2000 Server [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado ocidl.h

Consulte también

HITRESULT

IPointerInactive::OnInactiveSetCursor

IViewObjectEx