c++ windows winapi gdi

c++ - ¿Cuál es la diferencia entre GetClientRect y GetWindowRect en WinApi?



windows gdi (4)

Desde MSDN:
GetWindowRect
Recupera las dimensiones del rectángulo delimitador de la ventana especificada. Las dimensiones se dan en coordenadas de pantalla que están relacionadas con la esquina superior izquierda de la pantalla.

GetClientRect
Recupera las coordenadas del área de cliente de una ventana. Las coordenadas del cliente especifican las esquinas superior izquierda e inferior derecha del área del cliente. Como las coordenadas del cliente son relativas a la esquina superior izquierda del área de cliente de una ventana, las coordenadas de la esquina superior izquierda son (0,0).

Más : el cliente rect no incluye barra de título, bordes, barras de desplazamiento, barra de estado ...

¿Qué debo usar en InvalidateRect para actualizar mi ventana? ¿Y por qué?


Una explicación muy simple es que GetWindowRect() le proporciona el rectángulo que incluye los bordes de la ventana. GetClientRect() le proporciona el rectángulo que excluye los bordes: el área asignada al dibujo específico de la ventana.

Tenga en cuenta que GetWindowRect() devuelve un rectángulo en coordenadas de pantalla: coordenadas relativas a la pantalla / monitor. GetClientRect() devuelve un rectángulo que es relativo a sí mismo.


GetClientRect obtiene las coordenadas del área de cliente de la ventana. Específicamente, este es el área dentro de la ventana chrome y excluye el encabezado, etc. Uno de los comentarios en la página de MSDN lo resume bastante bien:

Diría que esta función devuelve el tamaño del área a la que puedo renderizar.

GetWindowsRect obtiene las coordenadas de toda la ventana. Esto incluye el encabezado, la barra de estado, etc. Sin embargo, según un comentario en la página de MSDN

Las aplicaciones de Vista que no están vinculadas con WINVER = 6 recibirán aquí un conjunto de valores engañosos, que no tienen en cuenta el relleno extra de los píxeles "de cristal" que Vista Aero aplica a la ventana.

Por lo tanto, a menos que esto se haya solucionado para Windows 7, compruebe dos veces el resultado que obtiene y asegúrese de tener el valor correcto de WINVER .


La ventana rect incluye el área no cliente, es decir, los bordes de la ventana, la barra de título, etc. El cliente rect no.

GetWindowRect devuelve un rect en coordenadas de pantalla mientras que GetClientRect devuelve un rect en las coordenadas del cliente.

InvalidateRect recibe un rect en las coordenadas del cliente. Si desea invalidar su área de cliente completa, pase NULL a InvalidateRect . Podría pasar el rect devuelto por GetClientRect , pero es mucho más simple y claro pasar el NULL .