Newsgroup: it.comp.lang.visual-basic
Titolo: Rimpicciolire una finestra.

Salve!
Ho bisogno di Aiuto.
Il problema è questo: voglio dar la possibilità di ingrandire e 
rimpicciolire la finestra facendo in modo che i controlli al suo interno si 
ingrandiscano e rimpiccioliscano a loro volta in altezza e larghezza. Fino 
a qui tutto OK, ho agito con l'evento Resize del form. (certo che in Delphi 
è tutto molto più semplice!). Vengo al problema: Io non voglio che la 
finestra possa assumere una larghezza minore di 5300 e un altezza minore di 
3300. Ho risolto così:
    	With Form1
        If .Width <= 5300 Then .Width = 5300
        If .Height <= 3300 Then .Height = 3300
    	End With
E fin qui va tutto bene però se l'utente continua a muovere il mouse per 
rimpicciolire la finestra sucede che il refresh della stessa non è 
abbastanza veloce a ingrandirla nuovamente e si vedono dei segni sgraditi 
all'interno. Insomma questo codice è bello in efficenza ma non in bellezza 
visiva.
Avete qualche idea per sopprimere questo inconveniente?
Io una cel'avrei ma non so come metterla in atto: vorrei far si che quando 
l'utente arriva alla grandezza limite della finestra il mouse tornasse ad 
avere la sua forma a freccia e rilasciasse il bordo della stessa.
Aiuto!
GRAZIE!
-- 
WulfMp3
wul...@email.it
"Poni ciò che sei nel minimo che fai."


Cerca nei vecchi post..... (devi usare l'API sendmessage credo)
Ciao
--
Timothy Redaelli
timothy....@email.it

> Chi è Delphicente??????????
Non offendere Delphi! ;)
CiaoZ
SebaMix


la soluzione ottimale (anche se non la più semplice) consiste nel
1) subclassare la form in questione (sul sito comune trovi sicuramente
qualche esempio)
2) intercettare il messaggio WM_GETMINMAXINFO (vedi sull'help del Win32 SDK
maggiori informazioni sull'argomento)
come esempio, puoi prendere l'articolo Q185733 del Ms Knowledge Base "HOWTO:
Limit a Window's Minimum and Maximum Size"
per il resize dei controlli all'interno di una form un po di tempo fa il
(buon) Francesco Balena aveva realizzato qualcosa del genere; prova a dare
un occhio su 
www.vb2themax.com
ciao

Avete qualche idea per sopprimere questo inconveniente?
Il codice che segue è stato scritto da Maro (o almeno questo nome figura tra le proprietà del
progetto): non so chi sia e non so dov'è l'ho prelevato...
'Senza scrivere codice è un po' difficile.
'Si subclassa la form e si intercetta il messaggio WM_GETMINMAXINFO.
'Fai un nuovo progetto con un modulo BAS e una form chiamata frmMain e un
'bottone chiamato btnUnload.
Option Explicit
Type POINTAPI  '  8 Bytes
     x As Long
     y As Long
End Type
Public Type MINMAXINFO  '  4¯ Bytes
    ptReserved As POINTAPI
    ptMaxSize As POINTAPI
    ptMaxPosition As POINTAPI
    ptMinTrackSize As POINTAPI
    ptMaxTrackSize As POINTAPI
End Type
Global g_OldWndProc As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex
As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex
As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long,
ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, Source As Any, ByVal
Length As Long)
Declare Sub CopyMemoryFromPointer Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, ByVal Source As
Long, ByVal Length As Long)
Public Const GWL_WNDPROC = (-4)
Public Const GWL_HINSTANCE = (-6)
Public Const WM_LBUTTONUP = &H202
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_MOUSEMOVE = &H200
Public Const WM_USER = &H400
Public Const CF_BITMAP = 2
'**********************************
'**  Constant Definitions:'Windows eventsPublic
Const WM_NCHITTEST& = &H84
Public Const WM_NCACTIVATE& = &H86
Public Const WM_NCCALCSIZE& = &H83
Public Const WM_NCCREATE& = &H81
Public Const WM_NCDESTROY& = &H82
Public Const WM_NCLBUTTONDBLCLK& = &HA3
Public Const WM_NCLBUTTONDOWN& = &HA1
Public Const WM_NCLBUTTONUP& = &HA2
Public Const WM_NCMBUTTONDBLCLK& = &HA9
Public Const WM_NCMBUTTONDOWN& = &HA7
Public Const WM_NCMBUTTONUP& = &HA8
Public Const WM_NCMOUSEMOVE& = &HA0
Public Const WM_SIZE = &H5
Public Const WM_GETMINMAXINFO = &H24
'**********************************
'**  Constant Definitions:
Public Const HTBORDER& = 18
Public Const HTBOTTOM& = 15
Public Const HTBOTTOMLEFT& = 16
Public Const HTBOTTOMRIGHT& = 17
Public Const HTCAPTION& = 2
Public Const HTCLIENT& = 1
Public Const HTCLOSE& = 20
Public Const HTERROR& = (-2)
Public Const HTGROWBOX& = 4
Public Const HTHELP& = 21
Public Const HTLEFT& = 10
Public Const HTHSCROLL& = 6
Public Const HTMAXBUTTON& = 9
Public Const HTMENU& = 5
Public Const HTMINBUTTON& = 8
Public Const HTNOWHERE& = 0
Public Const HTOBJECT& = 19
Public Const HTREDUCE& = HTMINBUTTON
Public Const HTRIGHT& = 11
Public Const HTSIZE& = HTGROWBOX
Public Const HTSIZEFIRST& = HTLEFT
Public Const HTSIZELAST& = HTBOTTOMRIGHT
Public Const HTSYSMENU& = 3
Public Const HTTOP& = 12
Public Const HTTOPLEFT& = 13
Public Const HTTOPRIGHT& = 14
Public Const HTTRANSPARENT& = (-1)
Public Const HTVSCROLL& = 7
Public Const HTZOOM& = HTMAXBUTTON
Public Const MAX_WIDTH = 400
Public Const MAX_HEIGHT = 300
Public Const MIN_WIDTH = 200
Public Const MIN_HEIGHT = 150
Public Function MakeLong(LoWord As Integer, HiWord As Integer) As Long
  'Combines two integers into a long integer
  MakeLong = LoWord + (65536 * HiWord)
