Condividi tramite


Esempio CTRLTEST: implementazione di controlli personalizzati

Aggiornamento: novembre 2007

Nell'esempio CTRLTEST vengono illustrate varie tecniche di implementazione e utilizzo dei controlli personalizzati:

  • Implementazione di CParsedEdit, un controllo di modifica specializzato le cui funzionalità sono derivate dalla classe di controlli libreria, e tre metodi di utilizzo dei controlli personalizzati.

  • Utilizzo del controllo casella di selezione. Nel controllo casella di selezione sono disponibili due piccoli pulsanti freccia, verso l'alto e verso il basso, per incrementare o decrementare un valore.

  • Implementazione dei pulsanti bitmap dei comandi del menu Custom utilizzando CBitmapButton.

  • Menu e caselle di riepilogo create dal proprietario (finestra padre). Le classi di controlli corrispondenti, derivate dalla classe CMenu, e CListBox forniscono questa funzionalità in un modo orientato ad oggetti.

  • Utilizzo di file di risorse non gestibili dagli editor di risorse Microsoft Visual C++. Vengono illustrati i vantaggi e gli svantaggi dell'utilizzo di un file RC2 in una finestra di dialogo che contiene un controllo personalizzato con stili definiti da costanti in un file di intestazione.

Tutte le illustrazioni in CTRLTEST vengono avviate mediante comandi di menu.

Nota sulla sicurezza:

Questo esempio di codice viene fornito solo a scopo dimostrativo e non deve essere utilizzato in applicazioni o siti Web, poiché potrebbe non implementare le tecniche migliori a livello di sicurezza. Microsoft esclude ogni responsabilità per danni diretti o indiretti derivanti dall'utilizzo dell'esempio di codice per scopi diversi da quelli previsti.

Per ottenere gli esempi e le istruzioni per l'installazione:

  • In Visual Studio scegliere Esempi dal menu ?.

    Per ulteriori informazioni, vedere Individuazione dei file di esempio.

  • La versione più recente e l'elenco completo degli esempi sono disponibili in linea alla pagina Visual Studio 2008 Samples.

  • È anche possibile trovare gli esempi sul disco rigido del computer. Per impostazione predefinita, gli esempi e il file Leggimi vengono copiati in una cartella nel percorso \Programmi\Visual Studio 9.0\Samples\. Per le versioni Express di Visual Studio, tutti gli esempi sono disponibili in linea.

Generazione ed esecuzione dell'esempio

Per generare ed eseguire l'esempio CTRLTEST

  1. Aprire il file di soluzione Ctrltest.sln.

  2. Scegliere Genera dal menu Genera.

  3. Scegliere Avvia senza eseguire debug dal menu Debug.

Esempio: implementazione e utilizzo di controlli personalizzati

Sebbene sia possibile implementare un controllo personalizzato mediante la derivazione da CWnd, è molto più semplice utilizzare le funzionalità di un controllo Windows standard derivandole dalla relativa classe di controlli nella libreria. In CTRLTEST questa operazione viene eseguita per implementare un controllo di modifica specializzato, CParsedEdit. In questo controllo di modifica è possibile immettere solo determinati insiemi di caratteri: numerici, alfabetici o caratteri non di controllo. CParsedEdit è derivato da CEdit e dispone di un gestore messaggi OnChar per filtrare i caratteri.

Nell'implementazione dei comandi del menu Simple vengono illustrati tre metodi di utilizzo di un controllo personalizzato. I metodi si differenziano per il modo in cui le istanze del controllo nella finestra di dialogo vengono associate dall'applicazione alla classe CParsedEdit. Ciascun comando del menu Slimple consente di visualizzare una finestra di dialogo con quattro istanze del controllo CParsedEdit. I dati immessi nella finestra di dialogo vengono inviati alla porta di debug come output di TRACE. Di seguito vengono illustrati i tre comandi del menu Simple.

Test C++ Derived Class

I controlli CParsedEdit costituiscono membri dati della classe di finestre di dialogo e vengono creati in modo esplicito nella funzione OnInitDialog della finestra di dialogo, mediante la chiamata a CParsedEdit::CreateSet. Vedere Dertest.cpp.

Test WNDCLASS Registered

