Capitolo 12. Classi di Finestre Avanzate



Scaricare 0.85 Mb.
Pagina1/3
22.05.2018
Dimensione del file0.85 Mb.
  1   2   3

Capitolo 12. Classi di Finestre Avanzate


Anche se questo libro non può coprire in dettaglio tutte le classi delle wxWidgets, vale la pena dare uno sguardo ad alcune delle classi della GUI più avanzate che possono contribuire a rendere più interessante l’applicazione. Questo capitolo si occupa dei seguenti argomenti:

  • wxTreeCtrl; un controllo che contribuisce a modellare i dati in modo gerarchico.

  • wxListCtrl; un flessibile controllo per mostrare elenchi di etichette testuali ed icone in diversi stili.

  • wxWizard; una dialog speciale per guidarevi nell’uso di un particolare compito tramite una sequenza di pagine.

  • wxHtmlWindow; un controllo HTML versatilissimo e leggero da usarsi dappertutto dale finestre "About" a quelle di reportistica.

  • wxGrid; a controllo ricco di funzioni per mostrare dati in modo tabellare.

  • wxTaskBarIcon; un modo rapido per consentire agli utenti di accedere alle funzionalità dell’applicazione dalla [system tray] o equivalente.

  • Scriversi i controlli. I passi necessari per costruirsi un "custom control" ben funzionante.

wxTreeCtrl


Un controllo ad albero che presenta le informazioni in una gerarchia, con gli elementi che possono essere espansi o contratti. La Figura 12-1 mostra l’esempio del controllo ad albero [tree] delle wxWidgets, appaiono diversi tipi di stili di font e colori. Ad ogni elemento ci si riferisce col tipo wxTreeItemId ed ha un testo ed opzionalmente un’icona modificabile dinamicamente. Un controllo tree si può creare sia in modalità di selezione sia singola che multipla. Per associare i dati con gli elementi dell’albero, di deriva una classe da wxTree ItemData e si usano wxTreeCtrl::SetItemData e wxTreeCtrl::GetItemData. I dati dell’albero verranno distrutti quando viene distrutto l’elemento o l’albero, in modo che si debba conservare solo un puntatore ai dati reali negli oggetti dei dati degli elementi dell’albero.
Figura 12-1. wxTreeCtrl

Dato che un’applicazione può rilevare un click sulle immagini degli elementi dell’albero, si possono simulare dei controlli nell’albero scambiando le immagini secondo lo stato che si vuole mostrare per quell’elemento. Per esempio, nell’albero [tree] si possono facilmente aggiungere dei check boxes simulati.

Il seguente stralcio di codice mostra come creare una finestra ad albero con i dati degli elementi personalizzati ed una lista di immagini.
#include "wx/treectrl.h"
// Declare a class to hold tree item data

class MyTreeItemData : public wxTreeItemData

{

public:

MyTreeItemData(const wxString& desc) : m_desc(desc) { }
const wxString& GetDesc() const { return m_desc; }
private:

wxString m_desc;

};
// Images for tree items

#include "file.xpm"

#include "folder.xpm"
// Create the tree

wxTreeCtrl* treeCtrl = new wxTreeCtrl(

this, wxID_ANY, wxPoint(0, 0), wxSize(400, 400),

wxTR_HAS_BUTTONS|wxTR_SINGLE);

wxImageList* imageList = new wxImageList(16, 16);

