Newsgroup: it.comp.lang.visual-basic
Titolo: Resize "artigianale"

Un saluto a tutti
ho cercato di "cimentarmi" nell'argomento "resize". Ho semplicemente
creato un form, ed ho inserito una matrice di textbox (in totale 8).
ho scritto poi il seguente codice:
Dim OldX As Double
Dim OldY As Double
Private Sub Form_Load()
OldX= Form1.Width
OldY = Form1.Height
End Sub
Private Sub Form_Resize()
If OldX > 0 Then ResizingX = ScaleWidth / OldX
If OldY > 0 Then ResizingY = ScaleHeight / OldY
OldX = Form1.ScaleWidth
OldY = Form1.ScaleHeight
For i = Text1.LBound To Text1.UBound
    Text1(i).Visible = False
    Text1(i).Left = Text1(i).Left * ResizingX
    Text1(i).Top = Text1(i).Top * ResizingY
    Text1(i).Width = Text1(i).Width * ResizingX
    Text1(i).Height = Text1(i).Height * ResizingY
    Text1(i).Visible = True
Next i
End Sub
Tutto sembra funzionare regolarmente.
Suppponete pero' di impostare inizialmente il form con le seguenti dim:
form1.width =7000
form1.height= 3200
disponete poi le textbox in due colonne (e 4 righe quindi), con :
text1(0).width= 2652
text1(0).height= 372
text1(0).left= 240
text1(0).top= 120
text1(1).top=720
text1(2).top=1320
text1(3).top=1920
text(4).left=3250
Con queste info dovreste praticamente riprodurre il mio form le texbox
in esso contenute esattamente per come le ho disposte io.
Come vi dicevo il resize sembra funzionare. Il problema si pone quando
riduco notevolmente il form.....per esempio
form1.width=1500
form1.eight=1000
In questa situazione (va be nessuno andra' a visualizzare il form
cosi'.....e' abbastanza piccolo :-) ......magari nessuno si mettera' a
giochicchiare piu' del dovuto.....) i textbox sembrano comportarsi in
maniera "strana" da un punto di vista visivo:
l'altezza dei vari textbox sembra crescere proporzionalmente
text1(0) e text1(4)  che sono sulla stessa riga per esempio hanno
altezza "x"
text1(1) e text1(5)  che sono sulla stessa riga per esempio hanno
altezza "x+qualche cosa"
.......e cosi via
Se ingrandisco nuovamente il form.....purtroppo, visivamente questa
improporzionalita' rimane.
Se avete 30 sec. potete verificare.....e magari darmi qualche
suggerimento? (tenete conto che e' la prima volta che mi cimento con il
"resize"!!!)
ciao
e.

"resize"!!!)
Dovresti impostare le dimensioni minime affinché i controlli non si accavallino. Per bloccare le
dim. minime (e massime), dai un'occhiata sul Sito Comune.
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
---------------------------------------------------------------------------

 e.
prova cosi':
Dim OriginalX As Double
Dim OriginalY As Double
Dim OldX As Double
Dim OldY As Double
Dim TexW As Double
Dim TexH As Double
Private Sub Form_Load()
    OriginalX = Form1.Width
    OriginalY = Form1.Height
    OldX = OriginalX
    OldY = OriginalY
    TexW = Text1(0).Width
    TexH = Text1(0).Height
End Sub
Private Sub Form_Resize()
    For i = Text1.LBound To Text1.UBound
        Text1(i).Visible = False
        Text1(i).Left = Text1(i).Left * Form1.Width / OldX
        Text1(i).Top = Text1(i).Top * Form1.Height / OldY
        Text1(i).Width = TexW * Form1.Width / OriginalX
        Text1(i).Height = TexH * Form1.Height / OriginalY
        Text1(i).Visible = True
    Next i
    OldX = Form1.Width
    OldY = Form1.Height
End Sub
CIAO!

 CIAO!
Ciao,
grazie per la risposta......dunque cosi' funziona meglio pero' se
rimpiciolisco un bel po' (fino a farlo diventare di pochi cm per
intenderci), nel caso in cui ho 8 texbox disposte su due file.....l'ultima
fila scompare.....se diminuisco ancora scompare la penultima e cosi'
via......se riingrandisco e' tutto ok pero'
Pero' rimpicciolendo quasi al max i controlli scompaiono.....
Come posso fare per evitare questa situazione?
ciao e.

 Moreno
Moreno......l'ultimo dei guru che ancora non e' andato in
ferie......meriteresti una birrozza per questo!!!!!!
A parte gli scherzi.....sono andato...quale sezione debbo cercare? Se cerco
con "resize" ottengo 3 risultati....una classe e due ocx.....essenzialmente
io voglio crearlo da solo questo resize (piu' per scopo autodidattico che
per altro....per approfondire un po' la conoscenza di Vb)
Ciao e grazie
e.

 Moreno......l'ultimo dei guru
pero' adesso vogliamo vedere il salto dalle montagne rocciose...



Quello che ti posso riconsigliare è di impostare le dimensioni minime del form...
Ti posto di seguito il codice di un programma di esempio scritto da "Maro": non ricordo dove l'ho
prelevato...
(lo ricopio integralmente, inclusi i commenti: non ci sono disclaimer, quindi presumo tu possa
modificarlo liberamente)
Nella form FrmMain aggiungi un Command1:
Nella sezione "Dichiarazioni" della form incolla:
-----------------------------------------------------
-----------------------------------------------------
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
-----------------------------------------------------
-----------------------------------------------------
In un modulo standard, invece, incolla:
-----------------------------------------------------
-----------------------------------------------------
'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
-----------------------------------------------------
-----------------------------------------------------
Ciao,
Moreno
#sirri#@#morenosoft#.com


per altro....per approfondire un po' la conoscenza di Vb)
Beh, didatticamente è senz'altro più interessante la classe, a meno che gli ocx non includano i
sorgenti. Comunque ho visto che hai già risolto...
Ciao,
Moreno
#sirri#@#morenosoft#.com
