Connessione al database con Visual Basic NET? Lo trovi su Opentraining.it Visual Basic Italia
Guide e Tutorials:indexed
CREARE UNA FORM DA UNA TEXTBOX(Tutorial completo)

Attraverso quest'articolo si dimostrerà come un controllo TextBox sia in realtà (come tutti gli altri) considerato come una finestra e non come un semplice accessorio rispetto ad essa.
Attraverso il seguente codice infatti sarà possibile creare da una semplice TextBox posta sul piano, una vera e propria Form posizionabile a piacimento in fase di esecuzione ma con un'area di spostamento limitata alla Form contenitrice.
Il tutto sfruttando le API GetWindowLong, SetWindowLong e SetWindowPos sul quale non ci si soffermerà più di tanto in quanto trattate singolarmente in altri articoli.
Prima di cominciare è necessario estendere la trattazione a tutti i controlli che supportano hWnd (che come già spiegato è l'handle (of the) Window) e non solo alla costante di Windows WS_CAPTION.
Utilizzando costanti differenti (e combinazioni) di esse è pertanto possibile generare dei risultati differenti. Ad esempio, con il medesimo codice presentato qui sotto, ma con l'utilizzo della costante di sistema WS_THICKFRAME al posto di WS_CAPTION, è facile creare una TextBox ridimensionabile in fase di esecuzione, o quanto meno dotata di un bordo particolarmente gradevole.
Adesso cominciamo però a vedere quali sono le dichiarazioni necessarie per creare una form da un controllo TextBox:

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx _
As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Abbiamo dichiarato queste funzioni come Private e quindi nel modulo di codice di Form1 in quanto il codice non è così lungo e di difficile gestione e perchè utilizziamo solamente questa form.
Ecco di seguito le costanti che c'interessano: SWP_DRAWFRAME, SWP_NOMOVE, SWP_NOSIZE, SWP_NOZORDER e SWP_FLAGS che contiene ognuna delle precedenti ed in più GWL_STYLE che definisce lo stile della finestra (o nel nostro caso della TextBox): Anche le costanti, come le dichiarazioni delle funzioni sono Private:

Private Const SWP_DRAWFRAME As Long = &H20
Private Const SWP_NOMOVE As Long = &H2
Private Const SWP_NOSIZE As Long = &H1
Private Const SWP_NOZORDER As Long = &H4
Private Const SWP_FLAGS As Long = SWP_NOZORDER Or _
SWP_NOSIZE Or SWP_NOMOVE Or SWP_DRAWFRAME
Private Const GWL_STYLE As Long = (-16)

Adesso sarà necessario aggiungere la costante che definisce il nuovo stile della TextBox. E' un parametro puramente associato ad una finestra. Utilizzarlo su un controllo differente da essa provoca una modifica nell'aspetto del controllo. Si può ottenere lo stesso effetto anche ad esempio con una PictureBox:

Private Const WS_CAPTION As Long = &HC00000

Chiudiamo quindi le dichiarazioni generali con un Option Explicit:

Option Explicit

Ora nell'evento Load di Form1 inseriamo il testo della TextBox che sarà la Caption della nuova form:

Private Sub Form_Load()
Text1.Text = "Form 1/2"
End Sub

Inseriamo nel progetto un pulsante e vediamo cosa succede alla sua pressione. In ogni caso il codice dell'evento Click di Command1 può essere trasferito semplicemente nell'evento Load di Form1 in modo che la TextBox prenda l'aspetto di una form non appena l'applicazione viene caricata:

Private Sub Command1_Click()
Dim Stile As Long
Stile = GetWindowLong(Text1.hwnd, GWL_STYLE)
Stile = Stile Or WS_CAPTION
CambiaStile Stile, Text1
End Sub

La seconda riga immagazzina nella variabile 'Stile' gli attributi correnti del controllo, la terza invece modifica lo stile della TextBox in modo che le sia associata la proprietà Caption (impossibile se appunto una TextBox non fosse una sorta di form). La quarta riga effettua in modo effettivo questa modifica di stile richiamando la sottoprocedura CambiaStile, che necessita di due parametri: il nuovo stile ed il controllo sul quale applicarlo, anche se in realtà si poteva fare a meno del secondo parametro in quanto si tratterà soltanto la TextBox.
La sottoprocedura in questione è la seguente:

Private Sub CambiaStile(Stile, Controllo As Control)
If Stile Then
SetWindowLong Controllo.hwnd, GWL_STYLE, Stile
SetWindowPos Controllo.hwnd, Form1.hwnd, 0, 0, 0, 0, SWP_FLAGS
End If
End Sub

E finalmente, dando l'avvio all'applicazione, il risultato sarà quanto segue:


Il codice completo dell'esempio è il seguente:

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx _
As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const SWP_DRAWFRAME As Long = &H20
Private Const SWP_NOMOVE As Long = &H2
Private Const SWP_NOSIZE As Long = &H1
Private Const SWP_NOZORDER As Long = &H4
Private Const SWP_FLAGS As Long = SWP_NOZORDER Or _
SWP_NOSIZE Or SWP_NOMOVE Or SWP_DRAWFRAME
Private Const GWL_STYLE As Long = (-16)
Private Const WS_CAPTION As Long = &HC00000
Option Explicit
Private Sub Form_Load()
Text1.Text = "Form 1/2"
End Sub
Private Sub Command1_Click()
Dim Stile As Long
Stile = GetWindowLong(Text1.hwnd, GWL_STYLE)
Stile = Stile Or WS_CAPTION
CambiaStile Stile, Text1
End Sub
Private Sub CambiaStile(Stile, Controllo As Control)
If Stile Then
SetWindowLong Controllo.hwnd, GWL_STYLE, Stile
SetWindowPos Controllo.hwnd, Form1.hwnd, 0, 0, 0, 0, SWP_FLAGS
End If
End Sub



Archivio:ndexed
Lezioni Commenta questa lezione Invia la tua guida Avviso per le nuove lezioni
Proponi un argomento

Visual Basic Italia© copyright 2000 - tutti i diritti riservati
E-mail:
vbitalia@libero.it