Controlli ActiveX MFC: Utilizzo dei tipi di carattere

Se le visualizzazioni del controllo ActiveX di testi, è possibile consentire all'utente del controllo di modificare l'aspetto del testo modifica di una proprietà del tipo di carattere.Le proprietà predefinite vengono implementate come oggetti del tipo di carattere e possono essere di due tipi: azione o personalizzati.Le proprietà predefinite predefinite sono proprietà del tipo di carattere preimplemented che è possibile aggiungere utilizzo di aggiunta guidata proprietà.Le proprietà predefinite personalizzate non preimplemented e lo sviluppatore del controllo determina il comportamento e l'utilizzo della proprietà.

Questo articolo vengono trattati i seguenti argomenti:

  • Utilizzando la proprietà predefinite predefinita

  • Mediante le proprietà predefinite personalizzate nel controllo

Utilizzando la proprietà predefinite predefinita

Le proprietà predefinite predefinite preimplemented dalla classe COleControl.Inoltre, una pagina standard della proprietà predefinite è anche disponibile, consentendo l'utente ai vari attributi di modifica dell'oggetto del tipo di carattere, quali il nome, la dimensione e stile.

Accedere all'oggetto del tipo di carattere con le funzioni di GetFont, di SetFonte di InternalGetFont di COleControl.L'utente del controllo utilizzerà l'oggetto di carattere mediante GetFont e SetFont funziona in modo analogo a qualsiasi altro ottiene o imposta la proprietà.Quando l'accesso all'oggetto del tipo di carattere è richiesto dall'interno di un controllo, utilizzare la funzione di InternalGetFont .

Come illustrato in Controlli ActiveX MFC: proprietà, aggiungere le proprietà predefinite andarci piano a Aggiunta guidata proprietà.Si sceglie la proprietà predefinite e aggiunta guidata proprietà imposta automaticamente la voce predefinita del carattere nella mappa di invio del controllo.

Per aggiungere la proprietà predefinite predefinita mediante l'aggiunta guidata proprietà

  1. Caricare il progetto del controllo.

  2. In Visualizzazione classi, espandere il nodo della libreria del controllo.

  3. Fare clic con il pulsante destro del mouse sul nodo dell'interfaccia per il controllo (il secondo nodo il nodo della libreria) per aprire il menu di scelta rapida.

  4. Dal menu di scelta rapida, fare clic Aggiungi quindi fare clic su Aggiungi proprietà.

    Verrà aperto aggiunta guidata proprietà.

  5. Nella casella di Property Name , fare clic su Tipo di carattere.

  6. Fare clic su Fine.

Aggiunta guidata proprietà aggiunge la riga seguente alla mappa di invio del controllo, che si trova nel file di implementazione della classe del controllo:

DISP_STOCKPROP_FONT()

Inoltre, aggiunta guidata proprietà aggiunge la riga seguente al file del controllo .IDL:

[id(DISPID_FONT)] IFontDisp*Font;

La proprietà predefinita della barra del titolo è un esempio di proprietà Text che può essere disegnata utilizzando le informazioni predefinite della proprietà predefinite.Aggiungendo la proprietà predefinita della barra del titolo al controllo utilizza i passaggi simili a quelli utilizzati per la proprietà predefinite predefinita.

Per aggiungere la proprietà predefinita della barra del titolo utilizzo di aggiunta guidata proprietà

  1. Caricare il progetto del controllo.

  2. In Visualizzazione classi, espandere il nodo della libreria del controllo.

  3. Fare clic con il pulsante destro del mouse sul nodo dell'interfaccia per il controllo (il secondo nodo il nodo della libreria) per aprire il menu di scelta rapida.

  4. Dal menu di scelta rapida, fare clic Aggiungi quindi fare clic su Aggiungi proprietà.

    Verrà aperto aggiunta guidata proprietà.

  5. Nella casella di Property Name , fare clic su Didascalia.

  6. Fare clic su Fine.

Aggiunta guidata proprietà aggiunge la riga seguente alla mappa di invio del controllo, che si trova nel file di implementazione della classe del controllo:

DISP_STOCKPROP_CAPTION()

Modificare la funzione di OnDraw

L'implementazione predefinita di OnDraw utilizza il tipo di carattere di sistema di Windows per tutto il testo visualizzato nel controllo.Ciò significa che è necessario modificare il codice di OnDraw selezionando l'oggetto di carattere nel contesto di dispositivo.A tale scopo, chiamare COleControl::SelectStockFont e passare il contesto di dispositivo del controllo, come illustrato nell'esempio seguente:

