Newsgroup: it.comp.lang.visual-basic
Titolo: Simulazione controllo VC++

Ciao a tutti...
Vorrei sapere se qualcuno sa come si può dar l'effetto "Stati Edge" del VC++
ad un textbox Visual Basic, cè qualche API che permette di farlo?
Grazie
Ale(xand[18])

ad un textbox Visual Basic, cè qualche API che permette di farlo?
c'e' non ce' ;-)
E' un flag di stile esteso:
WS_EX_STATICEDGE 
Creates a window with a three-dimensional border style intended to be used for items 
that do not accept user input. 
Prova un po' a vedere cosa succede con SetWindowLong (per impostare i bit
di stile) e GetWindowLong (per leggerli).
Anzi, qui c'e' un esempio:
Getting the Office Look
http://www.vb-world.net/graphics/tip513.html
-- 
hth, hal

Ti amo ;-)
AHAHAHHAHA
Grazie hal1961
nn c'avevo pensato!
Ale(xand[18])


Chiedo scusa a tutti per l'intrusione .........
Scusami Hal, ma un paio di settimane fa ti ho mandato un file zippato che
riguardava un orologio col quale avevo dei problemi di refresh. Non penso
neanche lontanamente che tu sia obbligato, essendoti reso disponibile, a
darmi per forza un aiuto ..... solo che mi viene il dubbio sul fatto che
potresti non aver ricevuto affatto il mio file. E solo quello che vorrei
sapere.
Detto questo, se non hai tempo, pazienza ...... penso che in un NG dove ci
si scambia esperienze a titolo amichevole non bisogna approfittare della
disponibilità altrui.
Grazie a tutti e di nuovo scusate per l'intrusione.
Ciao, Claudio.

Ciao, Claudio.
ciao, hal

Grazie mille.
Te lo mando tra una mezz'oretta.
Ciao, Claudio.

Claudio,
Ho approfittato dello sciopero generale per dare un' occhiata dopo pranzo
al tuo progettino e rispondo qua affinche' possa essere utile anche ad altri
e spunto per ulteriori suggerimenti.
<ipotesi>
Il codice originario usa un form contenente una PictureBox con una gif
di un orologio, un Timer e tre controlli Line.
Il problema lamentato era il periodico sfarfallio sull' animazione delle lancette.
<codicevb>
VERSION 5.00
Begin VB.Form Form1 
   Caption         =   "Form1"
   ClientHeight    =   5550
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   7260
   LinkTopic       =   "Form1"
   ScaleHeight     =   5550
   ScaleWidth      =   7260
   StartUpPosition =   3  'Windows Default
   Begin VB.Timer Timer1 
      Interval        =   500
      Left            =   6000
      Top             =   2880
   End
   Begin VB.PictureBox Picture1 
      AutoSize        =   -1  'True
      Height          =   2925
      Left            =   1560
      Picture         =   "Form1.frx":0000
      ScaleHeight     =   192
      ScaleMode       =   0  'User
      ScaleWidth      =   192
      TabIndex        =   0
      Top             =   1320
      Width           =   2940
      Begin VB.Line LOra 
         BorderWidth     =   6
         X1              =   96
         X2              =   96
         Y1              =   44.968
         Y2              =   101.998
      End
      Begin VB.Line LSec 
         X1              =   96
         X2              =   96
         Y1              =   95.966
         Y2              =   11.996
      End
      Begin VB.Line LMin 
         BorderWidth     =   4
         X1              =   96
         X2              =   96
         Y1              =   101.998
         Y2              =   24.997
      End
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Private Const GradRad = 3.14159265358979 / 180
Private Const XIora = 0
Private Const YIora = -6
Private Const XFora = 0
Private Const YFora = 49
Private Const XImin = 0
Private Const YImin = -6
Private Const XFmin = 0
Private Const YFmin = 71
Private Const XIsec = 0
Private Const YIsec = 0
Private Const XFsec = 0
Private Const YFsec = 84
Private Sub Timer1_Timer()
    Dim Ora As Long, Min As Long, Sec As Long
    Dim AngoloOra As Double, AngoloMin As Double, AngoloSec As Double
    Dim XINora As Long, YINora As Long, XFNora As Long, YFNora As Long
    Dim XINmin As Long, YINmin As Long, XFNmin As Long, YFNmin As Long
    Dim XINsec As Long, YINsec As Long, XFNsec As Long, YFNsec As Long
    Ora = Hour(Now)
    Min = Minute(Now)
    Sec = Second(Now)
    AngoloSec = (90 - (Sec * 6)) * GradRad
    AngoloMin = (90 - (Min * 6 + 6 * Sec / 60)) * GradRad
    AngoloOra = (90 - (Ora * 30 + 6 * Min / 60)) * GradRad
    XINsec = 96 - (XIsec * Sin(AngoloSec) - YIsec * Cos(AngoloSec))
    YINsec = 96 - (XIsec * Cos(AngoloSec) + YIsec * Sin(AngoloSec))
    XFNsec = 96 - (XFsec * Sin(AngoloSec) - YFsec * Cos(AngoloSec))
    YFNsec = 96 - (XFsec * Cos(AngoloSec) + YFsec * Sin(AngoloSec))
    XINmin = 96 - (XImin * Sin(AngoloMin) - YImin * Cos(AngoloMin))
    YINmin = 96 - (XImin * Cos(AngoloMin) + YImin * Sin(AngoloMin))
    XFNmin = 96 - (XFmin * Sin(AngoloMin) - YFmin * Cos(AngoloMin))
    YFNmin = 96 - (XFmin * Cos(AngoloMin) + YFmin * Sin(AngoloMin))
    XINora = 96 - (XIora * Sin(AngoloOra) - YIora * Cos(AngoloOra))
    YINora = 96 - (XIora * Cos(AngoloOra) + YIora * Sin(AngoloOra))
    XFNora = 96 - (XFora * Sin(AngoloOra) - YFora * Cos(AngoloOra))
    YFNora = 96 - (XFora * Cos(AngoloOra) + YFora * Sin(AngoloOra))
    LSec.X1 = XINsec
    LSec.Y1 = YINsec
    LSec.X2 = XFNsec
    LSec.Y2 = YFNsec
    LMin.X1 = XINmin
    LMin.Y1 = YINmin
    LMin.X2 = XFNmin
    LMin.Y2 = YFNmin
    LOra.X1 = XINora
    LOra.Y1 = YINora
    LOra.X2 = XFNora
    LOra.Y2 = YFNora