I controlli CParsedEdit vengono definiti in una risorsa modello di finestra (IDD_WNDCLASS_EDIT) come controlli personalizzati con una classe WNDCLASS identificata come "paredit". Si consiglia di esaminare le proprietà di questi controlli personalizzati utilizzando l'editor finestre di dialogo di Visual C++.

  • Caption blank. Valore iniziale visualizzato nel controllo CParsedEdit.

  • Class:paredit. Nome di WNDCLASS registrato da CParsedEdit::RegisterControlClass in PAREDIT2.CPP, prima che la finestra di dialogo venga chiamata.

  • Visible:checked. Il controllo è visibile.

  • Tabstop:checked. L'utente può spostarsi sul controllo.

  • Style:0x5081002, 0x5081001, 0x5081003, 0x5081ffff per i quattro controlli di modifica analizzati. Lo stile 0x500000 è per WS_CHILD e WS_VISIBLE, lo stile 0x1000 è per WS_TABSTOP. A tutti i controlli personalizzati è associato lo stile WS_CHILD. Gli stili WS_VISIBLE e WS_TABSTOP vengono impostati automaticamente dall'editor finestre di dialogo quando si selezionano gli stili Visible e Tabstop. Lo stile 0x80000 è per WS_BORDER. Poiché nella pagina delle proprietà dell'editor finestre per un controllo personalizzato non vengono offerti tutti gli stili di finestra come WS_BORDER, è necessario cercare la costante in \Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\WINUSER.H. Gli stili 0x0001, 0x0002, 0x0004 e 0x0ffff vengono definiti in PAREDIT.H, rispettivamente, come PES_NUMBERS, PES_LETTERS, PER_OTHERCHARS e PES_ALL.

  • Agli stili esadecimali nella pagina delle proprietà dei controlli personalizzati non è associata alcuna spiegazione. Se si desidera utilizzare gli stili simbolici, come PES_NUMBERS e PES_LETTERS, è possibile modificare manualmente un file di risorse separato, ad esempio RES\Ctrltest.rc2, che viene incluso dal compilatore di risorse in fase di compilazione, ma non viene letto da Visual C++ in fase di modifica. Per un'analisi dei vantaggi e degli svantaggi della modifica manuale di una finestra di dialogo di un controllo personalizzato in un file RC2, vedere Utilizzo di file di risorse non gestibili dagli editor di risorse Visual C++.

Test Dynamic Sbclassed

I controlli vengono definiti in una risorsa modello di finestra di dialogo (IDD_SUB_EDIT in Ctrltest.rc) come controlli di modifica standard. Vengono dichiarati come membri dati CParsedEdit nella classe di finestre di dialogo. La funzione OnInitDialog della finestra di dialogo chiama CParsedEdit::SubClassEdit, che a propria volta chiama CWnd::SubclassDlgItem, per associare ciascuna istanza specifica del controllo di modifica alla classe CParsedEdit. Vedere Paredit.cpp.

Esempio: controllo casella di selezione

Nell'esempio CTRLTEST è inclusa l'implementazione di un controllo casella di selezione. Questo controllo è costituito da due piccoli pulsanti freccia, verso l'alto e verso il basso, per incrementare o decrementare un valore.

Mediante il comando Spin Control viene chiamata una finestra di dialogo in cui sono disponibili quattro controlli CParsedEdit, ciascuno associato a una casella di selezione. I dati immessi nei controlli CParsedEdit in questa finestra di dialogo vengono filtrati in modo da accettare solo valori integer non negativi. È possibile immettere dati numerici digitando il valore nel controllo CParsedEdit oppure utilizzando la casella di selezione associata.

Esempio: pulsante bitmap

