La soluzione utilizza la potenza combinata di GetWindowRect()
e MapWindowPoints()
.
GetWindowRect()
recupera le coordinate di una finestra relative all'intera area dello schermo visualizzata sul monitor. Abbiamo bisogno di convertire queste coordinate assolute in coordinate relative della nostra finestra principale. Lo MapWindowPoints()
trasforma le coordinate date relative ad una finestra in relazione ad un'altra. Quindi abbiamo bisogno di un "handle" dell'area dello schermo e della maniglia della finestra genitore del controllo che stiamo cercando di trovare le coordinate di. Lo schermo è una "finestra" nella terminologia di Windows e si chiama "Desktop". Possiamo accedere all'handle del desktop con la costante HWND_DESKTOP
definita in WinUser.h
(incluso Windows.h
). E possiamo ottenere l'handle della nostra finestra genitore semplicemente chiamando la funzione Win32 GetParent()
. Ora abbiamo tutti i parametri necessari per chiamare la funzione MapWindowPoints()
.
RECT YourClass::GetLocalCoordinates(HWND hWnd) const
{
RECT Rect;
GetWindowRect(hWnd, &Rect);
MapWindowPoints(HWND_DESKTOP, GetParent(hWnd), (LPPOINT) &Rect, 2);
return Rect;
}
MapWindowPoints()
è definito come:
int MapWindowPoints(
_In_ HWND hWndFrom,
_In_ HWND hWndTo,
_Inout_ LPPOINT lpPoints,
_In_ UINT cPoints
);
MapWindowPoints()
trasformazione delle coordinate relativamente da hWndFrom
a hWndTo
. Nel nostro caso, eseguiamo la trasformazione da Desktop (HWND_DESKTOP
) alla nostra finestra principale (GetParent(hWnd)
). Pertanto, la struttura risultante RECT
contiene le coordinate relative della finestra figlio (hWnd
) relative alla relativa finestra padre.
Oggi ho utilizzato una buona quantità di tempo per trovare una soluzione a questo problema. Ci sono molte informazioni errate e fuorvianti su questo argomento in internet e persino in questo sito. È una grande tragedia che Win32 non fornisce una funzione esplicita per raccogliere queste informazioni, ed è anche terribile che sia molto difficile trovare una buona spiegazione e codice di esempio per la soluzione di questo semplice problema. Sto condividendo la soluzione qui per aiutare altri utenti che la cercheranno in futuro. – hkBattousai
Sei sicuro, questo lavoro su più monitor ??? – Xearinox
@Xearinox Mi rendo conto che sto risuscitando i morti qui, ma ... Sì. Su più monitor, a seconda di quale è il display principale, il metodo restituirà valori altamente negativi o molto positivi per rappresentare le coordinate relative al display principale. Provalo tu stesso usando "SetCursorPos' e vedi dove si posiziona il cursore del mouse. – RectangleEquals