Questa nota viene descritto il supporto MFC per controlli personalizzati e dalla. Viene descritta la creazione dinamica di sottoclassi. Consulenza generale sulla proprietà di oggetti CWnd vs s HWNDè presentato.
L'applicazione di esempio MFC CTRLTEST illustra molte di queste caratteristiche. Consultare il codice sorgente dell'esempio MFC generale CTRLTEST e guida in linea.
Controlli creati dal proprietario/menù
Windows fornisce supporto per menu e controlli "disegna proprietario". Questi sono Windows messaggi inviati a una finestra padre di un controllo o dal menu che consentono di personalizzare l'aspetto visivo e il comportamento del controllo o dal menu.
MFC supporta direttamente il proprietario pareggio con le voci della mappa messaggi:
È possibile ignorare questi nel vostro CWnd-classe (di solito una finestra di dialogo o finestra cornice principale) per implementare il comportamento creato dal proprietario derivata.
Questo approccio non porta a codice riutilizzabile. Se avete due controlli simili nelle due diverse finestre di dialogo, è necessario implementare il comportamento del controllo personalizzato in due punti. L'architettura di controllo dalla MFC supportati risolve questo problema.
Menu e controlli dalla
MFC fornisce un'implementazione predefinita (in CWnd e CMenu) per i messaggi standard creati dal proprietario. Questa implementazione predefinita sarà decodificare i parametri creati dal proprietario e delegare i messaggi creati dal proprietario a controlli o dal menu. Questo è chiamato "self-draw", dal momento che il codice di disegno (/ misurazione/confrontando) è nella classe del controllo o del menu non nella finestra proprietaria.
Consente di creare classi di controlli riutilizzabili che consentono di visualizzare il controllo mediante semantica "disegnare proprietario". Il codice per il disegno del controllo, non il proprietario del controllo, è nella classe control. Questo è un approccio orientato alla programmazione del controllo personalizzato.
CButto&n:DrawItem(LPDRAWITEMSTRUCT);
nbsp; / / draw questo pulsante
CMe&nu:MeasureItem(LPMEASUREITEMSTRUCT);
nbsp; / / misura le dimensioni di un elemento in questo menu
CMenu:DrawItem(LPDRAWITEMSTRUCT);
/ / draw di un elemento in questo menu
CListBox:MeasureItem(LPMEASUREITEMSTRUCT);
/ / misura le dimensioni di un elemento in questa casella di riepilogo
CListBox:DrawItem(LPDRAWITEMSTRUCT);
/ / draw di un elemento in questa casella di riepilogo
CListBox:CompareItem(LPCOMPAREITEMSTRUCT);
/ / confrontare due elementi in questa casella di riepilogo se LBS_SORT
CListBox:DeleteItem(LPDELETEITEMSTRUCT);
/ / eliminare un elemento dall'elenco a
CComboBox:MeasureItem(LPMEASUREITEMSTRUCT);
/ / misura le dimensioni di un elemento in questa casella combinata
CComboBox:DrawItem(LPDRAWITEMSTRUCT);
/ / draw di un elemento in questa casella combinata
CComboBox:CompareItem(LPCOMPAREITEMSTRUCT);
/ / confrontare due elementi in questa casella combinata, se CBS_SORT
CComboBox:DeleteItem(LPDELETEITEMSTRUCT);
/ / eliminare un elemento da questa casella combinata
Per informazioni dettagliate sul creato dal proprietario strutture (DRAWITEMSTRUCT, MEASUREITEMSTRUCT, COMPAREITEMSTRUCTe DELETEITEMSTRUCT) si riferiscono alla documentazione MFC per CWnd::OnDrawItem, CWnd::OnMeasureItem, CWnd::OnCompareIteme CWnd::OnDeleteItem rispettivamente.
Utilizzando il menu e controlli dalla
Per i menu dalla, eseguire l'override delle funzioni membro sia MeasureItem e DrawItem.
Per self-drawing caselle di riepilogo e caselle combinate, è necessario ignorare MeasureItem e DrawItem. È necessario specificare lo stile OWNERDRAWVARIABLE nel modello di dialogo (LBS_OWNERDRAWVARIABLE e CBS_OWNERDRAWVARIABLE rispettivamente). Lo stile OWNERDRAWFIXED non funzionerà con self-drawing elementi, poiché l'altezza dell'elemento fisso viene determinata prima dalla controlli vengono associati a casella di riepilogo. (Il membro Win 3.1 funzioni CListBox::SetItemHeight e CComboBox::SetItemHeight può essere utilizzato per aggirare questa limitazione).
Si noti inoltre che la commutazione a uno stile OWNERDRAWVARIABLE inciderà lo stile NOINTEGRALHEIGHT . Perché il controllo non può calcolare un'altezza integrale con articoli di dimensioni variabili, lo stile predefinito di INTEGRALHEIGHT viene ignorata e il controllo è sempre NOINTEGRALHEIGHT. Se gli elementi sono fissi altezza, è possibile impedire gli elementi parziali viene disegnato specificando le dimensioni del controllo per essere un moltiplicatore delle dimensioni dell'elemento integrante.
Per self-drawing caselle di riepilogo e caselle combinate con lo stile di sorta (LBS_SORT e CBS_SORT rispettivamente), è necessario eseguire l'override della funzione membro CompareItem.
Per self-drawing caselle di riepilogo e caselle combinate, DeleteItem non è normalmente override. DeleteItem può essere ignorato se memoria aggiuntiva o altre risorse sono memorizzati con ogni elemento elenco casella o combo box.
Esempi di controlli/menu dalla
Il campione generale MFC CTRLTEST vengono forniti esempi di un menu self-draw (mostrando colori) e una casella di riepilogo self-draw (anche mostrando colori).
L'esempio più tipico di un pulsante dalla è un tasto di bitmap (un pulsante che mostra uno, due o tre immagini bitmap per i diversi Stati). Questo è fornito nella classe MFC CBitmapButton.
Subclassing dinamico
Sottoclassi sono il termine Windows per sostituzione WndProc di una finestra con un diverso metodo WndProc e chiamando il vecchio metodo WndProc per la funzionalità predefinita (superclasse).
Questo non deve essere confuso con derivazione di classe C++ (C++ terminologia usi le parole "basano" e "derivati", mentre il modello di oggetti di Windows utilizza "super" e "sub"). Derivazione C++ con MFC e Windows sottoclassi sono funzionalmente molto simili, tranne C++ non supporta una funzionalità simile alla dinamica sottoclassi.
La classe CWnd fornisce la connessione tra un oggetto C++ (derivato da CWnd) e un oggetto finestra di Windows (noto anche come un HWND).
Ci sono tre modi comuni, che questi sono correlati:
Quest'ultimo caso è fatto con le funzioni membro:
Entrambe le routine di allegare un oggetto CWnd una HWNDle finestre esistenti. SubclassWindow assume l' HWND direttamente e SubclassDlgItem è un aiuto che accetta un ID di controllo e la finestra padre (di solito una finestra di dialogo). SubclassDlgItem è stato progettato per il fissaggio di oggetti C++ a controlli di dialogo creati da un modello di finestra di dialogo.
Consultare il CTRLTEST esempio per diversi esempi di quando utilizzare SubclassWindow e SubclassDlgItem.
&Note tecniche per numero |nbsp; Note tecniche per la categoria