Controlli ActiveX MFC: Creazione di una sottoclasse di un controllo Windows
In questo articolo viene descritto il processo di creazione di una sottoclasse un controllo Windows standard per creare un controllo ActiveX.La creazione di una sottoclasse un controllo Windows esistente è un modo rapido per compilare un controllo ActiveX.Il nuovo controllo disporrà di possibilità di controlli Windows sottoclassato, come disegno e risposta ai clic del mouse.L'esempio relativo ai controlli ActiveX MFC BUTTON è un esempio di creazione di una sottoclasse un controllo Windows.
La sottoclasse un controllo Windows, completare le seguenti attività:
Eseguire l'override delle funzioni membro di PreCreateWindow e di IsSubclassedControl di COleControl
Modificare la funzione membro di OnDraw
Gestire tutti i messaggi del controllo ActiveX (OCM) applicare al controllo
[!NOTA]
Gran parte di queste operazioni vengono eseguite automaticamente dalla Creazione guidata controllo ActiveX se si seleziona il controllo per essere sottoclassato utilizzando l'elenco a discesa di Select Parent Window Class nella pagina di Control Settings .
Vedere a articolo della Knowledge Base Q243454 per ulteriori informazioni sulla creazione di una sottoclasse un controllo.
Eseguire l'override di IsSubclassedControl e PreCreateWindow
Per eseguire l'override di PreCreateWindow e IsSubclassedControl, aggiungere le seguenti righe di codice alla sezione di protected della dichiarazione della classe del controllo:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
BOOL IsSubclassedControl();
Nel file di implementazione del controllo (.CPP), aggiungere le seguenti righe di codice per implementare le due funzioni sottoposte a override:
// CMyAxSubCtrl::PreCreateWindow - Modify parameters for CreateWindowEx
BOOL CMyAxSubCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
cs.lpszClass = _T("BUTTON");
return COleControl::PreCreateWindow(cs);
}
// CMyAxSubCtrl::IsSubclassedControl - This is a subclassed control
BOOL CMyAxSubCtrl::IsSubclassedControl()
{
return TRUE;
}
Notare che, in questo esempio, il pulsante di windows viene specificato in PreCreateWindow.Tuttavia, tutti i controlli Windows standard possono essere sottoclassato.Per ulteriori informazioni sui controlli Windows standard, vedere Controlli.
Durante la creazione di una sottoclasse un controllo Windows, è possibile specificare lo stile particolare della finestra (WS_) o lo stile esteso della finestra (WS_EX_) diminuisce per essere utilizzato in per creare la finestra del controllo.È possibile impostare i valori di tali parametri nella funzione membro di PreCreateWindow modificando cs.style e i campi della struttura di cs.dwExStyle .Le modifiche apportate a questi campi devono essere effettuate mediante un'operazione di OR , per mantenere i flag di impostazione predefinita impostati dalla classe COleControl.Ad esempio, se il controllo è creazione di una sottoclasse il pulsante e si desidera che il controllo venga visualizzato come casella di controllo, inserire la seguente riga di codice nell'implementazione di CSampleCtrl::PreCreateWindow, prima dell'istruzione return:
cs.style |= BS_CHECKBOX;
Questa operazione consente di aggiungere il flag di stile di BS_CHECKBOX , mentre consente al flag dello stile predefinito (WS_CHILD) della classe COleControl invariato.
Modificare la funzione membro di OnDraw
Se si desidera che il controllo sottoclassato per mantenere lo stesso aspetto del controllo Windows corrispondente, la funzione membro di OnDraw per il controllo deve contenere solo una chiamata alla funzione membro di DoSuperclassPaint , come nel seguente esempio:
void CMyAxSubCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
if (!pdc)
return;
DoSuperclassPaint(pdc, rcBounds);
}
La funzione membro di DoSuperclassPaint , implementata da COleControl, segue la routine della finestra di controlli Windows per disegnare il controllo nel contesto di dispositivo specificato, all'interno del rettangolo di delimitazione.In questo modo il controllo visualizzato anche quando non è attiva.
[!NOTA]
La funzione membro di DoSuperclassPaint funziona solo con i tipi di controllo che consentono un contesto di dispositivo per passare come wParam di un messaggio di WM_PAINT .Ciò include alcuni controlli Windows standard, ad esempio SCROLLBAR e PULSANTEe tutti i controlli comuni.Per i controlli che non supportano questo comportamento, sarà necessario fornire il codice correttamente per visualizzare un controllo inattivo.
Gestire i messaggi riprodotti della finestra
I controlli Windows in genere inviano determinati messaggi per la finestra alla finestra padre.Alcuni di questi messaggi, ad esempio WM_COMMAND, forniscono notifiche di un'azione dall'utente.Altri, come WM_CTLCOLOR, vengono utilizzati per ottenere informazioni dalla finestra padre.Un controllo ActiveX in genere comunica con la finestra padre in altri modi.Le notifiche vengono passate generando eventi (che riceve le notifiche di eventi) e le informazioni sul contenitore di controlli vengono ottenute accesso alle proprietà di ambiente del contenitore.Poiché queste tecniche di comunicazione esiste, i contenitori di controlli ActiveX non è previsto per elaborare alcuni messaggi della finestra inviati dal controllo.
Per impedire il contenitore dalla ricezione dei messaggi delle finestre inviati da un controllo Windows sottoclassato, COleControl crea una finestra aggiuntiva per fungere dal controllo padre.Questa finestra aggiuntiva, denominata “un riflettore,„ viene creata solo per un controllo ActiveX che le sottoclassi un controllo Windows e dispone della stessa dimensione e la posizione della finestra di controllo.Messaggi della finestra delle intercettazioni di finestra reflector di determinati e le invia al controllo.Il controllo, nella routine della finestra, quindi possibile elaborare i messaggi riprodotti proprietà appropriati per un controllo ActiveX (ad esempio, generando un evento).Vedere Messaggio riprodotto ID della finestra per un elenco di messaggi rilevati delle finestre e dei relativi messaggi riprodotti corrispondenti.
Un contenitore di controlli ActiveX può essere progettato per eseguire la reflection di messaggio stessa, eliminando la necessità di COleControl di creare la finestra reflector e riducendo il sovraccarico di esecuzione per un controllo Windows sottoclassato.COleControl rileva se il contenitore supporta questa funzionalità verificando una proprietà di ambiente di MessageReflect con un valore di TRUE.
Per gestire un messaggio riprodotto della finestra, aggiungere una voce al mapping dei messaggi del controllo e implementare una funzione di gestione.Poiché i messaggi riprodotti non fanno parte dello standard dei messaggi definiti da windows, la Visualizzazione classi non supporta l'aggiunta di tali gestori di messaggi.Tuttavia, non è difficile aggiungere un gestore manualmente.
Per aggiungere un gestore messaggi per un messaggio riprodotto della finestra manualmente effettuare le operazioni seguenti:
Nella classe del controllo. Il file H, dichiara una funzione di gestione.La funzione deve avere un tipo restituito di LRESULT e di due parametri, con tipi WPARAM e LPARAM, rispettivamente.Di seguito è riportato un esempio:
class CMyAxSubCtrl : public COleControl { ... protected: LRESULT OnOcmCommand(WPARAM wParam, LPARAM lParam); };
Nel file di classe del controllo .CPP, aggiungere una voce di ON_MESSAGE alla mappa messaggi.I parametri di questa voce devono essere l'identificatore del messaggio e il nome della funzione di gestione.Di seguito è riportato un esempio:
BEGIN_MESSAGE_MAP(CMyAxSubCtrl, COleControl) ON_MESSAGE(OCM_COMMAND, &CMyAxSubCtrl::OnOcmCommand) END_MESSAGE_MAP()
Inoltre nel file di .CPP, implementare la funzione membro di OnOcmCommand per elaborare il messaggio riprodotto.I parametri di lParam e di wParam sono gli stessi del messaggio originale della finestra.
Per un esempio di come i messaggi riprodotti sono elaborati, fare riferimento a esempio di controlli ActiveX MFC BUTTON.Viene illustrato un gestore di OnOcmCommand che rileva codice di notifica di BN_CLICKED e risponde generando (inviare) un evento Click.