Compartir a través de


Controles ActiveX MFC: Usar imágenes en un control ActiveX

En este artículo se describe el tipo de imagen común y cómo implementarlo en el control ActiveX. Contenido de los temas:

Información general sobre las propiedades de imagen personalizadas

Un tipo de imagen es una opción de un grupo de tipos comunes para algunos controles ActiveX. El tipo de imagen controla los metarchivos, los mapas de bits o los iconos y permite al usuario especificar una imagen que se mostrará en un control ActiveX. Las propiedades de imagen personalizadas se implementan mediante un objeto de imagen y las funciones Get/Set que permiten controlar el acceso de usuario a la propiedad de imagen. Control el acceso de usuarios a la propiedad de imagen personalizada mediante la página de propiedades de imágenes estándar.

Además del tipo de imagen estándar, también están disponibles los tipos de fuente y color. Para obtener más información sobre el uso del tipo de fuente estándar en el control ActiveX, vea el artículo Controles ActiveX MFC: Usar fuentes.

Las clases de controles ActiveX proporcionan varios componentes que puede usar para implementar la propiedad de imagen en el control. Estos componentes incluyen:

  • La clase CPictureHolder .

    Esta clase proporciona fácil acceso a la funcionalidad y al objeto de imagen del elemento mostrado por la propiedad de imagen personalizada.

  • Compatibilidad con las propiedades de tipo LPPICTUREDISP, implementadas con las funciones Get/Set.

    Con la vista de clases, puede agregar rápidamente una propiedad personalizada (o varias) que admita el tipo de imagen. Para obtener más información sobre la adición de propiedades de controles ActiveX con la vista de clases, vea el Controles ActiveX MFC: Propiedades.

  • Página de propiedades que manipula la propiedad o las propiedades de imagen de un control.

    Esta página de propiedades forma parte de un grupo de páginas de propiedades estándar disponibles para los controles ActiveX. Para obtener más información sobre las páginas de propiedades de controles ActiveX, vea el Controles ActiveX MFC: Usar páginas de propiedades estándar.

Implementar una propiedad de imagen personalizada en el control ActiveX

Cuando complete los pasos que se describen en esta sección, el control podrá mostrar imágenes elegidas por el usuario. El usuario puede cambiar la imagen mostrada mediante una página de propiedades que muestra la imagen actual y tiene un botón Examinar que permite que el usuario seleccione diferentes imágenes.

Una propiedad de imagen personalizada se implementa mediante un proceso similar al usado para implementar otras propiedades; la diferencia principal radica en que la propiedad personalizada debe admitir un tipo de imagen. Dado que el elemento de la propiedad de imagen se debe dibujar con el control ActiveX, deben realizarse varias adiciones y modificaciones en la propiedad para que pueda implementarse totalmente.

Para implementar una propiedad de imagen personalizada, debe hacer lo siguiente:

Adiciones al proyecto de control

Para agregar el identificador de página de propiedades para la página de propiedades de imagen estándar, inserte la línea siguiente después de la macro BEGIN_PROPPAGEIDS en el archivo de implementación de control (.CPP):

PROPPAGEID(CLSID_CPicturePropPage)

También debe incrementar el parámetro de recuento de la macro BEGIN_PROPPAGEIDS en uno. Esto se ilustra en la línea siguiente:

BEGIN_PROPPAGEIDS(CMyAxPicCtrl, 2)

