Share via


Controles ActiveX de MFC: Utilizar las fuentes

Si sus muestra el control ActiveX text, puede permitir al usuario del control cambie la apariencia del texto cambiar una propiedad de la fuente.Las propiedades de fuente se implementan como objetos de fuente y pueden ser de dos tipos: acción o personalizado.Las propiedades de fuente comunes son las propiedades de fuente preimplemented que puede agregar utilizando el asistente para agregar propiedades.Las propiedades de fuente personalizadas no preimplemented y el programador de controles determina el comportamiento y el uso de la propiedad.

En este artículo se tratan los siguientes temas:

  • Mediante la propiedad de fuente común

  • Utilizando propiedades de fuente personalizadas en el Control de IU

Mediante la propiedad de fuente común

Las propiedades de fuente comunes preimplemented por la clase COleControl.Además, una página de propiedades de fuente estándar también está disponible, lo que el usuario cambie los distintos atributos de objeto font, como su nombre, tamaño, y estilo.

Tenga acceso a la fuente con las funciones de GetFont, de SetFont, y de InternalGetFont de COleControl.El usuario del control tendrá acceso a la fuente mediante GetFont y SetFont funciona de la misma forma que cualquier otro obtiene y establece la propiedad.Cuando el acceso a la fuente se requiere dentro de un control, utilice la función de InternalGetFont .

Como se describe en Controles ActiveX de MFC: Propiedades, agregar propiedades estándar es fácil con Asistente para agregar propiedades.Elija la propiedad font, y el asistente para agregar inserta automáticamente la entrada habitual de la del mapa de envío del control.

Para agregar la propiedad de fuente habituales mediante el asistente para agregar propiedades

  1. Cargue el proyecto de control.

  2. En la vista de clases, expanda el nodo de la biblioteca del control.

  3. Haga clic con el botón secundario en el nodo de la interfaz para el control (el segundo nodo el nodo de biblioteca) para abrir el menú contextual.

  4. En el menú contextual, haga clic agregar y haga clic en Agregar propiedad.

    Se abrirá el asistente para agregar propiedades.

  5. En el cuadro de Property Name , haga clic en Fuente.

  6. Haga clic en Finalizar.

El asistente para agregar agrega la línea siguiente al mapa de envío del control, ubicado en el archivo de implementación de la clase de control:

DISP_STOCKPROP_FONT()

Además, el asistente para agregar agrega la línea siguiente al archivo del control .IDL:

[id(DISPID_FONT)] IFontDisp*Font;

La propiedad caption común es un ejemplo de una propiedad de texto que se puede dibujar utilizando la información bursátil de la propiedad de la fuente.Agregar la propiedad caption común al control utiliza los pasos similares a los empleados para la propiedad de fuente común.

Para agregar la propiedad caption habituales mediante el asistente para agregar propiedades

  1. Cargue el proyecto de control.

  2. En la vista de clases, expanda el nodo de la biblioteca del control.

  3. Haga clic con el botón secundario en el nodo de la interfaz para el control (el segundo nodo el nodo de biblioteca) para abrir el menú contextual.

  4. En el menú contextual, haga clic agregar y haga clic en Agregar propiedad.

    Se abrirá el asistente para agregar propiedades.

  5. En el cuadro de Property Name , haga clic en Caption.

  6. Haga clic en Finalizar.

El asistente para agregar agrega la línea siguiente al mapa de envío del control, ubicado en el archivo de implementación de la clase de control:

DISP_STOCKPROP_CAPTION()

Modificar la función de OnDraw

La implementación predeterminada de OnDraw utiliza la fuente del sistema de Windows para todo el texto mostrado en el control.Esto significa que debe modificar el código de OnDraw seleccionando el objeto de fuente en el contexto del dispositivo.Para ello, llame COleControl::SelectStockFont y pase el contexto de dispositivo de control, como se muestra en el ejemplo siguiente:

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);

Después de que la función de OnDraw se ha modificado para utilizar el objeto de fuente, cualquier texto dentro del control se muestra con características de la propiedad de la fuente de control.

Utilizando propiedades de fuente personalizadas en el Control de IU

Además de la propiedad de fuente común, el control ActiveX puede tener propiedades de fuente personalizadas.Para agregar una propiedad de la fuente personalizada debe:

  • Utilice el asistente para agregar propiedades para implementar la propiedad de la fuente personalizada.

  • Notificaciones de la fuente de procesamiento.

  • Implementar una nueva interfaz de notificación de fuente.