L'implementazione dei comandi del menu Custom riportati di seguito consente di illustrare l'utilizzo di CBitmapButton.

  • Bitmap Button 1. Il costruttore di finestre di dialogo carica in modo esplicito le risorse bitmap per ciascuno dei tre stati up (su), down (giù) e focus (attivo) del pulsante chiamando CBitmapButton::LoadBitmaps.

  • Bitmap Button 2. La funzione OnInitDialog della finestra di dialogo chiama CBitmapButton::Autoload per caricare le risorse bitmap in base alla convenzione di denominazione riportata di seguito. Il testo del controllo della finestra costituisce il nome di base delle risorse e le lettere U, D e F vengono aggiunte alla fine, rispettivamente per up, down e focus, per creare i nomi delle risorse per ciascuna delle tre immagini bitmap. Per il pulsante OK, ad esempio, le tre risorse bitmap sono denominate OKU, OKD e OKF.

  • Bitmap Button 3. La finestra di dialogo è un'estensione della seconda finestra di dialogo descritta sopra, che utilizza un quarto pulsante di stato, disabled (disattivato). Per utilizzare questa finestra di dialogo, scegliere il pulsante bitmap di freccia a sinistra o a destra finché non viene visualizzato 1, il numero più basso, oppure 10, il numero più alto. Quando il limite viene raggiunto, il pulsante viene disattivato e viene visualizzata una quarta immagine bitmap. La convenzione di denominazione della risorsa bitmap per lo stato disattivato è un suffisso X, come indicato dai nomi delle risorse PREVX e NEXTX.

Per vari menu e controlli Windows è disponibile una funzionalità di disegno del proprietario che consente alla finestra padre (proprietaria) di eseguire qualsiasi operazione di disegno nell'area client del controllo, diversamente dal comportamento standard di un controllo. Le classi di controlli corrispondenti e la classe CMenu forniscono questa funzionalità in un modo orientato ad oggetti più pratico, poiché il disegno viene gestito dalla classe di menu o di controlli. Tale caratteristica è denominata "disegno automatico".

In CTRLTEST viene illustrata la tecnica generale di disegno personalizzato nell'ambito dell'implementazione dei comandi riportati di seguito nel menu Custom.

  • Custom Menu. Questa voce di menu chiama un menu popup CColorMenu, derivato da CMenu. Ciascuna voce del sottomenu visualizza uno degli otto colori utilizzati dalla funzione di disegno automatico. In una finestra di messaggio viene confermato il colore scelto dal sottomenu.

  • Custom List Box. Questa voce di menu chiama una finestra di dialogo in cui viene visualizzato un CColorListBox, derivato da CListBox. Nella casella di riepilogo sono presenti otto voci, ciascuna disegnata in uno degli otto colori utilizzando la funzionalità di disegno automatico. La selezione effettuata dalla casella di riepilogo viene confermata dall'output di TRACE.

Esempio: utilizzo di file di risorse non gestibili dagli editor di risorse di Visual C++

Il file di risorse CTRLTEST\RES\Ctrltest.rc2 è un esempio di file di risorse non gestibile dagli editor di risorse di Visual C++ in formato leggibile. Se si apre Ctrltest.rc2 in Visual C++ e lo si salva, alcune utili informazioni leggibili verranno perse, anche se il compilatore di risorse sarà ancora in grado di compilare il file RC2 e di produrre un file RES binario equivalente. RES\Ctrltest.rc2, quindi, è stato aggiunto come #include in Ctrltest.rc con una direttiva per la fase di compilazione specificata con il comando Resource File Set Includes.

Di seguito sono riportate tre categorie di informazioni leggibili che non sono gestibili dagli editor di risorse di Visual C++. Due categorie vengono illustrate in Ctrltest.rc2:

  • Simboli di stili di controlli personalizzati. "msctls_updown32", ad esempio, è uno stile definito per il controllo casella di selezione. Sebbene il simbolo venga interpretato correttamente da Visual C++ durante la lettura del file RC2, verrà riscritto da Visual C++ nel file RC2 come valore esadecimale.

  • Simboli di stili di controlli o di Windows WS_ standard utilizzati in un controllo da una classe di controlli Windows standard derivata. ES_AUTOHSCROLL, ad esempio, è definito per il controllo casella di selezione nella finestra di dialogo IDD_SPIN_EDIT. Sebbene i simboli vengano interpretati correttamente da Visual C++ durante la lettura del file RC2, verranno riscritti da Visual C++ nei file RC2 come valore esadecimale.

  • Espressioni aritmetiche nel file RC. Espressioni come "IDC_EDIT1+2" per l'identificazione dei controlli nella finestra di dialogo IDD_SPIN_EDIT verranno riscritte nel file RC2 come un valore esadecimale singolo da Visual C++.