End Function
Function HiWord(dw As Long) As Integer
    If dw And &H80000000 Then
        HiWord = (dw \ 65535) - 1
    Else
        HiWord = dw \ 65535
    End If
End Function
Function LoWord(dw As Long) As Integer
    If dw And &H8000& Then
        LoWord = &H8000 Or (dw And &H7FFF&)
    Else
        LoWord = dw And &HFFFF&
    End If
End Function
Function MyWndProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As
Long) As Long
'// Subclassa la form per interecttare i messaggi
    On Error Resume Next
    Dim retVal As Long
    Dim MinMaxDest As MINMAXINFO
    Dim Mouse_X As Integer             '// Coordinate del mouse
    Dim Mouse_Y As Integer    '// Quale messaggio abbiamo ricevuto?
    Select Case msg
        Case WM_GETMINMAXINFO
            '// lParam contiene un puntatore (cioè un indirizzo di memoria
            '// ad una struttura MINMAXINFO. VB non ha puntatori, quindi
            '// dobbiamo copiare ciò che è contenuto in memoria alla
            '// locazione lParam alla locazione che punta a MinMaxDest
            '// (noi in realtà passiamo l'indirizzo della variabile
            '// MinMaxDest, perché passiamo ByRef -default in VB)
            CopyMemoryFromPointer MinMaxDest, lParam, Len(MinMaxDest)
            '// Ora in x c'è la width massima, e in y la height massima.
            '// Prima li cambiamo, settandoli ai valori che vogliamo.
            MinMaxDest.ptMaxTrackSize.x = MAX_WIDTH
            MinMaxDest.ptMaxTrackSize.y = MAX_HEIGHT
            MinMaxDest.ptMinTrackSize.x = MIN_WIDTH
            MinMaxDest.ptMinTrackSize.y = MIN_HEIGHT
            '// Poi ricopiamo i nuovi valori, cioè la memoria che c'è alla
            '// locazione che punta a MinMaxDest, in lParam. Siccome ilvalore
            '// lParam è già un puntatore, dobbiamo passarlo byval,altrimenti
            '// VB crea un'altra variabile che contiene il numero longlParam
            '// e passa alla funzione l'indirizzo di questa variabile:CRASH!
            CopyMemory ByVal lParam, MinMaxDest, Len(MinMaxDest)
            '// Non passiamo alla window procedure standard.
            retVal = 0
        Case WM_NCHITTEST       '// Qualsiasi azione di mouse
            '// chiamiamo prima la windowProcedure standard, che ci dirà su
            '// quale parte della form si trova il mouse (valore in RetVal)
            retVal = CallWindowProc(g_OldWndProc, hwnd, msg, wParam, lParam)
            '// in lparam ci sono le coordinate del mouse
            Mouse_X = LoWord(lParam)
            Mouse_Y = HiWord(lParam)
            '// Se il mouse è sulla client area, mentiamo a Windows, dicendo
            '// che invece si trova sulla barra del titolo, così Windows
            '// attiverà il Drag automatico. Funziona anche se la finestra
            '// non ha barra del titolo!
            If retVal = HTCLIENT Then       '// azione sulla client area
                retVal = HTCAPTION          '// Dice a Windows che l'azione è avvenuta sulla barra
