Newsgroup: it.comp.lang.visual-basic
Titolo: impostare l'attributo STATIC_EDGE a un textbox

devo togliere tutte le decorazioni a un textbox (il bordo 3d, praticamente)
e impostare l'attributo Static Edge, che č semplicemente un bordo 3d piů
sottile
come fare?
--
ciao
- Xaero -
(sostituisci nospam.x con 
inwind.it
 per rispondere)
"Un'idea che non sia pericolosa non
merita affatto di essere chiamata idea"
                Oscar Wilde

ho trovato la costante, ma con quale api lo imposto?
WS_EX_STATICEDGE = &H20000
ho cercato sull'API-Guide e sull'API ToolShield, ma nada

 ho cercato sull'API-Guide e sull'API ToolShield, ma nada
E' uno degli stili, usato quando viene creata una finestra.
Dovresti trovarlo elencato in riferimento alla funzione
CreateWindowEx().
Per modificare uno stile, devi "sottrarlo agli stili esistenti.
Usa GetWindowLong con indice GWL_EXSTYLE per
recuperare l'elenco (un long, appunto) degli stili.
Poi sottrai allo stack degli stili della Window quello che
vuoi eliminare (sempre che sia presente; meglio testare i bit
prima di fare modifiche):
VecchioStile = GetWindowsLong(hWnd, GWL_EXSTYLE)
NuovoStile = VecchioStile AND WS_EX_STATICEDGE
Poi setti lo stile modificato:
NuovoStile = SetWindowsLong(hWnd, _
                    GWL_EXSTYLE, _
                    NuovoStile)
Non č detto che funzioni.

 Non č detto che funzioni.
infatti non ha funzionato:
Private Sub Form_Load()
   Dim VecchioStile As Long, NuovoStile As Long
   VecchioStile = GetWindowLong(Text1.hwnd, GWL_EXSTYLE)
   NuovoStile = WS_EX_STATICEDGE
   NuovoStile = SetWindowLong(Text1.hwnd, GWL_EXSTYLE, NuovoStile)
End Sub
con CreateWindowEx ho un casino di problemi. Riesco a usare un solo stile
alla volta, e poi ci sono troppe cose da settare (colore di sfondo, font,
ecc..) e tutto in modo non visuale.
qualcuno sa come fare?


     NuovoStile = VecchioStile Or WS_EX_STATICEDGE
Già. Qui si aggiunge, non si toglie.
Grazie della correzione.
Dovrei testare nell'IDE prima di postare.
Comunque mi pare che l'oggetto TextBox non accetti gli stili estesi.

 Comunque mi pare che l'oggetto TextBox non accetti gli stili estesi.
sbagli.
ho visto un programmino che aveva un textbox con questo stile
l'ho aperto con eXescope e ho visto che proprietà erano impostate a quel
textbox


 textbox
Sei sicuro che fosse il "ThunderTextBox" di VB e non un Edit Control
standard di Windows o un altro oggetto ? Quale è il nome della classe ?
Lo dico perché ho provato a togliere lo stile WS_EX_CLIENTEDGE
(che è l'unico stile "EX" del controllo - sempre che sia impostato in
visualizzazione 3D), ma, anche se la classe riporta che lo stile esteso non
è presente, la visualizzazione non cambia.
Aggiungendo lo stile WS_EX_STATICEDGE idem, indipendentemente
dalla modalità (3D o Flat) con cui è stato creato.
Forse con il "Thunder" non è possibile giocare con gli stili estesi.
Prova un po' a verificare.

 textbox
OK, mi rimangio tutto quello che ho detto. Funziona.
Avevo dimenticato un pezzo di codice.
Il semplice refresh non serve a niente. Basta aggiungere, dopo aver
settato lo stile:
    SetWindowPos Text1.hwnd, 0, 0, 0, 0, 0, _
        SWP_FRAMECHANGED Or SWP_NOMOVE Or _
        SWP_NOZORDER Or SWP_NOSIZE

 Nel caso, era invece una critica che facevo a me stesso.
si, scusa... leggo i post di corsa. seguo 4 ng di progr
il resto sta nel prox reply

         SWP_NOZORDER Or SWP_NOSIZE
ok
quindi adesso _l'intero codice_ come risulterebbe?
scusa, ma con tutti i test che abbiamo fatto, il casino che ho cercato di
fare io, ecc non so quale è il codice giusto
thanks!


 fare io, ecc non so quale è il codice giusto
Ricapitolando:
1) La classe "ThunderTextBox" accetta gli stili estesi.
2) Il metodo di settarli è quello indicato in precedenza.
3) Per ottenere il subclassing non è sufficiente effettuare
il refresh del controllo (per qualche motivo non me lo ricordavo).
Occorre invece usare SetWindowPos (ma va! come in C).
Il codice risulta in seguente (aggiungo solo le dichiarazioni nuove)
Public Const WS_EX_CLIENTEDGE = &H200
Public Const WS_EX_STATICEDGE = &H20000
Public Const SWP_FRAMECHANGED = &H20
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOZORDER = &H4
Public Const SWP_NOSIZE = &H1
Public 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
Il "ThunderTextBox", in visualizzazione 3D, ha solo uno stile esteso,
quello del bordo 3D ossia WS_EX_CLIENTEDGE.
In modalità "Flat" il valore degli stili estesi è quindi 0.
Di conseguenza:
    NuovoStile = WS_EX_STATICEDGE
    oppure
    NuovoStile = WS_EX_STATICEDGE Or WS_EX_CLIENTEDGE
    per ottenere il doppio bordo "sunked".
   VecchioStile = SetWindowsLong(Text1.hWnd, _
                          GWL_EXSTYLE, _
                          NuovoStile)
quindi si da una "scossa" alla window con
Call SetWindowPos(Text1.hWnd, 0, 0, 0, 0, 0, _
        SWP_FRAMECHANGED Or SWP_NOMOVE Or _
        SWP_NOZORDER Or SWP_NOSIZE)

> 1) La classe "ThunderTextBox" accetta gli stili estesi.
ah, dimenticavo.
quale è il ThunderTextBox? non è VB.TextBox vero?
quindi non è quello che crei dall'editor visuale...
come lo si crea?

 come lo si crea?
"ThunderTextBox" è il nome della classe dell'oggetto TextBox di VB.
Come per gli altri controlli standard.
Il nome della classe dell'oggetto Form è "ThunderFormDC".
Il Progetto ha classe "ThunderMain" ecc.