End Sub
</codicevb>
</ipotesi>
<tesi>
Una possibile soluzione consiste nell' eliminare la PictureBox ed i controlli Line.
In realta' si potrebbe fare a meno anche del Timer e della gif, ma per adesso
mi sembra accettabile cosi'.
Ho deciso anche di usare solo codice vb, in modo da rendere l' esempio
piu' facile da capire.
Partendo dal codice originario, ho praticato via via varie modifiche, che 
permettessero di:
1. animare le lancette in modo sufficientemente fluido;
2. visualizzarle a dispetto dello sfondo di colorazione sfumata a toni di grigio;
3. riposizionare dinamicamente l' orologio al ridimensionare della maschera.
<codicevb>
VERSION 5.00
Begin VB.Form Form1 
   Caption         =   "Form1"
   ClientHeight    =   4650
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   4650
   LinkTopic       =   "Form1"
   ScaleHeight     =   4650
   ScaleWidth      =   4650
   StartUpPosition =   3  'Windows Default
   Begin VB.Timer Timer1 
      Enabled         =   0   'False
      Interval        =   500
      Left            =   2460
      Top             =   2190
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
'// converte i gradi in radianti
Private Const RADIANT = 3.14159265358979 / 180
'// memorizza le coordinate delle estremita'
'// delle lancette
Private Type tagCoord
    X1      As Single
    X2      As Single
    Y1      As Single
    Y2      As Single
    length  As Single