del titolo.
            End If
        Case Else       '// Altri messaggi che si volessero intercettare
            '// azioni conseguenti. In ogni caso lasciamo processare glialtri
            '// messaggi in maniera standard
            retVal = CallWindowProc(g_OldWndProc, hwnd, msg, wParam, lParam)
    End Select    '// Ritorna retVal
    MyWndProc = retVal
End Function
Nel modulo di form:
Option Explicit
Private Sub command1_Click()
    'Unload Me
    Form_Unload 1
End Sub
Private Sub Form_Load()
    '// Begin the subclassing of frmMain by passing the
    '// address of our new WindowProcedure. SetWindowLong
    '// returns the address of the original WindowProcedure,
    '// so we store it in a global variable to restore
    '// when stopping the subclassing (tipically, in the
    '// Unload event).
    g_OldWndProc = SetWindowLong(frmMain.hwnd, GWL_WNDPROC, AddressOf MyWndProc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
    '// NEVER forget to restore the original WindowProcedure
    '// before unloading the form, Or GPFs will occur.
    Dim Dummy As Long
    Dummy = SetWindowLong(frmMain.hwnd, GWL_WNDPROC, g_OldWndProc)
End Sub
Ciao,
Moreno
#sirri#@#morenosoft#.com
(togliete "#" dall'indirizzo)
Moreno Sirri VB Site - 
http://www.msvbsite.net
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.it-lang-vb.net
---------------------------------------------------------------------------

Io una volta c'ho provato... una volta su 2 il prg si piantava a causa del
subclassing!
CiaoZ
SebaMix

 ha scritto
MAGNANIMO !!!
LEI E' TORNATO !!!
ciao, a.

 subclassing!
non lo metto in dubbio; quando si "gioca" col subclassing (e con i callback
in generale) bisogna essere molto attenti a quello che si sta facendo; cmq
fidati: non č impossibile, anzi!
prova a dare un occhio su 
www.vbaccelerator.com
 , c'č una DLL ActiveX
(completa di sorgenti) che puň essere utilizzata allo scopo senza problemi
(oppure puň servire come fonte di ispirazione per realizzare qualcosa di piů
"custom")
ciao;

 ha scritto nel messaggio
news:9d6jql$gv4uq$1...@ID-51318.news.dfncis.de...

ciao pal,
ebbene si rieccomi quà... ce la farete a liberararvi mai di me?
ciao

Avete qualche idea per sopprimere questo inconveniente?
Secondo me, un modo comodo e' fare questo: nel form_resize metti width
e height in 2 variabili. Poi, nel mouseup, guardi quanto valgono
queste variabili e se sono troppo piccole forzi un resize del form.
Cosi forse hai un side effect, ma se ti si presenta qualche problema,
ne parliamo :)
Saluti.
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 242, 152
  VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
 Opel/ECC Calibrezio EVO-VI --- Kawasaki "Gas Gas" ZZ-R 1100
 ICQ# 36893168 - IRCNet: bugbarbeq, @ on #linux-it & #NetBSD


Per questo ho creato l'ocx che c'è sul sito comune :)
Completo di sorgenti.
In attesa di aggiornamento da parte del WM.
Ciao