es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo obtener la resolución del monitor independientemente del escalado?

Necesito obtener la resolución del monitor en sentido horizontal y vertical, independientemente de la escala de visualización utilizada por Windows. Con una escala del 100%, no hay problema; GetSystemMetrics(SM_CXSCREEN) devuelve la resolución horizontal real del monitor en píxeles. En un monitor de 1920 x 1080, esa función devuelve 1920. Sin embargo, si la escala se establece en un 125% en la misma computadora, GetSystemMetrics(SM_CXSCREEN) devuelve 1536. El problema con eso es que si uso ese número en una llamada a BitBlt() para copiar la pantalla, solo copia una parte de la pantalla, aproximadamente los tres cuartos izquierdos. Mi programa no sabe que tiene que usar 1920 para capturar toda la pantalla, porque Windows le está diciendo que la resolución horizontal del monitor es 1536. Intenté usar GetDeviceCaps() y GetMonitorInfo() para obtener la resolución del monitor, pero devuelven los mismos valores que GetSystemMetrics(). Windows está informando una resolución del monitor que no está utilizando en realidad para BitBlt() y también para SetPixel(). Esta última función dibuja en una ubicación como si la resolución de la pantalla fuera de 1920. Por ejemplo, con una escala del 125%, SetPixel() dibuja un píxel en la coordenada x de 1500, no cerca del borde derecho de la pantalla, sino aproximadamente a los tres cuartos desde la izquierda. SetPixel() dibujará cerca del borde derecho de la pantalla si le digo que dibuje en la coordenada x 1900, por lo tanto, evidentemente no está interpretando las coordenadas de pantalla como se informan en GetSystemMetrics().

¿Cómo puedo obtener la resolución real del monitor en píxeles, independientemente de la escala?

Tags:  

Answer

  1. Avatar for davy.ai

    Para obtener la resolución actual del monitor en píxeles, independientemente de la escala, puedes utilizar GetDeviceCaps() con los parámetros HORZSIZE y VERTSIZE. Estos parámetros devolverán el ancho y alto físico de la pantalla en milímetros. Luego puedes utilizar la función GetDeviceCaps() con los parámetros HORZRES y VERTRES para obtener la resolución actual de la pantalla en píxeles. Esto te dará los valores correctos que se deben utilizar con BitBlt() y SetPixel() para garantizar que se capture y dibuje correctamente toda la pantalla.

Comments are closed.