2009-12-23 13 views
16

Ich möchte Code schreiben können wie folgt aus:Wie bekomme ich die Position eines Steuerelements relativ zum Client rect des Fensters?

HWND hwnd = <the hwnd of a button in a window>; 
int positionX; 
int positionY; 
GetWindowPos(hwnd, &positionX, &positionY); 
SetWindowPos(hwnd, 0, positionX, positionY, 0, 0, SWP_NOZORDER | SWP_NOSIZE); 

Und haben sie nichts tun. Allerdings kann ich nicht ausrechnen, wie eine GetWindowPos() Funktion zu schreiben, die ich Antworten in den richtigen Einheiten gibt:

void GetWindowPos(HWND hWnd, int *x, int *y) 
{ 
    HWND hWndParent = GetParent(hWnd); 

    RECT parentScreenRect; 
    RECT itemScreenRect; 
    GetWindowRect(hWndParent, &parentScreenRect); 
    GetWindowRect(hWnd, &itemScreenRect); 

    (*x) = itemScreenRect.left - parentScreenRect.left; 
    (*y) = itemScreenRect.top - parentScreenRect.top; 
} 

Wenn ich diese Funktion verwenden, ich Koordinaten erhalten, die bezüglich des oberen linke Ecke der Mutter Fenster, aber SetWindowPos() will Koordinaten relativ zum Bereich unterhalb der Titelleiste (ich nehme an, dies ist der "Client-Bereich", aber die Win32-Terminologie ist alles ein bisschen neu für mich).

Lösung Dies ist die Arbeits GetWindowPos() Funktion (dank Sergius):

void GetWindowPos(HWND hWnd, int *x, int *y) 
{ 
    HWND hWndParent = GetParent(hWnd); 
    POINT p = {0}; 

    MapWindowPoints(hWnd, hWndParent, &p, 1); 

    (*x) = p.x; 
    (*y) = p.y; 
} 
+0

Ist es ein Fenster Anwendung –

+0

Wie funktioniert es, was ist die Verwendung von DirectX. Anfänger in directx. Ich habe meine eigene Funktion, dies zu tun –

+0

Ja, es ist eine Windows-Anwendung, daher die Verwendung von Win32 API. – Andy

Antwort

17

Try GetClientRect zu verwenden Koordinaten zu erhalten und MapWindowPoints es zu transformieren.

1

Ich denke, u so etwas wollen. Ich weiß nicht, wie heiß es ist, Kontrollen zu finden. Dieses Code-Segment weist die Position eines Labels in der Mitte der Fensterform entsprechend der Größe der Form zu.

AllignLabelToCenter(lblCompanyName, frmObj) 


Public Sub AllignLabelToCenter(ByRef lbl As Label, ByVal objFrm As Form) 
     Dim CenterOfForm As Short = GetCenter(objFrm.Size.Width) 
     Dim CenterOfLabel As Short = GetCenter(lbl.Size.Width) 
     lbl.Location = New System.Drawing.Point(CenterOfForm - CenterOfLabel, lbl.Location.Y) 
    End Sub 
    Private ReadOnly Property GetCenter(ByVal obj As Short) 
     Get 
      Return obj/2 
     End Get 
    End Property 
+0

Das ist nicht wirklich nützlich, da es keine Entsprechung zu der ".Location" -Eigenschaft gibt, die Sie in win32 verwenden (oder zumindest keine, die ich gefunden habe). – Andy

+0

Ich habe nie Win32 verwendet. Für den Fall, dass du eine Lösung bekommst, lass es mich auch wissen –

Verwandte Themen