web-dev-qa-db-fra.com

Quelle est la différence entre GetClientRect et GetWindowRect dans WinApi?

Que dois-je utiliser dans InvalidateRect pour actualiser ma fenêtre? Et pourquoi?

25
Abzac

Le rect de la fenêtre comprend la zone non cliente, c'est-à-dire les bordures de la fenêtre, la barre de légende, etc. Le rect du client ne le fait pas.

GetWindowRect renvoie un rect en coordonnées écran tandis que GetClientRect renvoie un rect en coordonnées client.

InvalidateRect reçoit un rect en coordonnées client. Si vous souhaitez invalider l'intégralité de votre espace client, passez NULL à InvalidateRect. Vous pouvez passer le rect renvoyé par GetClientRect, mais il est beaucoup plus simple et plus clair de passer NULL.

44
David Heffernan

GetClientRect récupère les coordonnées de la zone cliente de la fenêtre. Plus précisément, c'est la zone à l'intérieur de la fenêtre chrome et exclut l'en-tête etc. Un des commentaires sur la page MSDN le résume assez bien:

Je dirais que cette fonction renvoie la taille de la zone dans laquelle je peux rendre.

GetWindowsRect obtient les coordonnées de la fenêtre entière. Ceci inclut l'en-tête, la barre d'état etc. Cependant selon un commentaire sur la page MSDN

Les applications sous Vista qui ne sont pas liées à WINVER = 6 recevront ici un ensemble de valeurs trompeuses, qui ne tiennent pas compte du remplissage supplémentaire de pixels "en verre" que Vista Aero applique à la fenêtre.

Donc, à moins que cela n'ait été corrigé pour Windows 7, vérifiez le résultat obtenu et assurez-vous que vous avez la valeur correcte de WINVER.

11
ChrisF

Une explication très simple est que GetWindowRect() vous donne le rectangle qui inclut les bordures de la fenêtre. GetClientRect() vous donne le rectangle qui exclut les bordures - la zone qui est allouée au dessin spécifique de la fenêtre.

Veuillez noter que GetWindowRect() renvoie un rectangle en coordonnées d'écran - coordonnées relatives à l'écran/au moniteur. GetClientRect() renvoie un rectangle relatif à lui-même.

11
Jörgen Sigvardsson

Depuis MSDN:
GetWindowRect
Récupère les dimensions du rectangle englobant de la fenêtre spécifiée. Les dimensions sont données en coordonnées d'écran relatives au coin supérieur gauche de l'écran.

GetClientRect
Récupère les coordonnées de la zone client d'une fenêtre. Les coordonnées du client spécifient les coins supérieur gauche et inférieur droit de la zone client. Étant donné que les coordonnées du client sont relatives au coin supérieur gauche de la zone client d'une fenêtre, les coordonnées du coin supérieur gauche sont (0,0).

Plus: le client rect n'inclut pas la barre de titre, les bordures, les barres de défilement, la barre d'état ...

6
Marco