2009-12-23 3 views
16

Je veux être en mesure d'écrire du code comme ceci:Comment obtenir la position d'un contrôle par rapport au rectangle client de la fenêtre?

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

Et avoir rien faire. Cependant, je ne peux pas travailler sur la façon d'écrire une fonction GetWindowPos() qui me donne des réponses dans les bonnes unités:

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; 
} 

Si j'utilise cette fonction, je reçois des coordonnées qui sont par rapport à la partie supérieure gauche du parent fenêtre, mais SetWindowPos() veut des coordonnées par rapport à la zone en dessous de la barre de titre (je présume qu'il s'agit de la "zone client", mais la terminologie win32 est tout un peu nouveau pour moi).

Solution C'est la fonction GetWindowPos() de travail (merci 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

Est-ce une application de fenêtre –

+0

Comment ça marche, Quelle est l'utilisation de DirectX. Débutant en directx. J'ai fait ma propre fonction pour le faire –

+0

Oui c'est une application windows, d'où l'utilisation de win32 api. – Andy

Répondre

17

Essayez d'utiliser GetClientRect pour obtenir les coordonnées et MapWindowPoints pour le transformer.

1

Je pense que tu veux quelque chose comme ça. Je ne sais pas chaud pour trouver des contrôles. Ce segment de code alligne la position d'une étiquette au centre de la fenêtre en fonction de la taille du formulaire.

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

Ce n'est pas vraiment utile car il n'y a pas d'équivalent à la propriété ".Location" que vous utilisez dans le win32 (ou au moins, aucun que j'ai trouvé). – Andy

+0

je n'ai jamais utilisé win32. Au cas où vous auriez une solution, SVP faites le moi savoir aussi –

Questions connexes