ay7tx1x6.collapse_all(es-es,VS.110).gifImplementar una propiedad de la fuente personalizada

Para implementar una propiedad de la fuente personalizada, se utiliza el asistente para agregar propiedades para agregar propiedades y después para crear algunas modificaciones al código.Las secciones siguientes se describe cómo agregar la propiedad personalizada de HeadingFont al control de ejemplo.

Para agregar la propiedad de la fuente personalizada mediante el asistente para agregar propiedades

  1. Cargue el proyecto de control.

  2. En la vista de clases, expanda el nodo de la biblioteca del control.

  3. Haga clic con el botón secundario en el nodo de la interfaz para el control (el segundo nodo el nodo de biblioteca) para abrir el menú contextual.

  4. En el menú contextual, haga clic agregar y haga clic en Agregar propiedad.

    Se abrirá el asistente para agregar propiedades.

  5. En el cuadro de Property Name , escriba un nombre para la propiedad.Para este ejemplo, utilice HeadingFont.

  6. Para Implementation Type, haga clic en Get/Set Methods.

  7. En el cuadro de Property Type , seleccione IDispatch* para el tipo de propiedad.

  8. Haga clic en Finalizar.

El asistente para agregar crea código para agregar la propiedad personalizada de HeadingFont a la clase de CSampleCtrl y archivo de SAMPLE.IDL.Dado que HeadingFont es un tipo de propiedad get/set, el asistente para agregar modifica el mapa del envío de la clase de CSampleCtrl para incluir una entradaDISP_PROPERTY_EX de macro de DISP_PROPERTY_EX_ID:

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

La macro de DISP_PROPERTY_EX asocia el nombre de propiedad de HeadingFont a su clase correspondiente de CSampleCtrl get y set, GetHeadingFont y SetHeadingFont.Especifique el tipo de valor de propiedad también; en este caso, VT_FONT.

El asistente para agregar también agrega una declaración en el archivo de encabezado del control (. H) para GetHeadingFont y SetHeadingFont funciona y agrega sus plantillas de función en el archivo de implementación del control (.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();
}

Finalmente, el asistente para agregar modifica el archivo del control .IDL agregando una entrada para la propiedad de HeadingFont :

[id(1)] IDispatch* HeadingFont;

ay7tx1x6.collapse_all(es-es,VS.110).gifModificaciones al código de control

Ahora que ha agregado la propiedad de HeadingFont al control, debe realizar algunos cambios en el encabezado del control y los archivos de implementación para permitir totalmente la nueva propiedad.

En el archivo de encabezado del control (. H), agregue la siguiente declaración de una variable miembro protegida:

protected:
   CFontHolder m_fontHeading;

En el archivo de implementación del control (.CPP), haga lo siguiente:

  • Inicializa m_fontHeading en el constructor del control.

    CMyAxFontCtrl::CMyAxFontCtrl()
       : m_fontHeading(&m_xFontNotification)
    {
        InitializeIIDs(&IID_DNVC_MFC_AxFont, &IID_DNVC_MFC_AxFontEvents);
    }
    
  • Declare una estructura estática de FONTDESC que contiene los atributos predeterminados de la fuente.

    static const FONTDESC _fontdescHeading =
      { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE( 12 ), FW_BOLD, 
        ANSI_CHARSET, FALSE, FALSE, FALSE };
    
  • En la función miembro de DoPropExchange de control, agregue una llamada a la función de PX_Font .Esto proporciona la inicialización y la persistencia para la propiedad de la fuente personalizada.

    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);
    }
    
  • Final que implementa la función miembro de GetHeadingFont del control.

    IDispatch* CMyAxFontCtrl::GetHeadingFont(void)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       return m_fontHeading.GetFontDispatch();
    }
    
  • Final que implementa la función miembro de SetHeadingFont del control.

    void CMyAxFontCtrl::SetHeadingFont(IDispatch* pVal)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       m_fontHeading.InitializeFont(&_fontdescHeading, pVal);
       OnFontChanged();    //notify any changes
       SetModifiedFlag();
    }
    
  • Modifique la función miembro de OnDraw de control para definir una variable para contener la fuente seleccionada anteriormente.

    CFont* pOldHeadingFont;
    
  • Modifique la función miembro de OnDraw de control para seleccionar la fuente personalizada en el contexto de dispositivo agregando la siguiente línea donde la fuente debe utilizarse.

    pOldHeadingFont = SelectFontObject(pdc, m_fontHeading);
    
  • Modifique la función miembro de OnDraw de control para seleccionar la fuente anterior de vuelta en el contexto de dispositivo agregando la siguiente línea después de haber utilizado para la fuente.

    pdc->SelectObject(pOldHeadingFont);
    

