Condividi tramite


Creazione di attivazione senza finestra

Il codice di creazione della finestra (ovvero tutto ciò che si verifica quando si chiama CreateWindow) è dispendioso eseguire.Un controllo che gestisce una finestra sullo schermo deve gestire i messaggi per la finestra.I controlli privi di finestra sono pertanto più velocemente di controlli con le finestre.

Un ulteriore vantaggio dei controlli privi di finestra è che, a differenza dei controlli con finestre, i controlli privi di finestra supportano il disegno trasparente e le aree non dello schermo.Un esempio comune di un controllo trasparente è un controllo di testo con uno sfondo trasparente.I controlli disegnano il testo ma non lo sfondo, in modo da qualsiasiambito di seguito viene illustrato del testo tramite.I nuovi form utilizzano spesso i controlli non rettangolari, quali le frecce e pulsanti rotondi sono.

Spesso, un controllo non è necessaria una finestra specifici e, invece, non è possibile utilizzare i servizi della finestra del contenitore, a condizione che il contenitore è stato scritto per supportare gli oggetti senza finestra.I controlli privi di finestra sono compatibili con i contenitori più recenti.Nei contenitori meno recenti non scritti per supportare i controlli privi di finestra, i controlli privi di finestra viene creata una finestra quando attivo.

Poiché i controlli privi di finestra non dispone delle proprie finestre, il contenitore (con una finestra) è responsabile di fornire servizi che sarebbero stati forniti in caso contrario da una finestra del controllo.Ad esempio, se il controllo deve eseguire una query sullo stato attivo della tastiera, di acquisire il mouse, o di ottenere un contesto di dispositivo, queste operazioni vengono gestite dal contenitore.Il contenitore è destinato ai messaggi di input inviati alla finestra al controllo senza finestra appropriato, utilizzando l'interfaccia di IOleInPlaceObjectWindowless .(Vedere di automazione SDK per una descrizione dell'interfaccia.) la chiamata di funzioni membro di COleControl questi servizi dal contenitore.

Per eseguire il controllo utilizzare l'attivazione senza finestra, includere il flag di windowlessActivate nel set di flag restituiti da COleControl::GetControlFlags.Di seguito è riportato un esempio:

DWORD CMyAxOptCtrl::GetControlFlags()
{
   DWORD dwFlags = COleControl::GetControlFlags();


...


// The control can activate without creating a window.
dwFlags |= windowlessActivate;


...


   return dwFlags;
}

Il codice per importare questo flag viene generato automaticamente se si seleziona l'opzione di Windowless activation nella pagina di Verificare le impostazioni di Creazione guidata controllo ActiveX MFC.

Quando l'attivazione senza finestra è abilitata, il contenitore delegherà i messaggi di input l'interfaccia di IOleInPlaceObjectWindowless del controllo.l'implementazione dei entity_CODECOleControl di questa interfaccia invia i messaggi tramite la mappa messaggi del controllo, dopo avere modificato le coordinate del mouse in modo appropriato.È possibile elaborare messaggi quali messaggi comuni della finestra, aggiungendo voci corrispondenti alla mappa messaggi.Nei gestori per questi messaggi, evitare di utilizzare la variabile membro di m_hWnd o qualsiasi altra funzione membro che lo utilizza) senza prima verificare che il valore non è NULL.

COleControl fornisce funzioni membro che richiama il mouse capture, lo stato attivo della tastiera, lo scorrimento e altri servizi della finestra da contenitore in base alle proprie esigenze, tra cui:

Nei controlli privi di finestra, è sempre opportuno utilizzare le funzioni membro di COleControl anziché le funzioni membro corrispondenti di CWnd o delle funzioni correlate all'API Win32.

È possibile che si desideri creare un controllo senza finestra per essere la destinazione di un'operazione di trascinamento della selezione OLE.In genere, questo richiede che la finestra del controllo è stata registrata come destinazione di trascinamento.Poiché il controllo non include finestra dei propri, il contenitore utilizza la propria finestra come destinazione di trascinamento.Il controllo fornisce un'implementazione dell'interfaccia di IDropTarget cui il contenitore possibile delegare le chiamate al momento giusto.Per esporre questa interfaccia al contenitore, override COleControl::GetWindowlessDropTarget.Di seguito è riportato un esempio:

IDropTarget* CMyAxOptCtrl::GetWindowlessDropTarget()
{
   m_DropTarget.m_xDropTarget.AddRef();
   return &m_DropTarget.m_xDropTarget;
}

Vedere anche

Concetti

Controlli ActiveX MFC: ottimizzazione