imageList->Add(wxIcon(folder_xpm);

imageList->Add(wxIcon(file_xpm);

treeCtrl->AssignImageList(imageList);
// Create a root showing the folder icon, and two items showing

// the file icon

wxTreeItemId rootId = treeCtrl->AddRoot(wxT("Root"), 0, 0,

new MyTreeItemData(wxT("Root item")));

wxTreeItemId itemId1 = treeCtrl->AppendItem(rootId,

wxT("File 1"), 1, 1,

new MyTreeItemData(wxT("File item 1")));

wxTreeItemId itemId2 = treeCtrl->AppendItem(rootId,

wxT("File 2"), 1, 1,

new MyTreeItemData(wxT("File item 2")));



Stili della wxTreeCtrl


La Tabella 12-1 elenca gli stili che si possono passare al costruttore wxTreeCtrl o alla funzione Create; si faccia riferimento anche agli strili disponibili per la wxWindow nella Tabella 4-1.

Tabella 12-1. Stili della Finestra wxTreeCtrl

wxtr_DEFAULT_STYLE

Gli sttili più vicini al defaults per il controllo nativo per un particolare toolkit.

wxtr_EDIT_LABELS

Questo stile si usa se si vuole che l’utente sia in grado di modificare le labels nel controllo tree.

wxtr_NO_BUTTONS

Indica di non disegnare alcun pulsante.

wxtr_HAS_BUTTONS

Con questo stile si mostreremmo dei pulsanti più e meno alla sinistra degli oggetti genitori.

wxTR_NO_LINES

Questo stile si usa per nascondere i connettori di livello verticali.

wxtr_FULL_ROW_HIGHLIGHT

Con questo stile si fa in modo che il colore di sfondo [background] e la selezione evidenziata si estenda per tutta la riga orizzontale della finestra del controllo tree. (Questo stile viene ignorato sotto Windows a meno di non specificare anche wxtr_NO_LINES).

wxtr_LINES_AT_ROOT

Questo stile si usa per mostrare le linee tra i nodi della radice. Applicabile solo se wxtr_HIDE_ROOT è impostato ma non dev’esserlo wxtr_NO_LINES.

wxtr_HIDE_ROOT

Questo stile si usa per evitare che appaia il nodo radice, facendo sì che i nodi del primo livello appaiano come una serie di nodi radice.

wxtr_ROW_LINES

Questo stile si usa per tracciare una bordatura di contrasto tra le righe mostrate.

wxTR_HAS_VARIABLE_ROW_HEIGHT

Questo stile si usa per adeguare le righe alla dimensione del contenuto. Se non impostato, tutte le righe useranno l’altezza della riga maggiore. Il default è che tale stile sia non impostato. Solo per le implementazioni generiche.

wxtr_SINGLE

Indica che si può selezionare un solo elemento per volta. Selezionando un altro elemento farà sì che la selezione corrente, se c’è, venga deselezionata. Questo è il default.

wxtr_MULTIPLE

Questo stile si usa per consentire di poter selezionare una gamma [range] di elementi. Se viene selezionato un secondo gruppo, quello attuale, se c’è, viene deselezionato.

wxtr_EXTENDED

Questo stile si usa per consentire la selezione di elementi disgiunti. (Implementato solo parzialmente)



Eventi di wxTreeCtrl


wxTreeCtrl genera eventi wxTreeEvent, elencati nella Tabella 12-2. Questi eventi si propagano risalendo la gerarchia genitore-figlia della finestra.
Tabella 12-2. Gli eventi wxTreeCtrl


EVT_TREE_BEGIN_DRAG(id, func)

EVT_TREE_BEGIN_RDRAG(id, func)


Generato quando inizia un trascinamento [drag] sinistro o destro. Per i dettagli sulla gestione di questi eventi si veda il Capitolo 11, "Clipboard e Drag and Drop."


EVT_TREE_BEGIN_LABEL_EDIT(id, func)

EVT_TREE_END_LABEL_EDIT(id, func)


Generato quando l'utente inizia o finisce la modifica dell'etichetta di un elemento.

EVT_TREE_DELETE_ITEM(id, func)

Generato quando un elemento viene cancellato.

EVT_TREE_GET_INFO(id, func)

Generato quando si richiedono i dati di un elemento.

EVT_TREE_SET_INFO(id, func)

Generato quando si impostano i dati di un elemento.

EVT_TREE_ITEM_ACTIVATED(id, func)

Generato quando un elemento è stato attivato, vale a dire, scelto con un doppio-click o tramite tastiera. Per esempio, se l'albero rappresenta una gerarchia di file, si può mostrare un'anteprima del file attivato.

EVT_TREE_ITEM_COLLAPSED(id, func)

Generato quando il dato elemento è stato collassato (tutti i suoi figli sono stati nascosti).

EVT_TREE_ITEM_COLLAPSING(id, func)

Generato quando il dato elemento è prossimo ad essere collassato. Tale evento può imporre un veto per evitare un'azione di collassamento.

EVT_TREE_ITEM_EXPANDED(id, func)

Generato quando il dato elemento è stato espanso (tutti i suoi figli sono esposti).

EVT_TREE_ITEM_EXPANDING(id, func)

Generato quando il dato elemento è prossimo all'espansione. Tale evento può imporre un veto per evitare un'azione di espansione.

EVT_TREE_SEL_CHANGED(id, func)

Generato quando si cambia selezione.

EVT_TREE_SEL_CHANGING(id, func)

Generato quando si sta per cambiare selezione. Tale evento può imporre un veto per evitare di selezionare un elemento.

EVT_TREE_KEY_DOWN(id, func)

Usato per rilevare se un tasto è stato premuto.

EVT_TREE_ITEM_GET_TOOLTIP(id, func)

Consente di impostare un tooltip per un particolare elemento; questo è disponibile solo sotto Windows.



Funzioni Membro di wxTreeCtrl


Queste sono le funzioni importanti di wxTreeCtrl.

AddRoot si usa per creare il primo elemento poi si usano AppendItem, InsertItem, o PrependItem per aggiungere gli elementi successivi. Un elemento si rimuove con Delete, tutti gli elementi si eliminano con DeleteAllItems, o si rimuovono tutti i diretti discendenti di un elemento con DeleteChildren.

L'etichetta di un elemento si imposta con SetItemText; l'apparenza di un'etichetta si modifica con SetItemTextColour, SetItemBackgroundColour, SetItemBold, e SetItemFont.

Se si mostrano immagini negli elementi dell'albero, si usa SetImageList o AssignImage List per associare una wxImageList al controllo ad albero. Ciascun elemento può mostrare un'immagine per ciascuno dei possibili stati: wxTreeItemIcon_Normal, wxTreeItemIcon_Selected, wxTreeItemIcon_Expanded, e wxTreeItemIcon_Selected Expanded. Si usa SetItemImage per passare un indice nella lista delle immagini del controllo ad albero ed uno stato opzionale. Se è specificata solo l'immagine per lo stato normale, questa verrà usata anche per gli altri stati.

Un elemento in una vista si scorre con ScrollTo, o si usa EnsureVisible se potrebbe essere necessario espandere gli elementi per mostrare quello desiderato. Expand mostra il figlio di un elemento. Un elemento con figli si compatta con Collapse o CollapseAndReset: quest'ultimo rimuove anche i figli. Questo è utile se si implementa un controllo ad albero con un grandissimo numero di elementi. Si potrebbe voler aggiungere degli elementi solo quando sono visibili―ovvero, quando si processa un evento EVT_TREE_ITEM_EXPANDING. In questo caso, bisognerà usare SetItemHasChildren per restituire l'effetto visivo di un elemento con figli compresso, anche quando non ci sono.

Un elemento si può selezionare o deselezionare con SelectItem. Per un albero a selezione singola, si può prendere l'elemento attualmente selezionato con GetSelection. Se non c'è una selezione, esso restituisce wxTreeItemId, così come una chiamata a wxTreeItemId::IsOk restituisce false. Per un albero a selezione multipla, tutte le selezioni si recuperano con GetSelections passando un riferimento wxArrayTreeItemItemIds alla funzione. Unselect rimuove la selezione corrente per un albero a selezione singola, mentre UnselectAll rimuove tutte le selezioni da un albero a selezione multipla. UnselectItem si può usare in un albero a selezione multipla per deselezionare uno specifico elemento.

Ci sono diversi modi di attraversare un albero: si può cominciare dall'alto con GetrootItem ed iterare tra i figli di un elemento con GetFirstChild e GetNextChild. Si cercano il prossimo o il precedente fratello [sibling] di un elemento con GetNextSibling e GetPrevSibling, si determina se un elemento ha figli con ItemHasChildren, e si prende il genitore di un elemento con GetParent. GetCount restituisce il numero totale di elementi nell'albero, e GetChildrenCount conta il numero di discendenti di un dato elemento.

HitTest è una funzione utile se si implementa il drag and drop―consente di cercare l'oggetto sotto la posizione del mouse, oltre le parti dell'elemento. Si veda il manuale di riferimento per i flags restituiti da HitTest. Si può trovare il rettangolo di contorno di un elemento con GetBoundingRect.

Per ulteriori informazioni su queste funzioni, si veda il manuale di riferimento e l'esempio wxTreeCtrl in samples/treectrl.






Condividi con i tuoi amici:
  1   2   3


©astratto.info 2019
invia messaggio

    Pagina principale