Después de implementar la propiedad de la fuente personalizada, la página de propiedades de fuente estándar se debe implementar, permitiendo a los usuarios del control para cambiar la fuente del control actual.Para agregar el identificador de la página de propiedades de la página de propiedades de fuente estándar, inserte la línea siguiente después de la macro de BEGIN_PROPPAGEIDS :

PROPPAGEID(CLSID_CFontPropPage)

Se debe aumentar el parámetro count de la macro de BEGIN_PROPPAGEIDS por una.La siguiente línea muestra esto:

BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)

Después de que se hayan realizado estos cambios, recompile el proyecto completo de incorporar la funcionalidad adicional.

ay7tx1x6.collapse_all(es-es,VS.110).gifNotificaciones de la fuente de procesamiento

En la mayoría de los casos el control debe saber cuándo las características de objeto de fuente se han modificado.Cada objeto de fuente es capaz de proporcionar notificaciones cuando cambia llamando a una función miembro de interfaz de IFontNotification , implementado por COleControl.

Si el control utiliza la propiedad de fuente común, las notificaciones se controlan mediante la función miembro de OnFontChanged de COleControl.Cuando agrega propiedades de fuente personalizadas, puede hacer que utilicen la misma implementación.En el ejemplo de la sección anterior, se ha conseguido pasando el &m_xFontNotification al inicializar la variable miembro m_fontHeading.

Implementar varias interfaces de objetos de fuente

Implementar varias interfaces de un objeto Font

Las líneas continuas en la ilustración anterior muestran que ambos objetos de fuente utilizan la misma implementación de IFontNotification.Esto podría producir problemas si desea distinguir que la fuente modificado.

Una manera de distinguir entre las notificaciones del objeto de la fuente del control es crear una implementación distinta de la interfaz de IFontNotification para cada objeto de fuente en el control.Esta técnica le permite optimizar el código de dibujo actualizando sólo la cadena, o cadenas, que usan la fuente recién modificada.Las secciones siguientes muestran los pasos necesarios para implementar las interfaces independientes de notificación para una segunda propiedad de fuente.La segunda propiedad de fuente se supone que la propiedad de HeadingFont que se agregó en la sección anterior.

ay7tx1x6.collapse_all(es-es,VS.110).gifImplementar una interfaz de notificación de fuente New

Para diferenciar las notificaciones de dos o más fuentes, una nueva interfaz de notificación se debe implementar para cada fuente utilizada en el control.Las secciones siguientes describen cómo implementar una nueva interfaz de notificación de fuente modificando el encabezado del control y los archivos de implementación.

ay7tx1x6.collapse_all(es-es,VS.110).gifAdiciones al archivo de encabezado

En el archivo de encabezado del control (. H), agregue las siguientes líneas a la declaración de clase:

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

Esto crea una implementación de la interfaz de IPropertyNotifySink denominada HeadingFontNotify.Esta nueva interfaz contiene un método denominado OnChanged.

ay7tx1x6.collapse_all(es-es,VS.110).gifAdiciones al archivo de implementación

En el código que inicializa la fuente del encabezado (en el constructor del control), cambie &m_xFontNotification a &m_xHeadingFontNotify.A continuación agregue el código siguiente:

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;
}

Los métodos de AddRef y de Release en la interfaz de IPropertyNotifySink no realizan un seguimiento del recuento de referencias para el objeto de control ActiveX.Cuando el control obtiene acceso al puntero de interfaz, el control llama a AddRef para incrementar el recuento de referencias.Cuando el control se finalice el puntero, llama a Release, casi de la misma manera que GlobalFree se puede llamar para liberar un bloque de memoria global.Cuando el recuento de referencias para esta interfaz va a cero, la implementación de interfaz puede ser liberado.En este ejemplo, la función de QueryInterface devuelve un puntero a una interfaz de IPropertyNotifySink de un objeto concreto.Esta función permite que un control ActiveX vea un objeto para determinar qué interfaces admite.

Después de que estos cambios se han realizado en el proyecto, recompile el contenedor de prueba del uso de probar la interfaz.Vea Probar propiedades y eventos con Test Container para obtener información sobre cómo tener acceso a Test Container.

Vea también

Referencia

Controles ActiveX de MFC: Mediante las imágenes en un control ActiveX

Controles ActiveX de MFC: Utilizando las páginas de propiedades comunes

Conceptos

Controles ActiveX de MFC