Freeteo


Pensieri e C#dice di Matteo Raumer

ComboBox e OwnerDraw: anteprima dei Font a tendina

Una cosa che ho apprezzato programmando per windowsform .net 2.0 è stata l'abilitazione a poter modificare la visualizzazione degli elementi di una ComboBox.
 
Anche se normalmente si lavora con valori stringa che identificano chiaramente la scelta che deve fare l'utente, puo' essere necessario a volte aiutare la scelta con qualcosa di grafico.
Per intenderci quello che fanno tutti gli editor di testo come Word etc...quando si scelgono i colori, i formati dei testi o ancora piu' classico, la lista dei font disponibili.

Questo possiamo farlo anche noi nelle nostre applicazioni Win32, incaricandoci di "disegnare" noi ogni elemento, man mano che viene visualizzato nella tendina di scelta.

Basta solamente settare alla ComboBox la proprieta' "DrawMode" in uno di questi 2 valori:
- DrawMode.OwnerDrawFixed (tutti gli elementi hanno le stesse dimensioni)
- DrawMode.OwnerDrawVariable (possono esserci dimensioni diverse per righe diverse)
ovviamente se lo lasciate com'e' di default "Normal" non scatena l'evento e quindi si comporta come stringa classica...

Impostando uno di questi 2 valori, la combo man mano che disegna gli item, vi da a disposizione un evento "DrawItem" (che ci passa un "DrawItemEventArgs") che permette di andare a gestire il disegno vero e proprio via via di tutti gli elementi (da farsi ovviamente con le classi Drawing) per dare l'aspetto che vi interessa al valore visualizzato.


Tante belle parole ma in pratica, seguiamo un esempio di funzionalita' per capire cosa possiamo fare e soprattutto come farlo. Prendiamo d'esempio la visualizzazione di una combo che contiene la lista dei font:

- impostare il valore "DrawMode" e gestire l'evento:


- impostare la sorgente dati con la lista dei font disponibili:

fontComboBox.DataSource = FontFamily.Families;
fontComboBox.DisplayMember =
"Name";
fontComboBox.ValueMember =
"Name";



- incaricarsi del codice di "disegno dell'elemento" nell'evento che adesso si scatena:

private void fontComboBox_DrawItem(object sender, DrawItemEventArgs e)
{
  //--- codice di sicurezza
  if (e.Index == -1)
     
return

   //--- interazione con il mouse
  
e.DrawBackground();
  
if ((e.State & DrawItemState.Focus) != 0)
      e.DrawFocusRectangle();

   FontFamily family = (sender as ComboBox).Items[e.Index] as FontFamily;
  
string font = family.Name; 

   try {
     e.Graphics.DrawString(font,
new Font(font, 10f), new SolidBrush(e.ForeColor), e.Bounds);
   }
  
catch {
    
//--- nel caso ci fossero problemi lo scrivo in tahoma classico
    
e.Graphics.DrawString(font, new Font("Tahoma", 10f), new SolidBrush(e.ForeColor), e.Bounds);
   }
}



-
ed ecco il risultato:



Se volete avere questo aspetto nelle combo della Toolbar, il concetto è lo stesso, basta solamente impostare le cose da codice, visto che la combo vera e propria viene "wrappata" per farla "compatibile agli elementi della toolbar".Ma basta veramente pochissimo:

....
ComboBox
cmb = fontToolStripComboBox.ComboBox;
cmb.DrawMode =
DrawMode.OwnerDrawFixed;
cmb.DrawItem +=
new DrawItemEventHandler(fontComboBox_DrawItem); // stesso evento di prima
....

(dove "fontToolStripComboBox" è la combo che avete aggiunto nella vostra toolbar)

 

Conclusioni:
Anche se devo dire che per vedere qualcosa di "veramente agile" bisogna aspettare WPF, per il momento mi accontento di questa funzionalita' offerta dal framework che permette di customizzare in maniera "elegante" le nostre applicazioni.
Pensiamo ad esempio alla scelta di un colore, o di un'icona o di qualcosa che accompagnato da qualche aspetto grafico accattivante ci rende piu' piacevole l'interfaccia utente...

Categoria: Tips
venerdì, 10 ago 2007 Ore. 00.12

Messaggi collegati






  • Views Home Page: 248.544
  • Views Posts: 427.060
  • Views Gallerie: 597.109
  • n° Posts: 163
  • n° Commenti: 148
Anno 2014

Anno 2013

Anno 2012

Anno 2011

Anno 2010

Anno 2009

Anno 2008

Anno 2007

Anno 2006

Anno 2005
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003