Newsgroup: it.comp.lang.visual-basic
Titolo: problema con ZOrder(forse) dei controlli

ho un campo edit (VB.TextBox) nel form
volevo fare che al passaggio del mouse avesse il bordo 3d normale e quando
il mouse esce il bordo thin (WS_EX_STATICEDGE)
sono riuscito a modificare lo stile con SetWindowLong() e GetWindowLong(),
ma per fare in modo che lo stile sia visibile devo aggiornare il controllo,
con SetWindowPos(), e più esattamente con:
    Call SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, _
    SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOZORDER Or _
    SWP_FRAMECHANGED)
ho fatto il test con due CommandButton ed era tutto ok
quando sono andato a mettere il codice negli eventi MouseMove (del form per
WM_MOUSELEAVE, e dell'editbox per WM_MOUSEHOVER) succede che non riesce a
impostare lo stile al textbox perchè non genera il MouseMove al textbox, a
causa del SetWindowPos() che cambia lo ZOrder o qualcos'altro
come posso fare? sono sicuro al 100% che la causa è quella perchè con i
bottoni funziona tutto
--
ciao
xAERO

 come posso fare? sono sicuro al 100% che la causa č quella perchč con i


 ha scritto

non so se ti puo' servire. ho provato a mettere una matrice di 6 label e una
di 6 txt.
form e label sono backcolor giallo e fore nero, i txt back giallo fore
rosso.
non e' leggerissima, ma non sfarfalla, pero' non ho provato con testi
lunghi:
Option Explicit
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
    Dim j As Integer
    For j = 0 To 5
            Label1(j).BorderStyle = 0
            Label1(j).BackColor = vbYellow
            Label1(j).ForeColor = vbBlack
            Label1(j) = "label1"
            Text1(j).BorderStyle = 0
            Text1(j).BackColor = vbYellow
            Text1(j).ForeColor = vbRed
            Text1(j) = "text1"
    Next
End Sub
Private Sub Label1_MouseMove(Index As Integer, Button As Integer, Shift As
Integer, X As Single, Y As Single)
    Dim j As Integer
    For j = 0 To 5
        If j = Index Then
            Label1(j).BorderStyle = 1
            Label1(j).BackColor = vbBlack
            Label1(j).ForeColor = vbYellow
            Label1(j) = "IN EVIDENZA"
        Else
            Label1(j).BorderStyle = 0
            Label1(j).BackColor = vbYellow
            Label1(j).ForeColor = vbBlack
            Label1(j) = "label1"
        End If
    Next
End Sub
Private Sub Text1_MouseMove(Index As Integer, Button As Integer, Shift As
Integer, X As Single, Y As Single)
    Dim j As Integer
    For j = 0 To 5
        If j = Index Then
            Text1(j).BorderStyle = 1
            Text1(j).BackColor = vbRed
            Text1(j).ForeColor = vbYellow
            Text1(j) = "IN EVIDENZA"
        Else
            Text1(j).BorderStyle = 0
            Text1(j).BackColor = vbYellow
            Text1(j).ForeColor = vbRed
            Text1(j) = "text1"
        End If
    Next
End Sub

ho provato il progetto
funziona e non sfarfalla, ma č perchč bnon usa le API
io per ottere l'effetto bordo static edge (stile esteso WS_EX_STATICEDGE)
devo usare l'api SetWindowLong(), ma se la uso non si aggiorna nulla finchč
non uso pure SetWindowPos e obj.Refresh()
e lo sfarfallěo č causato da questi redraw e refresh dei controlli
grazie lo stesso ;)
--
ciao
xAERO

 causa del SetWindowPos() che cambia lo ZOrder o qualcos'altro
La modifica dello stile del bordo deve essere effettuata solo quando
il mouse entra nella "zona" occupata dal controllo oppure ne esce.
Non certo ad ogni spostamento del mouse.
Usa la funzione SetWindowPos() in questo modo:
Call SetWindowPos(Text1.hWnd, 0, 0, 0, 0, 0, _
        SWP_FRAMECHANGED Or SWP_NOMOVE Or _
        SWP_NOZORDER Or SWP_NOSIZE)