Étant donné la poignée d'une fenêtre Win32, j'ai besoin de trouver sa position par rapport à sa fenêtre parente.
Je connais plusieurs fonctions (par exemple; GetWindowRect()
et GetClientRect()
), mais aucune ne renvoie explicitement les coordonnées souhaitées.
Comment puis-je faire cela?
La solution utilise la puissance combinée de GetWindowRect()
et MapWindowPoints()
.
GetWindowRect()
récupère les coordonnées d'une fenêtre par rapport à toute la zone d'écran que vous voyez sur votre moniteur. Nous devons convertir ces coordonnées absolues en coordonnées relatives de notre zone de fenêtre principale. La MapWindowPoints()
transforme les coordonnées données par rapport à une fenêtre en par rapport à une autre. Nous avons donc besoin d'une "poignée" de la zone d'écran et de la poignée de la fenêtre parent du contrôle dont nous essayons de trouver les coordonnées. L'écran est une "fenêtre" dans la terminologie Windows et il est appelé "Bureau". Nous pouvons accéder à la poignée de Desktop par la constante HWND_DESKTOP
Définie dans WinUser.h
(Y compris Windows.h
Suffit). Et nous pouvons obtenir le handle de notre fenêtre parente simplement en appelant la fonction Win32 GetParent()
. Nous avons maintenant tous les paramètres nécessaires pour appeler la fonction MapWindowPoints()
.
RECT YourClass::GetLocalCoordinates(HWND hWnd) const
{
RECT Rect;
GetWindowRect(hWnd, &Rect);
MapWindowPoints(HWND_DESKTOP, GetParent(hWnd), (LPPOINT) &Rect, 2);
return Rect;
}
MapWindowPoints()
est définie comme:
int MapWindowPoints(
_In_ HWND hWndFrom,
_In_ HWND hWndTo,
_Inout_ LPPOINT lpPoints,
_In_ UINT cPoints
);
MapWindowPoints()
transforme les coordonnées relativement de hWndFrom
en hWndTo
. Dans notre cas, nous effectuons la transformation de Desktop (HWND_DESKTOP
) Vers notre fenêtre parent (GetParent(hWnd)
). Par conséquent, la structure RECT
résultante contient les coordonnées relatives de notre fenêtre enfant (hWnd
) par rapport à sa fenêtre parent.
c'est la solution que j'utilise pour les fenêtres ou pour les contrôles (fenêtres enfants)
RECT rc;
GetClientRect(hWnd,&rc);
MapWindowPoints(hWnd,GetParent(hWnd),(LPPOINT)&rc,2);