CFont* pOldFont;
TEXTMETRIC tm;
const CString& strCaption = InternalGetText();

pOldFont = SelectStockFont(pdc);
pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH )GetStockObject(WHITE_BRUSH)));
pdc->Ellipse(rcBounds);
pdc->GetTextMetrics(&tm);
pdc->SetTextAlign(TA_CENTER | TA_TOP);
pdc->ExtTextOut((rcBounds.left + rcBounds.right) / 2, 
   (rcBounds.top + rcBounds.bottom - tm.tmHeight) / 2,
   ETO_CLIPPED, rcBounds, strCaption, strCaption.GetLength(), NULL);

pdc->SelectObject(pOldFont);

Dopo che la funzione di OnDraw è stata modificata per utilizzare l'oggetto di carattere, tutto il testo all'interno del controllo viene visualizzato con le caratteristiche della proprietà predefinite di azione del controllo.

Mediante le proprietà predefinite personalizzate nel controllo

Oltre alla proprietà predefinite predefinita, il controllo ActiveX può disporre di proprietà predefinite personalizzate.Per aggiungere una proprietà del tipo di carattere personalizzata è necessario:

  • Utilizzare aggiunta guidata proprietà per implementare la proprietà predefinite personalizzata.

  • Notifiche di carattere di elaborazione.

  • Implementare una nuova interfaccia di notifica di carattere.

ay7tx1x6.collapse_all(it-it,VS.110).gifImplementare una proprietà predefinite personalizzata

Per implementare una proprietà predefinite personalizzata, utilizzare aggiunta guidata proprietà per aggiungere la proprietà e quindi per apportare alcune modifiche al codice.Nelle sezioni seguenti viene descritto come aggiungere una proprietà personalizzata di HeadingFont al controllo di esempio.

Per aggiungere la proprietà predefinite personalizzata mediante l'aggiunta guidata proprietà

  1. Caricare il progetto del controllo.

  2. In Visualizzazione classi, espandere il nodo della libreria del controllo.

  3. Fare clic con il pulsante destro del mouse sul nodo dell'interfaccia per il controllo (il secondo nodo il nodo della libreria) per aprire il menu di scelta rapida.

  4. Dal menu di scelta rapida, fare clic Aggiungi quindi fare clic su Aggiungi proprietà.

    Verrà aperto aggiunta guidata proprietà.

  5. Nella casella di Property Name , digitare un nome per la proprietà.Per questo esempio, utilizzare HeadingFont.

  6. Per Implementation Type, fare clic Get/Set Methods.

  7. Nella casella di Property Type , IDispatch* selezionato per il tipo della proprietà.

  8. Fare clic su Fine.

Aggiunta guidata proprietà crea il codice per aggiungere una proprietà personalizzata di HeadingFont alla classe di CSampleCtrl e nel file di SAMPLE.IDL.Poiché HeadingFont è un tipo di proprietà get/set, aggiunta guidata proprietà viene modificata la mappa di invio della classe di CSampleCtrl per includere unaDISP_PROPERTY_EX macro voce di DISP_PROPERTY_EX_ID:

DISP_PROPERTY_EX_ID(CMyAxFontCtrl, "HeadingFont", dispidHeadingFont, 
   GetHeadingFont, SetHeadingFont, VT_DISPATCH)

La macro di DISP_PROPERTY_EX associa il nome della proprietà di HeadingFont con la classe corrispondente di CSampleCtrl ottiene e imposta i metodi, GetHeadingFont e SetHeadingFont.Il tipo del valore della proprietà viene inoltre specificato; in questo caso, VT_FONT.

Aggiunta guidata proprietà aggiunge una dichiarazione nel file di intestazione del controllo (. H) per GetHeadingFont e SetHeadingFont viene eseguito e aggiunge i propri modelli di funzione nel file di implementazione del controllo (.CPP):

IDispatch* CWizardGenCtrl::GetHeadingFont(void)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your dispatch handler code here

   return NULL;
}

void CWizardGenCtrl::SetHeadingFont(IDispatch* /*pVal*/)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your property handler code here

   SetModifiedFlag();
}

Infine, aggiunta guidata proprietà modifica il file del controllo .IDL aggiungendo una voce per la proprietà di HeadingFont :

[id(1)] IDispatch* HeadingFont;

ay7tx1x6.collapse_all(it-it,VS.110).gifModifiche al codice del controllo

Dopo aver aggiunto la proprietà di HeadingFont al controllo, è necessario apportare alcune modifiche all'intestazione e ai file di implementazione del controllo completamente per supportare la nuova proprietà.

