Newsgroup: it.comp.lang.visual-basic
Titolo: [.net] disegnare un rettangolo problema refresh

Ciao a tutti,
dopo tante letture provo a chiedere anche io un aiuto.
Sto provando a creare un componente che, fra le altre cose, deve
disegnare un rettangolo (con relativo bordo colorato) in una posizione
specifica.
Non so se il modo in cui procedo sia corretto, in pratica:
1. creo un panel (a runtime) delle dimensioni del rettangolo e ne setto
il backcolor = al componente che ci sta sotto (una label) (e questo
perchè se imposto il backcolor a trasparent non so perchè ma mi
rimane grigio)
2. disegno il rettangolo con fillRectangle (su myPanel.graphics)
3. disegno il bordo con drawRectangle
Il problema sostanziale è che, scorrendo la form com la scrollbar,
l'aggiornamento del bordo del rettangolo (a parte il flicherio ma non
importa) lo sbaglia (nel senso che se scorro velocemente e mi fermo, il
bordo superiore lo disegna dentro il rettangolo mentre se scorro
lentamente questo non avviene.
Ho provato, nel paint del panel un suspendLayout(), disegno tutto e
resumeLayout() ma la situazione non cambia.
Dove sbaglio?
Consigli su come fare in alternativa?
Grazie a tutti

 lentamente questo non avviene.
Non ho capito cosa succede e cosa dovrebbe succedere.
Ma tu non disegni sul panel?
Qual č lo scopo che devi raggiungere?
Ciao

 Ciao
Sto provando (vb .net 2003), per pura accademia, a creare un componente
che ha una decina di label sparsi per la form, al click di un pulsante
voglio disegnare un rettangolo su una delle label. All'inizio avevo
provato a creare la label sulla form alle coordinate (location e size)
della label in oggetto ma me la disegna sempre dietro e, anche mettendo
la label dietro, non me la faceva vedere.
Ho deciso, quindi, di creare un panel (che setto con bring to front)
che conterrà il rettangolo in questione. Funziona tutto tranne che,
scorrendo velocemente la form con la scroll bar e fermandomi, il bordo
del rettangolo lo disegna DENTRO il rettangolo e non al perimetro
mentre se scorro la form lentamente, questo non succede

 mentre se scorro la form lentamente, questo non succede
Bisognerebbe vedere il codice e cosa succede, perchè non è per niente chiaro 
cosa vuoi fare e cosa invece ottieni.
Forse ti conviene disegnare sia il rettangolo che il testo sul panel e usare 
questo al posto delle label.
Ciao

eheh, lo so, mi sono spiegato male. Il codice lo posso postare solo
stasera, quando torno a casa quindi provo a spiegarti io:
ho una form con 10 label e un bottone.
Cliccando il bottone voglio disegnare un rettangolo con bordo colorato,
sopra una di queste label
Io ho fatto così:
1. individuo la location e size della label su cui voglio disegnare il
rettangolo
2. creo un panel a runtime con location e size uguali alla label di cui
al punto 1.
3. disegno il rettangolo (con fillRectangle e drawRectangle) su tutto
il panel (location e size del panel)
Finito.
Mi succede, però, che se scorro la form (perchè è più larga dello
schermo) velocemente, il paint del rettangolo mi sballa perchè il
bordo me lo disegna dentro il rettangolo stesso (e non nel perimetro)
mentre, se scorro la form lentamente, il bordo è sempre sul perimetro
del rettangolo.
Sembra un problema di refresh del rettangolo, boh
Domanda: esiste un modo per ridisegnare il panel (e il rettangolo in
esso contenuto) quando FINISCE lo scroll della form?

 esso contenuto) quando FINISCE lo scroll della form?
Prova a fare cosģ:
Fai un nuovo UserControl e ci metti 'sta roba
Questo usercontrol simula una label che quando prende in focus o quando 
imposti la proprietą Selected viene bordata in blu.
Sostituisci le label nel form con questo che fai prima.
Ciao
Dim _selected As Boolean = False
Public Property Selected() As Boolean
Get
Return _selected
End Get
Set(ByVal value As Boolean)
_selected = value
End Set
End Property
<System.ComponentModel.Browsable(True)> _
<System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Visible)> 
_
Public Overrides Property Text() As String
Get
Return MyBase.Text
End Get
Set(ByVal value As String)
MyBase.Text = value
End Set
End Property
Private Sub UserControl1_GotFocus(ByVal sender As Object, ByVal e As 
System.EventArgs) Handles Me.GotFocus
_selected = True
Me.Invalidate()
End Sub
Private Sub UserControl1_LostFocus(ByVal sender As Object, ByVal e As 
System.EventArgs) Handles Me.LostFocus
_selected = False
Me.Invalidate()
End Sub
Private Sub UserControl1_Paint(ByVal sender As System.Object, ByVal e As 
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim brush As New SolidBrush(Me.ForeColor)
e.Graphics.DrawString(Me.Text, Me.Font, brush, New Rectangle(0, 0, Me.Width, 
Me.Height))
brush.Dispose()
If (_selected) Then
Dim r As New Rectangle(0, 0, Me.Width - 1, Me.Height - 1)
e.Graphics.DrawRectangle(Pens.Blue, r)
End If
End Sub

 End Sub
ok, ci provo, ti ringrazio


in tutte le sub con handles me. non mi riconosce me ma accetta solo
myBase
Scusami, abbi pazienza

 myBase
Ok, va bene anche MyBase
Ciao 

perfetto, ti ringrazio ancora.
Avevo scaricato vb2005 express ma la sua installazione richiede che
prima rimuova vs 2003 e sql server express. Ho altri progetti in corso
e, sinceramente, preferisco non impelagarmi in questi passaggi.
Ma non è possibile installarlo senza disinstallare vs 2003 e sql
server express?

 server express?
Certo che è possibile, io ho installato vs.2003 tempo fa, recentemente 
ho installato vs.2005 express e non mi ha dato nessun problema.
I due programmi sono ancora perfettamente funzionanti.
Christian

 Christian
vero che possono convivere ma a te non ha chiesto di disinstallare
prima vs2003?
Strano davvero.
Magari posso provare (per quanto attiene a sqlserver express) ad
arrestare il suo servizio prima di installare.

 arrestare il suo servizio prima di installare.
SqlExpress non è un requisito fondamentale, puoi decidere di non 
installarlo.
Io ho VB6, VS2003, VS2005, C#Express, SqlServer2000 e SqlExpress sulla 
stessa macchina senza nessun problema, e nessuno chiede di disinstallare la 
ver. precedente.
Ciao 

 Strano davvero.
Confermo: al momento dell'installazione di vs.2005 non mi ha chiesto di 
disinstallare vs.2003
Christian