PDA

Visualizza versione completa : ...una bella sfida !


LoryOne
06-11-2002, 13.28.19
Scusate ma il mio problema è:
Come faccio in VB (mi sta bene anche in Delphi o Visual C++) ad impedire che un form, durante il trascinamento, possa essere spostato al di fuori dei limiti dello schermo ?


Chi mi da una mano ?
Grazie a chiunque voglia intervenire.

Ps:Bravo Neddi.

P8257 WebMaster
16-11-2002, 21.18.57
La form può essere spostata solo dall'angolo destro in poi e nella parte inferiore dello schermo.

Hai provato a utilizzare dinamicamente le proprietà di posizionamento?

Bye :cool:

LoryOne
17-11-2002, 16.15.44
Ti ringrazio per la risposta.
A dire il vero ci avevo gia pensato alle proprietà di posizionamento dinamiche del form e avevo pensato anche a come risolvere il problema (di seguito lo spiegerò) ma come al solito mi tocca ricorrere alle API...Già ma quali ?

Per prima cosa, poichè non voglio che il form possa essere spostato fuori dei limiti dello schermo ho bisogno di conoscere quali sono questi limiti.
Cio significa conoscere le coordinate x,y del vertice in alto a destra dello schermo e le coordinate X,Y in basso a sinistra dello schermo.
Le prime due sono senz'altro 0,0 mentre per le altre due si può far riferimento o all'oggetto Screen di VB o alle API.
Personalmente ho preferito le API e precisamente GetWindowsDesktop e GetWindowsRECT
Ricordimaoci che tutto ciò non significa altro che conoscere qual' è la risoluzione video in uso al momento.

Analogamente ho bisogno di conoscere le stesse coordinate per quanto riguarda la form in questione e qui basta GetWindowsRECT

Fin qui niente di strano ma da qui in poi le cose si fanno più complesse.
Mi spiego meglio:
Per poter verificare se in qualsiasi momento, durante lo spostamento del form, quest'ultimo si trova all'interno dell'area (RECT) dello schermo, ho bisogno di conoscere "istantaneamente" qual'è il valore delle coordinate x,y e X,Y del form in funzione del suo spostamento.

La cosa sarebbe facile se VB mi desse la possibilità di monitorizzare tali coordinate al verificarsi dell' evento MOVE del form ma sfortunatamente mamma Microsoft (tristemente conosciuta da qualcuno come Microsozz) non ha contemplato tale evento nel suo glorioso Visual Basic 5.0 Professional Edition.

Mi resta, dunque, una sola possibilità e cioè il subclassing.

Una volta aggiunta la funzione di subclassing nel mio progetto, non mi resta che gestire l'evento adeguato (WM_MOVE oppure WM_MOVING boh, lo andrò a scovare anche se so che da come valore numerico 36 in decimale).

Ok, adesso le cose da qui in poi si fanno più semplici.
A questo punto ho bisogno di una funzione che mi ritorni un valore booleano qualora le coordinate x,y ricadessero all'interno dell'area dello schermo.
Anche qui vengono in aiuto le API con la funzione PtInRECT

In ultimo, metto in AND i valori di ritorno delle funzioni richiamate per le coordinate x,y, e X,Y e se il risultato è false, a quel punto richiamo la funzione mouse_event per simulare il rilascio del pulsante del mouse.

Così facendo, il form rimarrebbe li dov'è in eterno, quindi sarebbe mia cura spostarlo in modo da renderlo completamente visibile dopo la chiamata alla funzione mouse_event

Ecco, io ho pensato di risolvere il problema così.
Tu hai una soluzione migliore ? (con migliore intendo più semplice)
Attendo lumi a riguardo.:) :)