Nel file di intestazione del controllo (. H), aggiungere la seguente dichiarazione di una variabile membro protetto:

protected:
   CFontHolder m_fontHeading;

Nel file di implementazione del controllo (.CPP), effettuare le operazioni seguenti:

  • Inizializzare m_fontHeading nel costruttore del controllo.

    CMyAxFontCtrl::CMyAxFontCtrl()
       : m_fontHeading(&m_xFontNotification)
    {
        InitializeIIDs(&IID_DNVC_MFC_AxFont, &IID_DNVC_MFC_AxFontEvents);
    }
    
  • Dichiarare una struttura statica di FONTDESC che contiene gli attributi predefiniti di carattere.

    static const FONTDESC _fontdescHeading =
      { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE( 12 ), FW_BOLD, 
        ANSI_CHARSET, FALSE, FALSE, FALSE };
    
  • Nella funzione membro di DoPropExchange del controllo, aggiungere una chiamata alla funzione di PX_Font .Ciò fornisce l'inizializzazione e la persistenza per la proprietà predefinite personalizzata.

    void CMyAxFontCtrl::DoPropExchange(CPropExchange* pPX)
    {
        ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
        COleControl::DoPropExchange(pPX);
    
       // [...other PX_ function calls...]
       PX_Font(pPX, _T("HeadingFont"), m_fontHeading, &_fontdescHeading);
    }
    
  • Fine che implementa la funzione membro di GetHeadingFont del controllo.

    IDispatch* CMyAxFontCtrl::GetHeadingFont(void)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       return m_fontHeading.GetFontDispatch();
    }
    
  • Fine che implementa la funzione membro di SetHeadingFont del controllo.

    void CMyAxFontCtrl::SetHeadingFont(IDispatch* pVal)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       m_fontHeading.InitializeFont(&_fontdescHeading, pVal);
       OnFontChanged();    //notify any changes
       SetModifiedFlag();
    }
    
  • Modificare la funzione membro di OnDraw del controllo per definire una variabile per utilizzare il tipo di carattere selezionata in precedenza.

    CFont* pOldHeadingFont;
    
  • Modificare la funzione membro di OnDraw del controllo per selezionare il carattere personalizzata nel contesto di dispositivo aggiungere la riga seguente in qualsiasi punto il tipo deve essere utilizzata.

    pOldHeadingFont = SelectFontObject(pdc, m_fontHeading);
    
  • Modificare la funzione membro di OnDraw del controllo per selezionare il carattere precedente nel contesto di dispositivo aggiungendo la seguente riga dopo che il tipo di carattere è stata utilizzata.

    pdc->SelectObject(pOldHeadingFont);
    

Dopo la proprietà predefinite personalizzata è stata distribuita, la pagina standard della proprietà predefinite deve essere implementata, consentendo agli utenti del controllo di modificare il tipo corrente del controllo.Per aggiungere la pagina delle proprietà ID per la pagina standard della proprietà predefinite, inserire la seguente riga dopo la macro di BEGIN_PROPPAGEIDS :

PROPPAGEID(CLSID_CFontPropPage)

È inoltre necessario incrementare il parametro count della macro di BEGIN_PROPPAGEIDS da una.La riga seguente viene illustrata questa:

BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)

Dopo che tali modifiche apportate, ricompilare l'intero progetto includere funzionalità aggiuntive.

ay7tx1x6.collapse_all(it-it,VS.110).gifNotifiche di carattere di elaborazione

Nella maggior parte dei casi il controllo deve sapere quando le caratteristiche dell'oggetto del tipo di carattere sono state modificate.Ogni oggetto del tipo di carattere è in grado di invio di notifiche in caso di modifica chiamando una funzione membro di interfaccia di IFontNotification , implementato da COleControl.

Se il controllo utilizza la proprietà predefinite predefinita, le notifiche vengono gestite dalla funzione membro di OnFontChanged di COleControl.Quando si aggiunge le proprietà del tipo di carattere personalizzate, è possibile farli utilizzare la stessa implementazione.Nell'esempio nella sezione precedente, questo è stata eseguita passando il &m_xFontNotification durante l'inizializzazione della variabile membro m_fontHeading.

Implementazione di interfacce di oggetti con più tipi di carattere

Implementazione di più interfacce dell'oggetto tipo di carattere

Le linee continue nella figura precedente mostrano che entrambi gli oggetti del tipo di carattere utilizzano la stessa implementazione di IFontNotification.Ciò potrebbe causare problemi se si desidera distinguere che il tipo di carattere è stato modificato.

