Newsgroup: it.comp.lang.visual-basic
Titolo: Ridimensionare col mouse form senza bordi

Ciao a tutti,
nel mio programma voglio usare form personalizzate nell'aspetto
(borderstyle = none), e quindi devo gestire a mano il posizionamento
(click+trascina). Per quello nessun problema, difficoltà invece per il
ridimensionamento, perchè se ridimensiono la form in risposta
all'evento MouseMove si genera quello che nell'help chiamano effetto
cascata.. cioè un nuovo evento MouseMove, risultato: la form continua
ad allargarsi (o a stringersi)... (poi chiaramente mi genera un
errore).
Come posso fare?
Grazie in anticipo, Yo{T}a



Giacché suppongo non hai letto i post di ieri, tra i quali avresti trovato la risposta, dai
un'occhiata sul mio sito...
Ciao,
Moreno
#sirri#@#morenosoft#.com
(togliete "#" dall'indirizzo)
Moreno Sirri VB Site - 
http://www.morenosoft.com/MSVBSite/
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
---------------------------------------------------------------------------

 un'occhiata sul mio sito...
Sul sito ho trovato un'interessante modo di gestire lo *spostamento*,
questione che comunque avevo già risolto anche senza ricorrere alle
API.
Il problema riguardava invece, come avevo scritto, il
ridimensionamento,
visto che settando BorderStyle = 0 - None oltre a sparire la barra del
titolo viene meno anche l'angolo in basso-destra della finestra,
quello che
permette di cambiare le dimensioni della finestra. Esiste un message
che
permette di simualare il mousedown non sulla barra dal titolo
nascosta,
bensì sul quell'angolo?

bensì sul quell'angolo?
la prima cosa che mi viene in mente è quella di utilizzare lo stesso sistema che usi per lo
spostamento, però verifichi la posizione del mouse relativa alla form: se è "vicina" ad uno dei
bordi, allori modifichi le dimensioni della form, altrimenti la sposti...
Per modificare la larghezza un'idea (non testata) potrebbe essere:
nuovalarghezza = posizionedelmouse - posizione della form - larghezzaoriginale
Fammi sapere...


 Fammi sapere...
Il problema, come avevo scritto nel primo post, è che se nella routine
di risposta
all'evento MouseMove faccio:
Form.Width = posizionedelmouse - posizione della form -
larghezzaoriginale
viene generato un nuovo evento MouseMove (in pratica è come se
"muovessi" la
form sotto al puntatore), con le conseguenze che ti puoi immaginare...
l'"effetto cascata" di cui parlavo, che un tempo sotto dos sarebbe
finito con un bello
stack overflow :-)
Usando le API, questo si evita, e ho trovato il WM che fa al caso mio:
HTBOTTOMRIGHT.
Come prima, ho usato una label posizionata in basso a destra per
ricevere gli eventi del
mouse. Questo, in una form senza bordi, dovrebbe funzionare
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA"
_
    (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
    ByVal lParam As Long) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Const HTBOTTOMRIGHT = 17
Private Const WM_NCLBUTTONDOWN = &HA1
Dim z As Long
Private Sub Form_Resize()
    lblBottomRight.Left = frmNoBorder.Width - lblBottomRight.Width
    lblBottomRight.Top = frmNoBorder.Height - lblBottomRight.Height
End Sub
Private Sub lblBottomRight_MouseDown(Button As Integer, Shift As
Integer, X As Single, Y As Single)
    If Button = 1 Then
        Dim ReturnVal As Long
        z = ReleaseCapture()
        ReturnVal = SendMessage(hwnd, WM_NCLBUTTONDOWN, HTBOTTOMRIGHT,
0)
    End If
End Sub
Spero che, avendo risolto il mio problema, sia anche stato di
aiuto a qualcun altro. Moreno, se vuoi sei libero di pubblicare la
soluzione
sul tuo sito, anzi mi farebbe piacere :-)
Ciao

Ehi, WM,  la aggiungiamo alle FAQ in costruzione ?
ciao, hal

nuovalarghezza = posizionedelmouse - posizione della form -
larghezzaoriginale
Stavolta riprendo il WM  >:)
La soluzione è la stessa che per la caption: vedi mio post a Cosma


[snap]
La soluzione è la stessa usata da moreno per la caption: cambia solo il
wParam.
Esempio: metti due picture (array di picture) sul form: e copia il codice
qui sotto.
La picture 0 farà da caption, la 1 da "angolino basso dx".
Dai un occhio alle possibilità offerte da WM_NCLBUTTONDOWN.
Ciao
Private Sub Picture1_MouseDown(Index As Integer, Button As Integer, Shift As
Integer, x As Single, y As Single)
    If Button = 1 Then
        Call ReleaseCapture
        If Index = 0 Then
            Call SendMessage(Me.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
        Else
            Call SendMessage(Me.hWnd, WM_NCLBUTTONDOWN, HTBOTTOMRIGHT, 0&)
        End If
    End If
End Sub
Ciao

La soluzione è la stessa che per la caption: vedi mio post a Cosma
1. 
Certo, ma, per chi non conosce la risposta, le domande sono due e non una.
2.
Commercialmente parlando, con la fatica di una, "vendi" due FAQ.
ciao, hal (un po' markettaro)



dal mio errore nella prima risposta si capisce che.... non avevo seguito il thread.... va bene come
scusa? :-)))



Ma dove si trovano 'ste FAQ?
Yo{T}a

sul tuo sito, anzi mi farebbe piacere :-)
Allora copia&incolla nell'ide di VB, salva il progetto, zippalo ed invialo al Sito Comune tramite
l'apposito modulo... ti sei appena registrato, quindi non ho ancora incluso il tuo nick nel db e di
conseguenza non puoi ancora inviare nulla: lo farò prima possibile e poi ti avviso...


Ma dove si trovano 'ste FAQ?
Arriveranno, oh se arriveranno ...
ciao, hal

Ma dove si trovano 'ste FAQ?
Questo newsgroup ha più che delle FAQ... ha un Sito Comune, anzi, _IL_ Sito Comune (visto che ce ne
sono altri nati dopo il successo del nostro... vabbé, ho dovudo dirla, vero Ettore? ;-P)
L'URL la trovi nella firma.
Attualmente sul SitoComune sono raccolti articoli, progetti, programmi, links, recensioni a libri,
il "Progetto Leonardo" (ti consiglio di darci un'occhiata per sapere di che si tratta), ...
I "progetti più piccoli", ovvero quelli che richiedono una trattazione piuttosto breve, verrano
racchiusi in una sezione denominata "FAQ", in fase di sviluppo (che va a prendere il posto di quella
che una volta era la sezione "Piccole Perle").
Dacci un'occhiata: trovarei molte cose utili...


Dacci un'occhiata: trovarei molte cose utili...
Che scemo!!! Se ti sei appena registrato, hai proposto un progetto per la Sezione Leonardo,
evidentemente sai cos'è il Sito COmune ed anche cos'è il progetto Leonardo... :-))))))
Vabbé, piccolo Laptop Freudiano... ;-P
La sommaria descrizione sarà magari servita a qualcuno che leggerà questo thread e che non conosce
il Sito Comune... oppure ho fatto un'altra bianca.... mmm... speriamo la prima... ;-P



ti sei risposto da solo :-)))
Yota