42 messaggi dal 08 febbraio 2002
Ciao a tutti,
Sto creando un programma che contiene un calendario mensile e, siccome il rollover sulle caselle che identificano un giorno, provoca un brutto effetto per il quale si vedono i contorni delle label del nome del giorno della settimana (lunedi, martedi ecc...) e del giorno del mese, avevo deciso di crearmi un' immagine "ad hoc" per ogni giorno, usando la libreria System.Drawing renderizzando sull' immagine di background queste due informazioni. Ho provato con :

private void CalendarDay_Load(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
Font f = new Font("Verdana",10, FontStyle.Italic);
g.DrawString("lunedi",f,Brushes.Black,10,10);
g.Dispose();
}

ma non ha causato nessun effetto di sorta. Ho provato a mettere questo codice anche nel costruttore ma non è cambiato niente. L' unica volta che sono riuscito a scrivere qualcosa è stato mettendo il codice nell' handler di un pulsante (quindi quando il controllo è stato gia caricato). A me però servirebbe inizializzare il controllo con quei valori. C'è un particolare evento che posso utilizzare o sto sbagliando qualcosa ?

Grazie in anticipo
194 messaggi dal 13 dicembre 2005
A quanto vedo hai messo il codice nel load mentre, secondo me dovresti metterlo nel momento in cui viene disegnato il form; credo Paint....
non ne sono sicura ma prova...
42 messaggi dal 08 febbraio 2002
Grazie ! Adesso funziona perfettamente ...
Ciao
42 messaggi dal 08 febbraio 2002
Scusate ma ho avuto un'altra "anomalìa" nello sviluppare il controllo:

Ho un costruttore del controllo "ListHeader" che accetta una stringa e la mette nella proprietà "HeadTitle". Dalla form principale richiamo :

private void DisposeFile()
{
this.pnlCalendar.Controls.Clear();
this.PnlDetail.Controls.Clear();
this.Head = new ListHeader(PerDiemCollection.MonthName + ", " + PerDiemCollection.DYear.ToString());
....
}

public ListHeader(string Header)
{
InitializeComponent();
this.HeadTitle = Header;
}

HeadTitle sarà poi visualizzato sul controllo tramite l'handler:

private void ListHeader_Paint(object sender, PaintEventArgs e)
{
Graphics g = this.CreateGraphics();
Brush b = new LinearGradientBrush(this.ClientRectangle, Color.Lavender, Color.Gray, 90);
g.FillRectangle(b, this.ClientRectangle);
// QUI SCRIVO IL TESTO INCRIMINATO
g.DrawString(this.HeadTitle, new Font("Verdana", 20), Brushes.Black, 0, 0);
g.Dispose();
}


Ma quando debuggo mi sono accorto che la proprietà HeadTitle viene valorizzata correttamente quando esco dalla DisposeFile(), ma nel momento in cui arrivo all'handler ListHeader_Paint essa assume il valore di stringa vuota (!?). Mi sono perso qualcosa ?
194 messaggi dal 13 dicembre 2005
Dovresti mettere dei punti di interruzione in tutte e 3 le funzioni in quanto se il sistema passa prima per Paint la variabile non viene inizializzata poichè viene valorizzata nella ListHeader richiamata dalla DisposeFile.

L'evento Paint viene richiamato ogni qual volta deve essere ridisegnato il form e anche in altre occasioni che non vediamo.

Quello che ti posso consigliare è studiare bene (anche nella guida MSDN) il comportamento di questi eventi altrimenti non ne esci fuori poichè ogni volta che aggiungerai un controllo potresti avere degli effetti collaterali.

Ciao
Laura
42 messaggi dal 08 febbraio 2002
Grazie, ho risolto il problema inserendo il mio UserControl all'interno di un panel.
Adesso non ha più problemi di refresh ... Infatti prima il titolo compariva nel momento che scattava ancora l' evento paint, anche semplicemente passando con una popup sul controllo.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.