DETERMINAR A POSICAO DE UM CONTROLE

HIDDEN 24/01/2011 09:26:17
#363204
Estou tentando determinar a posição de um controle (Top e Left) dentro de um formulário. As propriedades Top e Left nativas de qualquer controle retornam a posição do mesmo em relação ao container em que eles estão. Por exemplo, se estão no Form, Top e Left serão relativas ao Form. Porém, se o controle estiver dentro de uma PictureBox, por exemplo, Top e Left serão relativas a PictureBox.

Como eu posso determinar as coordenadas de um controle relativas ao Form, mesmo este controle estando dentro de outro recipiente (como a PictureBox, do exemplo)?
SAMUKA 24/01/2011 09:59:44
#363209
Bom dia HIDDEN!

Use a propriedade PARENT


Dim topo As Integer
Dim esq As Integer
topo = btnCommand1.Top + btnCommand1.Parent.Top
esq = btnCommand1.Left + btnCommand1.Parent.Left
HIDDEN 24/01/2011 10:13:56
#363212
Não está dando certo. Vou explicar o que eu desejo realizar: posicionar um controle (Image) ao lado de um TextBox, toda vez que este receber o foco. Para isso, preciso determinar a posição da TextBox para assim posicionar o Image ao lado esquerdo dela.

Estou usando a seguinte abordagem:

 
GetWindowRect Text1.hwnd, contRect
Image1.Top = contRect.Top


Sendo Text1 minha TextBox e Image1 meu controle Image.

Num módulo, claro:


Public Declare Function GetClientRect Lib [Ô]user32[Ô] (ByVal hwnd As Long, lpRect As RECT) As Long
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Global contRect As RECT


Ps.:
GetWindowRect Text1.hwnd, contRect 
me retorna um valor. Mas eu acho que este valor está em uma escala diferente. Aliás, tenho certeza de que está em uma escala diferente. Acho que o problema agora está apenas na conversão de escala.
HIDDEN 24/01/2011 11:29:23
#363232
Consegui resolver o problema, ao menos parcialmente. Quando faço chamada da função GetWindowRect, ela me retorna a posição do controle desejado em relação a tela como um todo (VB.Screen). Desta forma tenho que subtrair a posição do controle da posição do Formulário.

     
Dim FrmT As Long, FrmL As Long
Dim WinW As Long, WinH As Long

WinW = VB.Screen.Width / VB.Screen.TwipsPerPixelX
WinH = VB.Screen.Height / VB.Screen.TwipsPerPixelY
FrmT = Form1.Top / VB.Screen.TwipsPerPixelY
FrmL = Form1.Left / VB.Screen.TwipsPerPixelX

GetWindowRect Image1.hwnd, contRect
Image1.Top = (contRect.Top - FrmT - 25) * VB.Screen.TwipsPerPixelY
Image1.Left = (contRect.Left - FrmL - 3) * VB.Screen.TwipsPerPixelX


Digo que a solução está parcialmente resolvida por conta deste detalhe: Image1.Top = (contRect.Top - FrmT - 25) * VB.Screen.TwipsPerPixelY

Tenho que subtrair 25, que é referente a altura da bara de títulos da janela. Mas essa altura pode variar, de acordo com o sistema operacional. Se alguém souber de uma chamada da API para determinar a altura da barra de título de uma janela, a função estará completa.
Tópico encerrado , respostas não são mais permitidas