Newsgroup: it.comp.lang.visual-basic
Titolo: SetWindowLong e GWL_STYLE

Ciao,
avrei bisogno di modificare lo stile di una TextBox tramite la SetWindowLong.
Pensavo si facesse così, ma non funge..
'Recupero lo stile corrente
Style = GetWindowLong(hwnd, GWL_STYLE)
'Elimino il bordo
Style = Style And (Not WS_BORDER)
'Setto il nuovo stile
Call SetWindowLong(hwnd, GWL_STYLE, Style)
Avreste dei suggerimenti?
Tnx.
LeleB.

 Call SetWindowLong(hwnd, GWL_STYLE, Style)
Premesso che e' molto piu' pratico impostare a 0 (vbNone
o quello che e') la proprieta' Borderstyle del textbox,
i problemi qui in realta' sono due.
In primo luogo il bit di stile WS_BORDER non viene applicato al
controllo Edit perche' e' una finestra child, bensi' si tratta
del bit WS_EX_CLIENTEDGE dello stile esteso (GWL_EXSTYLE)
Quindi il codice sopra diventa:
Dim style As Long
'Recupero lo stile corrente
style = GetWindowLong(Text1.hwnd, GWL_EXSTYLE)
'Elimino il bordo
style = style And Not WS_EX_CLIENTEDGE 'Or WS_EX_STATICEDGE per il look
Office 2000
'Setto il nuovo stile
Call SetWindowLong(Text1.hwnd, GWL_EXSTYLE, style)
Ma non e' finita qui...
Non so perche', ma visual basic non reagisce minimamente a questa
impostazione, e va forzato il ridisegno del controllo simulando
uno spostamento:
SetWindowPos Text1.hwnd, 0, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or _
                 SWP_NOOWNERZORDER Or SWP_NOZORDER Or SWP_FRAMECHANGED
Adesso si' che ti dovrebbe andare.
-- 
hth, hal
scritto da linux con slrn e vi :-)

 o quello che e') la proprieta' Borderstyle del textbox,
Lo so! Ma io devo cambiare lo stile nella WindowProc sull'intercettazione dei messaggi
WM_MOUSELEAVE e WM_MOUSEHOVER dove, a disposizione ho solo l'handle.
All'inizio l' avevo implementata così (da pazzi):
For i = 0 To frmMenu.txtMenu.Count - 1
     If hwnd = frmMenu.txtMenu(i).hwnd Then
         'Il messaggio arriva da una label del form menu
         frmMenu.txtMenu(i).Font.Underline = False
         frmMenu.txtMenu(i).ForeColor = &HC00000
         frmMenu.ImgMenu(i).BorderStyle = 0
         WindowProc = DefWindowProc(hwnd, uMsg, wParam, lParam)
         Exit Function
     End If
Next
Dove ogni volta cercavo quale TB aveva generato il messaggio.
Ora, mi hanno suggerito di fare così:
- Prima del subclass memorizzo il puntatore alla TB
RetVal = SetProp(txtMenu(i).hwnd, "TBPtr", ObjPtr(txtMenu(i)))
- Poi, nell'intercettazione del messaggio, recupero il puntatore così ho a disposizione un 
oggetto TB.
WM_MOUSELEAVE
'Recupero il nome della classe
lpClassName = space(50)
RetVal = GetClassName(hwnd, lpClassName, 50)
If InStr(1, lpClassName, "TextBox") Then
     'E' una text box
     'Recupero la proprietà
     RetVal = GetProp(hwnd, "TBPtr")
     If RetVal <> 0 Then
         With TextBoxFromPointer(RetVal)
             .Font.Underline = False
             .ForeColor = &HC00000
             .BorderStyle = 0
         End With
     End If
     WindowProc = DefWindowProc(hwnd, uMsg, wParam, lParam)
     Exit Function
End If
Private Function TextBoxFromPointer(ByVal lpTB&) As TextBox
     Dim oTB As TextBox
     CopyMemory oTB, lpTB, 4&
     Set TextBoxFromPointer = oTB
     CopyMemory oTB, 0&, 4&
End Function
Il mio grosso problema è che, in un codice di esempio che ho fatto (dove però non uso il 
subclass) tutto funziona, ma nel mio caso quando viene eseguita la prima CopyMemory VB va 
in crash!!
Sono sul disperato andante.
LeleB.

 in crash!!
Avrai fatto casino tra ByRef e ByVal.
Stai poi attento a riazzerare l'oggetto copiato *prima* che esca dallo
scope, altrimenti
sballa il reference counting e ti arriva un altro crash.
--
ciao, hal
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 sballa il reference counting e ti arriva un altro crash.
Of Course!
Tnx.
LeleB.