Condividi tramite


TN014: controlli personalizzati

Questa nota viene descritto il supporto MFC per i comandi di disegno automatico e personalizzate.Vengono inoltre descritte la creazione di una sottoclasse dinamica e viene descritta la relazione tra gli oggetti di CWnd e HWNDS.

L'applicazione di esempio CTRLTEST MFC viene illustrato come utilizzare molti controlli personalizzati.Vedere il codice sorgente per l'esempio generale In CTRLTEST MFC e la Guida di.

Comandi/menu di disegno del proprietario

Windows fornisce il supporto per i controlli e ai menu di disegno del proprietario tramite i messaggi di windows.La finestra padre del controllo o menu riceve i messaggi e chiama le funzioni nella risposta.È possibile eseguire l'override di queste funzioni per personalizzare l'aspetto e il comportamento del controllo o menu di disegno del proprietario.

MFC supporta direttamente l'Owner Draw con le seguenti funzioni:

È possibile eseguire l'override di queste funzioni nella classe derivata di CWnd per implementare il comportamento personalizzato di disegno.

Questo approccio non punti al codice riutilizzabile.Se si dispone di due controlli simili in due classi diverse di CWnd , è necessario implementare il comportamento del controllo personalizzato in due posizioni.L'architettura MFC-supportata del controllo di disegno automatico risolve il problema.

Comandi e menu di Auto-Tiraggio

MFC fornisce un'implementazione predefinita (in CWnd e le classi di CMenu ) per i messaggi standard di disegno del proprietario.Questa implementazione predefinita decodificherà i parametri di disegno del proprietario e delegherà i messaggi di disegno del proprietario i controlli o il menu.Si tratta di auto-tiraggio perché il codice di disegno è nella classe del controllo o il menu, non nella finestra proprietaria.

Tramite i comandi di auto-tiraggio è possibile compilare le classi di controlli riutilizzabili che utilizzano la semantica di Owner Draw per visualizzare il controllo.Il codice per disegnare il controllo è nella classe del controllo, non il padre.Si tratta di un modo orientato a oggetti per la programmazione di controllo personalizzato.Aggiungere il seguente elenco di funzioni alle classi di auto-tiraggio:

  • Per i pulsanti di auto-tiraggio:

    CButton:DrawItem(LPDRAWITEMSTRUCT);
            // insert code to draw this button
    
  • Per i menu di auto-tiraggio:

    CMenu:MeasureItem(LPMEASUREITEMSTRUCT);
            // insert code to measure the size of an item in this menu
    CMenu:DrawItem(LPDRAWITEMSTRUCT);
            // insert code to draw an item in this menu
    
  • Per le caselle di riepilogo di auto-tiraggio:

    CListBox:MeasureItem(LPMEASUREITEMSTRUCT);
            // insert code to measure the size of an item in this list box
    CListBox:DrawItem(LPDRAWITEMSTRUCT);
            // insert code to draw an item in this list box
    
    CListBox:CompareItem(LPCOMPAREITEMSTRUCT);
            // insert code to compare two items in this list box if LBS_SORT
    CListBox:DeleteItem(LPDELETEITEMSTRUCT);
            // insert code to delete an item from this list box
    
  • Per le caselle combinate di auto-tiraggio:

    CComboBox:MeasureItem(LPMEASUREITEMSTRUCT);
            // insert code to measure the size of an item in this combo box
    CComboBox:DrawItem(LPDRAWITEMSTRUCT);
            // insert code to draw an item in this combo box
    
    CComboBox:CompareItem(LPCOMPAREITEMSTRUCT);
            // insert code to compare two items in this combo box if CBS_SORT
    CComboBox:DeleteItem(LPDELETEITEMSTRUCT);
            // insert code to delete an item from this combo box
    

Per informazioni dettagliate sulle strutture di disegno del proprietario (DRAWITEMSTRUCT, MEASUREITEMSTRUCT, COMPAREITEMSTRUCTe DELETEITEMSTRUCT) vedere la documentazione MFC per CWnd::OnDrawItem, CWnd::OnMeasureItem, CWnd::OnCompareIteme CWnd::OnDeleteItem rispettivamente.

Utilizzo dei controlli e dei menu di auto-tiraggio

Per i menu di auto-tiraggio, è necessario eseguire l'override dei metodi di OnDrawItem di OnMeasureItem .