Un modo per distinguere tra le notifiche dell'oggetto del tipo di carattere del controllo consiste nel creare un'implementazione separata dell'interfaccia di IFontNotification per ogni oggetto di carattere nel controllo.Questa tecnica consente di ottimizzi il codice di disegno aggiornamento solo la stringa, o le stringhe, che utilizzano il tipo di recente modificata.Nelle sezioni seguenti vengono illustrati i passaggi necessari per implementare interfacce di notifica separate per la proprietà predefinite.La seconda proprietà del tipo di carattere costituisca la proprietà di HeadingFont aggiunto nella sezione precedente.

ay7tx1x6.collapse_all(it-it,VS.110).gifImplementare una nuova interfaccia di notifica di carattere

Per distinguere tra le notifiche due o più tipi di carattere, una nuova interfaccia di notifica deve essere implementata per ogni carattere utilizzato nel controllo.Nelle sezioni seguenti viene descritto come implementare una nuova interfaccia di notifica di carattere modificare l'intestazione e il file di implementazione del controllo.

ay7tx1x6.collapse_all(it-it,VS.110).gifAggiunte al file di intestazione

Nel file di intestazione del controllo (. H), aggiungere le righe seguenti alla dichiarazione di classe:

protected:
   BEGIN_INTERFACE_PART(HeadingFontNotify, IPropertyNotifySink)
   INIT_INTERFACE_PART(CMyAxFontCtrl, HeadingFontNotify)
      STDMETHOD(OnRequestEdit)(DISPID);
      STDMETHOD(OnChanged)(DISPID);
   END_INTERFACE_PART(HeadingFontNotify)

Ciò crea un'implementazione dell'interfaccia di IPropertyNotifySink chiamata HeadingFontNotify.Questa nuova interfaccia contiene un metodo denominato OnChanged.

ay7tx1x6.collapse_all(it-it,VS.110).gifAggiunte al file di implementazione

Nel codice che inizializza il tipo di intestazione (nel costruttore del controllo), &m_xFontNotification di modifica a &m_xHeadingFontNotify.Aggiungere il seguente codice:

STDMETHODIMP_(ULONG) CMyAxFontCtrl::XHeadingFontNotify::AddRef()
{
   METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
   return 1;
}
STDMETHODIMP_(ULONG) CMyAxFontCtrl::XHeadingFontNotify::Release()
{
   METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
   return 0;
}

STDMETHODIMP CMyAxFontCtrl::XHeadingFontNotify::QueryInterface(REFIID iid, LPVOID FAR* ppvObj)
{
   METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
   if( IsEqualIID(iid, IID_IUnknown) || IsEqualIID(iid, IID_IPropertyNotifySink))
   {
      *ppvObj= this;
      AddRef();
      return NOERROR;
   }
   return ResultFromScode(E_NOINTERFACE);
}

STDMETHODIMP CMyAxFontCtrl::XHeadingFontNotify::OnChanged(DISPID)
{
   METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
   pThis->InvalidateControl();
   return NOERROR;
}

STDMETHODIMP CMyAxFontCtrl::XHeadingFontNotify::OnRequestEdit(DISPID)
{
   return NOERROR;
}

I metodi di Release e di AddRef interfaccia di IPropertyNotifySink tengono traccia del conteggio dei riferimenti per l'oggetto del controllo ActiveX.Quando il controllo ottiene l'accesso al puntatore a interfaccia, il controllo chiama AddRef per incrementare il conteggio dei riferimenti.Quando il controllo viene completato con il puntatore, chiama Release, nello stesso modo in cui GlobalFree può essere chiamato per liberare un blocco di memoria globale.Quando il conteggio dei riferimenti per questa interfaccia andare a zero, l'implementazione dell'interfaccia può essere liberata.In questo esempio, la funzione di QueryInterface restituisce un puntatore a un'interfaccia di IPropertyNotifySink su un determinato oggetto.Questa funzione consente a un controllo ActiveX eseguire una query di un oggetto per determinare le interfacce supporta.

Dopo che tali modifiche apportate al progetto, ricompilare il progetto e utilizzare Test Container per testare l'interfaccia.Per ulteriori informazioni sulla modalità di accesso a Test Container, vedere Verifica di proprietà ed eventi tramite Test Container.

Vedere anche

Riferimenti

Controlli ActiveX MFC: Utilizzo di immagini in un controllo ActiveX

Controlli ActiveX MFC: Utilizzando le pagine delle proprietà predefinite

Concetti

Controlli ActiveX MFC