Condividi tramite


Controlli ActiveX MFC: creazione di una sottoclasse per un controllo Windows

In questo articolo viene descritto il processo per la creazione di una sottoclasse di un controllo Windows comune per creare un controllo ActiveX. La creazione di una sottoclasse di un controllo Windows esistente è un modo rapido per compilare un controllo ActiveX. Il nuovo controllo disporrà delle funzionalità dei controlli Windows sottoclassati, come il disegno e la risposta ai clic del mouse. L'esempio dei controlli ActiveX MFC BUTTON è un esempio di creazione di una sottoclasse di un controllo Windows.

Per creare una sottoclasse di un controllo Windows, completare le seguenti attività:

  • Eseguire l'override delle funzioni membro PreCreateWindow e IsSubclassedControl di COleControl

  • Modificare la funzione membro OnDraw

  • Gestire tutti i messaggi del controllo ActiveX (OCM) applicati al controllo

    Nota

    Gran parte di queste operazioni vengono eseguite automaticamente dalla Creazione guidata controllo ActiveX se si seleziona il controllo da sottoclassare mediante l'elenco a discesa Seleziona classe finestra padre nella pagina Impostazioni controllo.

Vedere l'articolo Knowledge Base Q243454 per ulteriori informazioni sulla creazione di una sottoclasse di 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 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;
}

Si noti che, in questo esempio, il pulsante Windows viene specificato in PreCreateWindow. Tuttavia, tutti i controlli Windows standard possono essere sottoclassati. Per ulteriori informazioni sui controlli Windows standard, vedere Controlli.

Quando si crea una sottoclasse di un controllo Windows, è possibile specificare uno stile particolare per la finestra (WS_) o lo stile esteso della finestra (WS_EX_) contrassegnata per essere utilizzato nella creazione della finestra del controllo. È possibile impostare valori per questi parametri nella funzione membro PreCreateWindow modificando cs.style e i campi della struttura cs.dwExStyle. Le modifiche apportate a questi campi devono essere apportate mediante un'operazione OR, per conservare i flag di impostazione predefinita impostati dalla classe COleControl. Ad esempio, se il controllo è una sottoclasse del 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;

Questo passaggio aggiunge il flag di stile BS_CHECKBOX, mentre lascia il flag dello stile predefinito (WS_CHILD) della classe COleControl invariato.

Modificare la funzione membro OnDraw

Se si desidera che il controllo sottoclassato mantenga lo stesso aspetto del controllo Windows corrispondente, la funzione membro OnDraw per il controllo deve contenere solo una chiamata a una funzione membro 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 DoSuperclassPaint, implementata da COleControl, utilizza la procedura della finestra del controllo Windows per disegnare il controllo nel contesto di dispositivo specificato, all'interno del rettangolo di delimitazione. In questo modo il controllo viene visualizzato anche quando non è attivo.

Nota

La funzione membro DoSuperclassPaint funziona solo con i tipi di controllo che consentono ad un contesto di dispositivo di essere passato come wParam di un messaggio WM_PAINT.Ciò include alcuni controlli Windows standard, ad esempio SCROLLBAR e BUTTON e tutti i controlli comuni.Per i controlli che non supportano questo comportamento, è necessario fornire il proprio codice correttamente per visualizzare un controllo inattivo.

Gestire i messaggi riprodotti della finestra

I controlli Windows in genere inviano determinati messaggi finestra alla loro finestra padre. Alcuni di questi messaggi, ad esempio WM_COMMAND, forniscono le notifiche di un'azione dell'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 (inviando notifiche di eventi) e le informazioni sul contenitore di controlli vengono ottenute accedendo alle proprietà di ambiente del contenitore. Poiché queste tecniche di comunicazione esistono, i contenitori di controllo ActiveX non prevedono l'elaborazione di alcuni messaggi finestra inviati dal controllo.

Per impedire al contenitore di ricevere dei messaggi finestra inviati da un controllo Windows sottoclassato, COleControl crea una finestra aggiuntiva che serve da controllo padre. Questa finestra aggiuntiva, denominata "riflettore," viene creata solo per un controllo ActiveX che estende un controllo Windows e dispone della stessa dimensione e posizione della finestra di controllo. La finestra di ricezione intercetta determinati messaggi della finestra e li invia al controllo. Il controllo, nella routine della finestra, può quindi elaborare questi messaggi di ricezione intraprendendo le opportune azioni su un controllo ActiveX (ad esempio, generando un evento). Vedere ID del messaggio della finestra di ricezione per un elenco di messaggi della finestra intercettati e dei relativi messaggi di ricezione corrispondenti.

Un contenitore di controlli ActiveX può essere progettato per eseguire la reflection del messaggio stesso, eliminando a COleControl la necessità di creare la finestra di ricezione e riducendo il sovraccarico di runtime per un controllo Windows sottoclassato. COleControl determina se il contenitore supporta questa funzionalità verificando una proprietà di ambiente MessageReflect con un valore TRUE.

Per gestire un messaggio della finestra di ricezione, aggiungere una voce alla mappa dei messaggi del controllo ed 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 della finestra di ricezione manualmente effettuare le operazioni seguenti:

  • Nel file .H della classe del controllo, dichiarare una funzione di gestione. La funzione deve avere un tipo restituito LRESULT e 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 .CPP della classe del controllo, aggiungere una voce 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()
    
  • Sempre nel file .CPP, implementare la funzione membro OnOcmCommand per elaborare il messaggio riprodotto. I parametri wParam e lParam sono uguali a quelli del messaggio originale della finestra.

Per un esempio di come i messaggi riprodotti vengono elaborati, fare riferimento all'esempio dei controlli ActiveX MFC BUTTON. Viene illustrato un gestore OnOcmCommand che rileva codice della notifica BN_CLICKED e risponde generando (inviando) un evento Click.

Vedere anche

Concetti

Controlli ActiveX MFC