Newsgroup: it.comp.lang.visual-basic
Titolo: Posizione del controllo nel form

Salve a tutti.
Sto scrivendo un OCX per risolvere i problemi legati alla carenza del
multiline nei tooltip dei controlli (che gia' molti nel ng hanno
segnalato e che non ha praticamente soluzione).
Funziona tutto benissimo se il controllo (qualsiasi tipo textbox,
combo, spread, ecc) e' all'interno della form, ma se questo e'
contenuto in un frame mi salta tutto, perche' la posizione del
controllo (che mi serve per posizionare il tooltip creato con il mio
OCX) non e' piu' assoluta, ma e' relativa al frame.
Mi spiego meglio :
Se posiziono in alto a destra un textbox in una form, questo avra'
come proprieta' 
TEXT1.LEFT = 200
TEXT1.TOP = 200
ma se creo un frame in basso a destra nella form, ed all'interno metto
lo stesso textbox avro' 
FRAME1.LEFT = 5000
FRAME1.TOP = 5000
e 
TEXT1.LEFT = 200
TEXT1.TOP = 200
Quindi ecco cosa intendo quando dico che la posizione del controllo
non e' assoluta ma relativa al "'contenitore" dell'oggetto stesso.
Qualcuno ha qualche idea sul come rilevare questa posizione assoluta ?
Saluti.

Non ho capito bene se non riesci ad identificare gli oggetti nel freme,
oppure li identifichi ma ti sbagli nella visualizzazione del tooltip.
Nel secondo caso potresti sfruttare le coordinate assolute del mouse.
Mentre nel primo dovrebbe bastare l'evento MouseMove dell'oggetto per
sapere di che si tratta, e quindi le coordinate del mouse per
visualizzare il tooltip.
Le coordinate assolute del mouse le puoi ricavi con le api:
Public Type POINTAPI
        x As Long
        y As Long
End Type
Public Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos"
(lpPoint As POINTAPI) As Long
Public Declare Function SetCursorPos Lib "user32" Alias "SetCursorPos"
(ByVal x As Long, ByVal y As Long) As Long
Spero di esserti stato d'aiuto.
Ciao
:-) Hd (-:

Si e' vero che potrei sfruttare le coordinate assolute del mouse, ma
l'ocx lavora anche con il focus sull'oggetto, cioe' spostandosi tra i
vari textboxes della form con il tab appare il tooltip relativo.
Quindi non opero con il puntatore del mouse che in quel mentre puo'
essere altrove.
Gli oggetti nel frame sono ben identificati, sono le loro proprieta'
TOP e LEFT che sono sfalsate in quanto sono riferiti alla posizione
che hanno rispetto al bordo del frame e non alla a quella dell'oggetto
sulla form.
Ripeto l'esempio ; Se in una form pongo in basso a destra un frame e
nel frame metto un textbox vicino ai bordi del frame, tale oggetto
avra' LEFT e TOP vicini allo 0, come se fossero posizionati in alto a
sinistra nella form.
Ho bisogno pertanto di capire dove questi stiano veramente.



Devi unire a quanto ti ha detto HD questa considerazione, per il SO windows
una textbox non e' niente altro che una finestra, ovvero..... molti dei
controlli che comunemente usiamo in VB sono trattati dal SO come finestre!!
( sottolineo MOLTI e non TUTTI !!!!!!)
Detto questo :
Type Rect
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type
Declare Function GetWindowRect Lib "user32.dll" (ByVal hwnd As Long, lpRect
As Rect) As Long
Private Sub Command1_Click()
        Dim tRect As Rect
        Dim lRetVal As Long
        lRetVal = GetWindowRect(Text1.hwnd, tRect)
        debug.print  "Right " & tRect.Right
        debug.print "Left  " & tRect.Left
        debug.print "Bottom  " & tRect.Bottom
        debug.print "Top " & tRect.Top
End Sub
Io in questo caso ho usato una TextBox "fissa" ma chiaramente tu adatta tale
codice per costruirti una funzione che ti ritorna le coordinate del
controllo che vuoi passandogli l'Handle del controllo.
Le coordinate come potrai poi notare sono indipendenti al fatto che il
controllo si trovi in un frame o meno.
Fammi sapere come e' andata.
Ciao
Ven.

 Qualcuno ha qualche idea sul come rilevare questa posizione assoluta ?
Un metodo brusco te lo saprei dire :-)
Risali al contenitore primario (probabilmente form) attarverso la proprietà
conteiner.
Esempio logico:
Ciclo:
    guardo il container*NumeroCicli dell'oggetto che mi interessa
    se container è un form allora esco dal ciclo
    se container non è un form allora
         aggiungo ad una variabile (NumeroCicli) uno
         e mi segno da qualche parte Top e Left di questo container
Ripeto il Ciclo
Sommo tutti i top e i left che ho trovato e trovo le posizioni assolute.
Mi spiace di non poter essere più preciso ma l'idea credo sia giusta :-)
Ciao
Daniele
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
---------------------------------------------------------------------------

Qualcuno ha qualche idea sul come rilevare questa posizione assoluta ?
Ti sei risposto da solo, mi sembra: c'è la proprietà Container.
Esempio:
C'è un form, dentro c'è un frame, dentro c'è una label:
Frame1.Top = Pos. del Frame nel Form
Label1.Top = pos. della Label nel Frame
Label1.Container.Top = la posizione del frame nel form
La posizione assoluta della label che ti interessa nel form è quindi:
Label1.Container.Top + Label1.Top :-)
Bye, G.
--
---------------------------------------------
    Le risposte alle tue domande le trovi sul
    Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
---------------------------------------------
Real E-address: 
gaet...@hotmail.com


Si mi pare che la cosa possa funzionare. Ma i valori che mi ritorna
l'API in che unita' di misura sono ??? 
Non sono certo in twips e nemmeno (mi pare) in punti/pollice.


Mi rispondo da solo :-)
per avere le coordinate corrette occorre moltiplicare il valore *
screen.twipsperpixelX oppure Y.


Non mi sono mai chiesto a che servisse la proprieta' Container .....
mi hai illuminato :-)))
Pero' c'e' ancora un punto che non funziona, ovvero se il frame e' a
sua volta contenuto in un altro frame ? 
Ovvero : form, dentro un frame, dentro un frame, dentro una label ?

 Ovvero : form, dentro un frame, dentro un frame, dentro una label ?
Guarda che puoi fare anche:
oggetto.container.container.container.top
Ed è per questo che nel post precedente avevo scritto:
Ciclo:
    guardo il container*NumeroCicli dell'oggetto che mi interessa
    'tradotto sopra sarebbe
    'se ciclo è a 2 allora oggetto.conatiner.container
    se container è un form allora esco dal ciclo
    se container non è un form allora
         aggiungo ad una variabile (NumeroCicli) uno
         e mi segno da qualche parte Top e Left di questo container
Ripeto il Ciclo
Sommo tutti i top e i left che ho trovato e trovo le posizioni assolute.
Cmq la risposta di Ven è sicuramente la migliore :-)
Ciao
Daniele
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
---------------------------------------------------------------------------