web-dev-qa-db-fra.com

Comment puis-je trouver la position d'un contrôle / fenêtre Win32 par rapport à sa fenêtre parente?

É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?

26
hkBattousai

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.

36
hkBattousai

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);
11
thinlizzy