Compartir a través de


Controles ActiveX de 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 uno de un grupo de tipos comunes a algunos controles ActiveX. El tipo de imagen controla los metarchivos, mapas de bits o iconos y permite al usuario especificar una imagen que se va a mostrar en un control ActiveX. Las propiedades de imagen personalizada se implementan mediante un objeto de imagen y las funciones Get/Set que permiten al usuario controlar el acceso a la propiedad Picture. Controlar que los usuarios accedan a la propiedad Picture personalizada mediante la página de propiedades Picture de stock.

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

Las clases de control ActiveX proporcionan varios componentes que puede usar para implementar la propiedad Picture dentro del control. Estos componentes incluyen:

  • La clase CPictureHolder .

    Esta clase proporciona acceso sencillo al objeto de imagen y a la funcionalidad del elemento mostrado por la propiedad Picture personalizada.

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

    Con la vista de clases, puede agregar rápidamente una propiedad personalizada o propiedades que admita el tipo de imagen. Para obtener más información sobre cómo agregar propiedades de control ActiveX con la vista de clases, consulte el artículo Controles ActiveX de MFC: Propiedades.

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

    Esta página de propiedades forma parte de un grupo de páginas de propiedades de stock disponibles para los controles ActiveX. Para obtener más información sobre las páginas de propiedades del control ActiveX, consulte el artículo Controles ActiveX de MFC: Uso de páginas de propiedades de stock.

Implementación de una propiedad de imagen personalizada en el control ActiveX

Cuando haya completado los pasos descritos en esta sección, el control puede mostrar imágenes elegidas por su usuario. El usuario puede cambiar la imagen mostrada mediante una página de propiedades que muestre la imagen actual y tenga un botón Examinar que permita al usuario seleccionar imágenes diferentes.

Una propiedad Picture personalizada se implementa mediante un proceso similar al que se usa para implementar otras propiedades, la principal diferencia es que la propiedad personalizada debe admitir un tipo picture. Dado que el elemento de la propiedad Picture debe dibujarse mediante el control ActiveX, se deben realizar varias adiciones y modificaciones en la propiedad para poder implementarse por completo.

Para implementar una propiedad Picture personalizada, debe hacer lo siguiente:

Adiciones al proyecto de control

Para agregar el identificador de página de propiedades de la página de propiedades Picture estándar, inserte la siguiente línea 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 count de la macro de BEGIN_PROPPAGEIDS en uno. En la línea siguiente se muestra lo siguiente:

BEGIN_PROPPAGEIDS(CMyAxPicCtrl, 2)

Para agregar el CPictureHolder miembro de datos a la clase de control, inserte la siguiente línea en la sección protegida de la declaración de clase de control en el archivo de encabezado de 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 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, a continuación, Agregar propiedad.

  5. En el cuadro Nombre de propiedad, escriba el nombre de la propiedad. Por ejemplo, ControlPicture se usa en este procedimiento.

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

  7. En Tipo de implementación, haga clic en Obtener o establecer métodos.

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

  9. Haga clic en Finalizar

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

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

Además, el código siguiente se insertó en el mapa de distribución de la implementación del control (. Archivo CPP):

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

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

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 función y clase de control pueden diferir del ejemplo anterior.

Modificaciones en el proyecto de control

Después de realizar las adiciones necesarias al 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 Picture personalizada se encuentran en el archivo de implementación de control. (Tenga en cuenta que en este ejemplo, la clase de control se denomina , el CPictureHolder miembro de datos se denomina CSampleCtrlm_pic y el nombre de la propiedad de imagen personalizada es ControlPicture).

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

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

Esto establece la imagen del control en una imagen en blanco.

Para dibujar la imagen correctamente, realice una llamada a CPictureHolder::Render en la función de control OnDraw . Modifique la función para que se parezca al 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 Picture personalizada del control, agregue las líneas siguientes:

m_pic.SetPictureDispatch(pVal);
InvalidateControl();

La propiedad picture debe ser persistente para que la información agregada en tiempo de diseño se muestre en tiempo de ejecución. Agregue la siguiente línea a la función de DoPropExchange la COleControlclase derivada:

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

Nota:

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

Después de completar las modificaciones, recompile el proyecto para incorporar la nueva funcionalidad de la propiedad Picture personalizada y usar El contenedor de pruebas 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 de MFC: Usar fuentes
Controles ActiveX de MFC: Páginas de propiedades