Controlli personalizzati
Questa sezione contiene informazioni sui controlli definiti dall'applicazione o personalizzati.
Vengono illustrati gli argomenti seguenti.
- Creazione di controlli disegnati dal proprietario
- Sottoclassazione della classe Window di un controllo esistente
- Implementazione di una classe finestra definita dall'applicazione
- Invio di notifiche da un controllo
- Accessibilità
- Argomenti correlati
Creazione di controlli disegnati dal proprietario
Pulsanti, menu, controlli di testo statici, caselle di riepilogo e caselle combinate possono essere creati con un flag di stile disegnato dal proprietario. Quando un controllo ha lo stile disegnato dal proprietario, il sistema gestisce l'interazione dell'utente con il controllo come di consueto, eseguendo attività quali il rilevamento quando un utente ha scelto un pulsante e notificando al proprietario dell'evento il pulsante. Tuttavia, poiché il controllo viene disegnato dal proprietario, la finestra padre del controllo è responsabile dell'aspetto visivo del controllo. La finestra padre riceve un messaggio ogni volta che il controllo deve essere disegnato.
Per i pulsanti e i controlli di testo statici, lo stile disegnato dal proprietario influisce sul modo in cui il sistema disegna l'intero controllo. Per caselle di riepilogo e caselle combinate, la finestra padre disegna gli elementi all'interno del controllo e il controllo disegna il proprio contorno. Ad esempio, un'applicazione può personalizzare una casella di riepilogo in modo che visualizzi una piccola bitmap accanto a ogni elemento dell'elenco.
Il codice di esempio seguente illustra come creare un controllo testo statico disegnato dal proprietario. Si supponga che Unicode sia definito.
// g_myStatic is a global HWND variable.
g_myStatic = CreateWindowEx(0, L"STATIC", L"Some static text",
WS_CHILD | WS_VISIBLE | SS_OWNERDRAW,
25, 125, 150, 20, hDlg, 0, 0, 0);
Nell'esempio seguente, dalla routine della finestra per la finestra di dialogo contenente il controllo creato nell'esempio precedente, il messaggio WM_DRAWITEM viene gestito visualizzando il testo in un colore personalizzato, utilizzando il tipo di carattere predefinito. Si noti che non è necessario chiamare BeginPaint e EndPaint durante la gestione di WM_DRAWITEM.
case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)lParam;
if (pDIS->hwndItem == g_myStatic)
{
SetTextColor(pDIS->hDC, RGB(100, 0, 100));
WCHAR staticText[99];
int len = SendMessage(myStatic, WM_GETTEXT,
ARRAYSIZE(staticText), (LPARAM)staticText);
TextOut(pDIS->hDC, pDIS->rcItem.left, pDIS->rcItem.top, staticText, len);
}
return TRUE;
}
Per altre informazioni sui controlli disegnati dal proprietario, vedere Creazione di una casella di riepilogo disegnata dal proprietario e caselle combinate disegnate dal proprietario.
Sottoclassazione della classe Window di un controllo esistente
La sottoclasse di un controllo esistente è un altro modo per creare un controllo personalizzato. La routine della sottoclasse può modificare i comportamenti selezionati del controllo elaborando i messaggi che influiscono sui comportamenti selezionati. Tutti gli altri messaggi passano alla routine della finestra originale per il controllo . Ad esempio, un'applicazione può visualizzare una piccola bitmap accanto al testo in un controllo di modifica a riga singola di sola lettura sottoclassando il controllo ed elaborando il messaggio di WM_PAINT . Per altre informazioni, vedere About Window Procedures and Subclassing Controls.For more information, see About Window Procedures and Subclassing Controls.
Implementazione di una classe finestra definita dall'applicazione
Per creare un controllo che non si basa in modo esplicito su un controllo esistente, l'applicazione deve creare e registrare una classe finestra. Il processo di registrazione di una classe di finestra definita dall'applicazione per un controllo personalizzato equivale alla registrazione di una classe per una finestra normale. Per creare un controllo personalizzato, specificare il nome della classe window nella funzione CreateWindowEx o in un modello di finestra di dialogo. Ogni classe deve avere un nome univoco, una routine finestra corrispondente e altre informazioni.
Come minimo, la routine della finestra disegna il controllo. Se un'applicazione usa il controllo per consentire alle informazioni sul tipo di utente, la routine della finestra elabora anche i messaggi di input dalla tastiera e dal mouse e invia messaggi di notifica alla finestra padre. Inoltre, se il controllo supporta i messaggi di controllo, la routine finestra elabora i messaggi inviati dalla finestra padre o da altre finestre. Ad esempio, i controlli elaborano spesso il messaggio WM_GETDLGCODE inviato dalle finestre di dialogo per indirizzare una finestra di dialogo per elaborare l'input della tastiera in un determinato modo.
La routine della finestra per un controllo definito dall'applicazione deve elaborare qualsiasi messaggio di controllo predefinito nella tabella seguente se il messaggio influisce sull'operazione del controllo.
Message | Recommendation |
---|---|
WM_GETDLGCODE | Elaborare se il controllo utilizza i tasti di direzione INVIO, ESC, TAB o freccia. La funzione IsDialogMessage invia questo messaggio ai controlli in una finestra di dialogo per determinare se elaborare le chiavi o passarle al controllo. |
WM_GETFONT | Elaborare se viene elaborato anche il messaggio WM_edizione Standard TFONT. |
WM_GETTEXT | Elaborare se il testo del controllo non corrisponde al titolo specificato dalla funzione CreateWindowEx. |
WM_GETTEXTLENGTH | Elaborare se il testo del controllo non corrisponde al titolo specificato dalla funzione CreateWindowEx. |
WM_KILLFOCUS | Elaborare se il controllo visualizza un cursore, un rettangolo di stato attivo o un altro elemento per indicare che ha lo stato attivo per l'input. |
WM_edizione Standard TFOCUS | Elaborare se il controllo visualizza un cursore, un rettangolo di stato attivo o un altro elemento per indicare che ha lo stato attivo per l'input. |
WM_edizione Standard TTEXT | Elaborare se il testo del controllo non corrisponde al titolo specificato dalla funzione CreateWindowEx. |
WM_edizione Standard TFONT | Elaborare se il controllo visualizza testo. Il sistema invia questo messaggio durante la creazione di una finestra di dialogo con lo stile DS_edizione Standard TFONT. |
I messaggi di controllo definiti dall'applicazione sono specifici del controllo specificato e devono essere inviati in modo esplicito al controllo tramite una funzione SendMessage o SendDlgItemMessage. Il valore numerico per ogni messaggio deve essere univoco e non deve essere in conflitto con i valori di altri messaggi della finestra. Per assicurarsi che i valori dei messaggi definiti dall'applicazione non siano in conflitto, un'applicazione deve creare ogni valore aggiungendo un numero univoco al valore WM_Uedizione Standard R.
Invio di notifiche da un controllo
I controlli personalizzati potrebbero essere necessari per inviare notifiche di eventi alla finestra padre in modo che l'applicazione host possa rispondere a questi eventi. Ad esempio, una visualizzazione elenco personalizzata potrebbe inviare una notifica quando l'utente seleziona un elemento e un'altra notifica quando si fa doppio clic su un elemento.
Le notifiche vengono inviate come messaggi di WM_COMMAND o WM_NOTIFY. WM_NOTIFY messaggi contengono più informazioni di WM_COMMAND messaggi.
L'identificatore del controllo è un numero univoco usato dall'applicazione per identificare il controllo che invia il messaggio. L'applicazione imposta l'identificatore di un controllo quando crea il controllo. L'applicazione specifica l'identificatore nel parametro hMenu della funzione CreateWindowEx o nel membro ID della struttura DL GESTISCIMTEMPLAT edizione Enterprise X.
Poiché il controllo stesso non imposta l'identificatore del controllo, il controllo deve recuperare l'identificatore prima di poter inviare messaggi di notifica. Un controllo deve utilizzare la funzione GetDlgCtrlID per recuperare il proprio identificatore di controllo. Anche se l'identificatore del controllo viene specificato come handle di menu al momento della creazione del controllo, la funzione GetMenu non può essere utilizzata per recuperare l'identificatore. In alternativa, un controllo può recuperare l'identificatore dal membro hMenu nella struttura CREATESTRUCT durante l'elaborazione del messaggio WM_CREATE.
Gli esempi seguenti, dove hwndControl è l'handle della finestra di controllo e CN_VALUECHANGED è una definizione di notifica personalizzata, mostrano i due modi per inviare una notifica specifica del controllo.
// Send as WM_COMMAND.
SendMessage(GetParent(hwndControl),
WM_COMMAND,
MAKEWPARAM(GetDlgCtrlID(hwndControl), CN_VALUECHANGED),
(LPARAM)hwndControl);
// Send as WM_NOTIFY.
NMHDR nmh;
nmh.code = CN_VALUECHANGED;
nmh.idFrom = GetDlgCtrlID(hwndControl);
nmh.hwndFrom = hwndControl;
SendMessage(GetParent(hwndControl),
WM_NOTIFY,
(WPARAM)hwndControl,
(LPARAM)&nmh);
Si noti che la struttura NMHDR può far parte di una struttura più grande definita dal controllo che contiene informazioni aggiuntive. Nell'esempio i valori precedenti e nuovi del controllo potrebbero essere contenuti in questa struttura. (Tali strutture estese vengono usate con molte notifiche standard; ad esempio, vedere LVN_INedizione Standard RTITEM, che usa la struttura NMLISTVIEW.
Accessibilità
Tutti i controlli comuni supportano Microsoft Active Accessibility (MSAA), che consente l'accesso a livello di codice da applicazioni di tecnologia accessibile, ad esempio le utilità per la lettura dello schermo. MSAA consente inoltre Automazione interfaccia utente, una tecnologia più recente, per interagire con i controlli.
I controlli personalizzati devono implementare l'interfaccia IAccessible (per supportare MSAA) o le interfacce Automazione interfaccia utente o entrambe. In caso contrario, i prodotti a tecnologia accessibile potranno ottenere solo informazioni molto limitate sulla finestra di controllo, non avranno accesso alle proprietà del controllo e non potranno attivare eventi nel controllo.
Per altre informazioni su come rendere accessibile il controllo, vedere API di Automazione di Windows.
Argomenti correlati
-
Concettuale
-
Personalizzazione dell'aspetto di un controllo tramite disegno personalizzato
-
Uso degli stili di visualizzazione con controlli disegnati dal proprietario