End Type
Private m_Hrs       As tagCoord
Private m_Min       As tagCoord
Private m_Sec       As tagCoord
'// memorizza la picture dell' orologio
Private m_PicClock  As IPictureDisp
'''''''''''''''''''''''''''''''''
Private Sub Form_Load()
    '// importante: dobbiamo sfruttare l' evento ON_PAINT
    Me.AutoRedraw = False
    '// carica l' immagine dell' orologio ...
    Set m_PicClock = LoadPicture(AddSlash(App.Path) & "Clock.gif")
    '// ... e lo disegna sul form
    DrawClock
    '// attiva il timer
    Me.Timer1.Interval = 1000
    Me.Timer1.Enabled = True
End Sub
Private Sub Form_Paint()
    UpdateClock
End Sub
Private Sub Form_Resize()
    DrawClock
    Me.Refresh
End Sub
Private Sub Form_Unload(Cancel As Integer)
    '// scarica l' immagine
    Set m_PicClock = LoadPicture()
End Sub
Private Sub Timer1_Timer()
    '// aggiorna l' orologio prevenendo eventuali
    '// sovrapposizioni di chiamate
    Static no_Overlap As Boolean
    If no_Overlap Then Exit Sub
    no_Overlap = True
    Me.Refresh
    no_Overlap = False
End Sub
Private Function AddSlash(ByVal a_Src As String) As String
    If Right$(a_Src, 1) = "\" Then
        AddSlash = a_Src
    Else
        AddSlash = a_Src & "\"
    End If
End Function
Private Sub UpdateClock()
    Dim mi_Time As Date
    Dim mi_Angolo As Single
 
    '// legge l' ora una volta sola
    mi_Time = Now
 
    '// imposta la penna
    Me.DrawMode = vbXorPen
    Me.DrawStyle = vbSolid
 
    '// secondi: linea sottile
    Me.DrawWidth = 2
    '// cancella la lancetta dei secondi precedente ridisegnandola
    Me.Line (m_Sec.X1, m_Sec.Y1)-(m_Sec.X2, m_Sec.Y2), vbBlack
 
    '// calcola la nuova estremita' della lancetta dei secondi
    mi_Angolo = (90 - (Second(mi_Time) * 6)) * RADIANT
    m_Sec.X2 = m_Sec.X1 + (m_Sec.length * Cos(mi_Angolo))
    m_Sec.Y2 = m_Sec.Y1 - (m_Sec.length * Sin(mi_Angolo))
    '// disegna i secondi nella nuova posizione
    Me.Line (m_Sec.X1, m_Sec.Y1)-(m_Sec.X2, m_Sec.Y2), vbBlue
 
    '// ore e minuti: linee spesse
    Me.DrawWidth = 4
    '// cancella la lancetta dei minuti precedente ridisegnandola
    Me.Line (m_Min.X1, m_Min.Y1)-(m_Min.X2, m_Min.Y2), vbBlack
    '// calcola la nuova estremita' della lancetta dei minuti
    mi_Angolo = (90 - (Minute(mi_Time) * 6 + 6 * Second(mi_Time) / 60)) * RADIANT
    m_Min.X2 = m_Min.X1 + (m_Min.length * Cos(mi_Angolo))
    m_Min.Y2 = m_Min.Y1 - (m_Min.length * Sin(mi_Angolo))
    '// disegna i minuti nella nuova posizione
    Me.Line (m_Min.X1, m_Min.Y1)-(m_Min.X2, m_Min.Y2), vbGreen
 
    '// cancella la lancetta delle ore precedente ridisegnandola
    Me.DrawWidth = 5
    Me.Line (m_Hrs.X1, m_Hrs.Y1)-(m_Hrs.X2, m_Hrs.Y2), vbBlack
    '// calcola la nuova estremita' della lancetta delle ore
    mi_Angolo = (90 - (Hour(mi_Time) * 30 + 6 * Minute(mi_Time) / 60)) * RADIANT
    m_Hrs.X2 = m_Hrs.X1 + (m_Hrs.length * Cos(mi_Angolo))
    m_Hrs.Y2 = m_Hrs.Y1 - (m_Hrs.length * Sin(mi_Angolo))
    '// disegna le ore nella nuova posizione
    Me.Line (m_Hrs.X1, m_Hrs.Y1)-(m_Hrs.X2, m_Hrs.Y2), vbYellow
End Sub
Private Sub DrawClock()
    Dim w As Single, h As Single
    w = Me.ScaleX(m_PicClock.Width, vbHimetric, Me.ScaleMode)
    h = Me.ScaleY(m_PicClock.Height, vbHimetric, Me.ScaleMode)
    '// qui e' comodo l' autoredraw
    Me.AutoRedraw = True
    Me.Cls
    Me.PaintPicture m_PicClock, (Me.ScaleWidth - w) / 2, _
                                (Me.ScaleHeight - h) / 2, _
                                w, h
    Me.AutoRedraw = False
 
    '// aggiorna le informazioni sulle coordinate delle lancette
    m_Sec.X1 = Me.ScaleWidth / 2
    m_Sec.Y1 = Me.ScaleHeight / 2
    m_Sec.X2 = m_Sec.X1
    m_Sec.length = (h / 2) - 200
    m_Sec.Y2 = m_Sec.Y1 - m_Sec.length
    m_Hrs = m_Sec
    m_Hrs.length = m_Sec.length - 300
    m_Hrs.Y2 = m_Hrs.Y1 - m_Hrs.length
    m_Min = m_Sec
    m_Min.length = m_Sec.length - 100
    m_Min.Y2 = m_Min.Y1 - m_Min.length
End Sub
</codicevb>
</tesi>
-- 
hth, hal

Chiedo scusa a tutti per l'intrusione .........
C@%%0, ho visto solo ora, riordinando per thread, che hai accodato
il post ad un thread che non c' entra un tubo, solo per cercare di farti
notare: scelta inutile, perche' non ordino i messaggi sempre per thread.
NON FARLO MAI PIU'

Ok .... infatti ho più volte chiesto scusa a tutti.
Dici che era meglio fare un messaggio a parte ?
Pensavo fosse lo stesso .......
.....  va bè prossima volta rifletto prima di farmi prendere dalla
disperazione.
Grazie ancora.
Ciao, Claudio.

 mi sembra accettabile cosi'.
in che senso ???

grazie mille .... adesso provo.
Ciao, Claudio.

Pensavo fosse lo stesso .......
Vabbe', e' andata cosi', ci sono cose ben piu' serie nella vita ;-)
-- 
ciao, hal

in che senso ???
Nel senso che:
1- Timer: si puo' evitare anche il controllo Timer ed usare SetTimer
(API) o addirittura mettere tutto in loop nell' evento Paint;
2- gif: potrebbe essere divertente disegnare anche l' orologio via codice vb ;-)
-- 
ciao, hal


wrote:
E c'era bisogno di citare tutto il testo originale?!? :-|
-- 
Visita il sito comune del NG: 
http://www.it-lang-vb.net
Visit: 
http://www.hardwaretips.com

OK !
A proposito ..... adesso č mooooooooooolto piů fluido.
ancora grazie !
Ciao, Claudio.