Nell'esempio CTRLTEST vengono illustrati i vantaggi e gli svantaggi dell'utilizzo di un file RC2 nel caso di una finestra di dialogo contenente un controllo personalizzato con stili definiti mediante costanti in un file di intestazione. Entrambe le finestre di dialogo, IDD_WNDCLASS_EDIT e IDD_SPIN_EDIT, dispongono di controlli personalizzati con stili definiti simbolicamente. IDD_WNDCLASS viene tuttavia specificato in un file RC modificabile dall'editor finestre di Visual C++, mentre IDD_SPIN_EDIT viene specificato in un file RC2 modificabile solo manualmente.

Di seguito vengono illustrate le differenze tra l'utilizzo di un file RC e di un file RC2.

Per la finestra di dialogo IDD_WNDCLASS_EDIT, lo script di risorsa viene definito in Ctrltest.rc, mentre per IDD_SPIN_EDIT viene definito in RES\Ctrltest.rc2. Per la finestra di dialogo IDD_WNDCLASS_EDIT, il controllo personalizzato WNDCLASS è "paredit", le costanti di stile vengono definite in PAREDIT.H e una costante di stile di esempio è PES_NUMBER. IDD_WNDCLASS_EDIT è modificabile da Visual C++ ma non è in grado di utilizzare stili #define. IDD_SPIN_EDIT non è modificabile da Visual C++, ma è in grado di utilizzare stili #define.

Il compromesso è che se si utilizza il file RC2, è possibile utilizzare stili simbolici leggibili definiti nel file di intestazione per il controllo personalizzato, ma non è possibile modificare il file con l'editor finestre di Visual C++. È più semplice definire il layout della finestra di dialogo utilizzando Visual C++, anziché scrivere manualmente lo script di risorsa. La creazione manuale di script di risorsa, inoltre, presenta una maggiore probabilità di errori. Tuttavia, è necessario anche considerare che gli stili non forniscono alcuna spiegazione quando vengono visualizzati come valori esadecimali nella pagine delle proprietà dei controlli personalizzati dall'editor finestre di Visual C++.

Parole chiave

Nell'esempio vengono illustrate le seguenti parole chiave:

AfxGetInstanceHandle; AfxMessageBox; AfxThrowResourceException; CBitmapButton::AutoLoad; CDC::FillRect; CDC::FrameRect; CDialog::DoModal; CDialog::EndDialog; CDialog::OnInitDialog; CDialog::OnOK; CDialog::OnSetFont; CEdit::Create; CEdit::SetSel; CFrameWnd::Create; CListBox::AddString; CListBox::CompareItem; CListBox::DrawItem; CListBox::GetItemData; CListBox::MeasureItem; CMenu::AppendMenu; CMenu::CreateMenu; CMenu::Detach; CMenu::DrawItem; CMenu::EnableMenuItem; CMenu::FromHandle; CMenu::GetMenuString; CMenu::MeasureItem; CRect::Width; CStatic::Create; CString::Format; CString::LoadString; CWinApp::InitInstance; CWnd::Attach; CWnd::EnableWindow; CWnd::FromHandle; CWnd::GetDlgCtrlID; CWnd::GetDlgItem; CWnd::GetDlgItemInt; CWnd::GetMenu; CWnd::GetParent; CWnd::GetWindowRect; CWnd::GetWindowText; CWnd::IsWindowEnabled; CWnd::MessageBox; CWnd::OnChar; CWnd::OnCommand; CWnd::OnVScroll; CWnd::PostNcDestroy; CWnd::SendMessage; CWnd::SetDlgItemInt; CWnd::SetFocus; CWnd::SetFont; CWnd::SetWindowPos; CWnd::ShowWindow; CWnd::SubclassDlgItem; CallWindowProc; GetBValue; GetClassInfo; GetGValue; GetRValue; GetSystemMetrics; HIWORD; IsCharAlpha; IsCharAlphaNumeric; LOWORD; MAKEINTRESOURCE; MAKELONG; MessageBeep; ModifyMenu; RGB; RegisterClass; SetWindowLong

Nota:

Alcuni esempi, tra cui il presente, non sono stati cambiati per riflettere le modifiche apportate alle procedure guidate, alle librerie e al compilatore di Visual C++, tuttavia forniscono comunque le istruzioni per completare l'attività desiderata.

Vedere anche

Altre risorse

Esempi relativi ad MFC