Para agregar el miembro de datos CPictureHolder a la clase de control, inserte la siguiente línea en la sección protegida de la declaración de clase del control en el archivo de encabezado del control (. (H):

CPictureHolder    m_pic;

No es necesario asignar un nombre al miembro de datos m_pic; cualquier nombre bastará.

A continuación, agregue una propiedad personalizada que admita un tipo de imagen:

Para agregar una propiedad de imagen personalizada mediante el Asistente para agregar propiedades

  1. Cargue el proyecto del control.

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

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

  4. En el menú contextual, elija Agregar y, luego, Agregar propiedad.

  5. En el cuadro Nombre de propiedad , escriba el nombre de la propiedad. Con fines de ejemplo, ControlPicture se utiliza en este procedimiento.

  6. En el cuadro Tipo de propiedad, seleccione IPictureDisp* como tipo de propiedad.

  7. En Tipo de implementación, haga clic en Métodos Get/Set.

  8. Escriba nombres únicos para las funciones Get y Set o acepte los nombres predeterminados. (En este ejemplo, se usan los nombres predeterminados GetControlPicture y SetControlPicture ).

  9. Haga clic en Finalizar

El Asistente para agregar propiedades agrega el siguiente código entre los comentarios del mapa de envíos en el archivo de encabezado del control (.H):

IPictureDisp* GetControlPicture(void);
void SetControlPicture(IPictureDisp* pVal);

Además, se insertó el siguiente código en el mapa de envíos del archivo de implementación del control (.CPP):

DISP_PROPERTY_EX_ID(CMyAxPicCtrl, "ControlPicture", dispidControlPicture,
   GetControlPicture, SetControlPicture, VT_PICTURE)

El Asistente para agregar propiedades también agrega las dos siguientes funciones de código auxiliar en el archivo de implementación:

IPictureDisp* CWizardGenCtrl::GetControlPicture(void)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your dispatch handler code here

   return NULL;
}

void CWizardGenCtrl::SetControlPicture(IPictureDisp* /*pVal*/)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your property handler code here

   SetModifiedFlag();
}

Nota:

Los nombres de clase y función del control pueden diferir de los del ejemplo anterior.

Modificaciones en el proyecto de control

Después de realizar las adiciones necesarias en el proyecto de control, debe modificar varias funciones que afectan a la representación del control ActiveX. Estas funciones, OnResetState, OnDrawy las funciones Get/Set de una propiedad de imagen personalizada se encuentran en el archivo de implementación. (Observe que en este ejemplo, la clase de control se denomina CSampleCtrl, el miembro de datos CPictureHolder se denomina m_pic y el nombre de la propiedad de imagen personalizada es ControlPicture).

En la función OnResetState del control, agregue la siguiente línea opcional después de la llamada a COleControl::OnResetState:

m_pic.CreateEmpty();
m_pic.CreateEmpty();

De este modo, la imagen del control se establece en una imagen en blanco.

Para dibujar la imagen correctamente, realice una llamada a CPictureHolder::Render en la función OnDraw del control. Modifique la función para que sea similar a la del ejemplo siguiente:

void CMyAxPicCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
   if (!pdc)
      return;

   m_pic.Render(pdc, rcBounds, rcBounds);
}

En la función Get de la propiedad de imagen personalizada del control, agregue la siguiente línea:

return m_pic.GetPictureDispatch();
return m_pic.GetPictureDispatch();

En la función Set de la propiedad de imagen personalizada del control, agregue las líneas siguientes:

m_pic.SetPictureDispatch(pVal);
InvalidateControl();

La propiedad de imagen debe hacerse persistente para que la información que se agregue durante el diseño se muestre en tiempo de ejecución. Agregue la siguiente línea a la función COleControlde la clase derivada de DoPropExchange :

PX_Picture(pPX, _T("ControlPicture"), m_pic);

Nota:

Los nombres de clase y función pueden diferir de los del ejemplo anterior.

Después de completar las modificaciones, vuelva a generar el proyecto para incorporar la nueva funcionalidad de la propiedad de imagen personalizada y use el contenedor de prueba para probar la nueva propiedad. Consulte Probar propiedades y eventos con un contenedor de prueba para obtener información acerca de cómo acceder al contenedor de prueba.

Consulte también

Controles ActiveX de MFC
Controles ActiveX MFC: Usar fuentes
Controles ActiveX MFC: Páginas de propiedades