Per le caselle di riepilogo e caselle combinate di auto-tiraggio, è necessario eseguire l'override di OnMeasureItem e OnDrawItem.È necessario specificare lo stile di LBS_OWNERDRAWVARIABLE per le caselle di riepilogo o lo stile di CBS_OWNERDRAWVARIABLE per le caselle combinate in un modello di finestra di dialogo.Lo stile di OWNERDRAWFIXED non funzionerà con gli elementi di auto-tiraggio poiché l'altezza fisse dell'elemento viene determinata prima che i controlli di auto-tiraggio associati alla casella di riepilogo.(È possibile utilizzare i metodi CListBox::SetItemHeight e CComboBox::SetItemHeight per ovviare a questa limitazione.)

La commutazione a uno stile di OWNERDRAWVARIABLE impone il sistema per applicare lo stile di NOINTEGRALHEIGHT al controllo.Poiché il controllo non potrà calcolare un'altezza integrale con gli elementi di dimensioni variabili, lo stile predefinito di INTEGRALHEIGHT viene ignorato e il controllo è sempre NOINTEGRALHEIGHT.Se gli elementi sono a larghezza fissa, è possibile impedire gli elementi parziali da essere disegnato specificando le dimensioni del controllo per essere moltiplicatore Integer la dimensione elemento.

Per le caselle di riepilogo e caselle combinate di disegno automatico con lo stile di CBS_SORT o di LBS_SORT , è necessario eseguire l'override del metodo di OnCompareItem .

Per le caselle di riepilogo e caselle combinate di disegno automatico, OnDeleteItem non viene in genere eseguito l'override.È possibile eseguire l'override di OnDeleteItem se si desidera eseguire richiede l'elaborazione speciale.Un caso in cui verrebbero appropriato è quando la memoria aggiuntiva o altre risorse viene archiviata con ogni casella di riepilogo o elemento casella combinata.

Esempi di controlli e dei menu di disegno automatico

In generale In CTRLTEST MFC vengono forniti esempi di un menu di auto-tiraggio e una casella di riepilogo di auto-tiraggio.

L'esempio più tipico di un pulsante di disegno automatico è un pulsante bitmap.Un pulsante bitmap è un pulsante che viene illustrato un, due, o tre immagini bitmap per i diversi stati.Un esempio è dato nella classe CBitmapButtonMFC.

Creazione di una sottoclasse dinamica

Talvolta è preferibile modificare la funzionalità di un oggetto già esistente.Negli esempi precedenti obbligatori o consente di personalizzare i controlli prima che vengano creati.La creazione di una sottoclasse dinamica consente di personalizzare un controllo che è già stato creato.

La creazione di una sottoclasse è il termine di windows per sostituire WndProc di una finestra con WndProc personalizzato e chiamare WndProc obsoleto per la funzionalità predefinita.

Questa operazione non deve essere confusa con la derivazione della classe C++.Per chiarimento, i termini classe base C++ e la classe derivata sono analoghi a rendere superclasse e di una sottoclasse del modello a oggetti di windows.La derivazione di C++ con MFC e la creazione di una sottoclasse di windows sono simili a livello funzionale, a meno che C++ non supporta la creazione di una sottoclasse dinamica.

La classe di CWnd fornisce la connessione tra un oggetto C++ (derivato da CWnd) e un oggetto finestra delle finestre (noto come HWND).

Esistono tre modi comuni che questi sono correlati:

  • CWnd crea HWND.È possibile modificare il comportamento in una classe derivata creando una classe derivata da CWnd.HWND viene creato quando l'applicazione chiama CWnd::Create.

  • L'applicazione associa CWnd a HWNDesistente.Il comportamento della finestra esistente non viene modificato.Si tratta di un caso di delega e resi possibile chiamando CWnd::Attach all'alias HWND esistente a un oggetto di CWnd .

  • CWnd viene associato a HWND esistente ed è possibile modificare il comportamento in una classe derivata.Questa operazione è detta creazione di una sottoclasse dinamica perché si modifica il comportamento e pertanto la classe, di finestre oggetti in fase di esecuzione.

È possibile ottenere la creazione di una sottoclasse dinamica utilizzando i metodi CWnd::SubclassWindow eCWnd::SubclassDlgItem.

Entrambe le routine allegare un oggetto di CWnd a HWNDesistente.SubclassWindow utilizza direttamente HWND .SubclassDlgItem è una funzione di supporto che accetta un ID di controllo e la finestra padre.SubclassDlgItem è progettato per associare gli oggetti C++ per i controlli finestra di dialogo creati da un modello di finestra di dialogo.

Vedere l'esempio di In CTRLTEST per alcuni esempi di utilizzo SubclassWindow e SubclassDlgItem.

Vedere anche

Altre risorse

Note tecniche del numero

Note tecniche per categoria