Compartir a través de


Controles ActiveX en Internet

Los controles ActiveX son la versión actualizada de la especificación de control OLE.

Importante

ActiveX es una tecnología heredada que no se debe usar para el desarrollo nuevo. Para obtener más información, consulte Controles ActiveX.

Los controles son una arquitectura principal para desarrollar componentes de software programables que se pueden usar en una variedad de contenedores diferentes, incluidos los exploradores web compatibles con COM en Internet. Cualquier control ActiveX puede ser un control de Internet y puede agregar su funcionalidad a un documento activo o formar parte de una página web. Los controles de una página web pueden comunicarse entre sí mediante scripting.

Los controles ActiveX no se limitan a Internet. Un control ActiveX también se puede usar en cualquier contenedor, siempre y cuando el control admita las interfaces requeridas por ese contenedor.

Los controles ActiveX tienen varias ventajas, entre las que se incluyen:

  • Menos interfaces necesarias que los controles OLE anteriores.

  • La capacidad de estar sin ventanas y estar siempre activa.

Para ser un control ActiveX, un control debe:

  • Admita la IUnknown interfaz .

  • Ser un objeto COM.

  • Exporte DLLRegisterServer y DLLUnRegisterServer.

  • Admita interfaces adicionales según sea necesario para la funcionalidad.

Hacer que los controles existentes Internet-Friendly

Diseñar un control que funcione bien en un entorno de Internet requiere tener en cuenta las tasas de transmisión relativamente bajas en Internet. Puede usar los controles existentes; Sin embargo, hay pasos que debe seguir para que el tamaño del código sea más pequeño y para que las propiedades de control se descarguen de forma asincrónica.

Para mejorar el rendimiento de los controles, siga estas sugerencias sobre consideraciones de eficiencia:

  • Implemente las técnicas descritas en el artículo Controles ActiveX: Optimización.

  • Considere cómo se crea una instancia de un control.

  • Ser asincrónico; no sostenga otros programas.

  • Descargue datos en bloques pequeños.

    Al descargar secuencias de gran tamaño, como mapas de bits o datos de vídeo, accede a los datos de un control de forma asincrónica en cooperación con el contenedor. Recupere los datos de forma incremental o progresiva, trabajando de forma cooperativa con otros controles que también puedan recuperar datos. El código también se puede descargar de forma asincrónica.

  • Descargue el código y las propiedades en segundo plano.

  • Vuelva activa la interfaz de usuario lo antes posible.

  • Tenga en cuenta cómo se almacenan los datos persistentes, tanto las propiedades como los blobs de datos grandes (como una imagen de mapa de bits o datos de vídeo).

    Los controles con cantidades significativas de datos persistentes, como mapas de bits grandes o archivos AVI, requieren una atención cuidadosa para descargar el método. Un documento o página se puede ver lo antes posible y permitir que el usuario interactúe con la página mientras los controles recuperan datos en segundo plano.

  • Escriba rutinas eficaces para mantener el tamaño del código y el tiempo de ejecución inactivos.

    Los controles pequeños de botón y etiqueta, con solo unos pocos bytes de datos persistentes, son adecuados para su uso en el entorno de Internet y funcionan bien dentro de los exploradores.

  • Considere la posibilidad de que el progreso se comunique con el contenedor.

    Notifique al contenedor de progreso en la descarga asincrónica, incluido cuando el usuario pueda empezar a interactuar con una página y cuando se complete la descarga. El contenedor puede mostrar el progreso (por ejemplo, el porcentaje completado) al usuario.

  • Tenga en cuenta cómo se registran los controles en el equipo cliente.

Crear un nuevo control ActiveX

Al crear un nuevo control mediante el Asistente para aplicaciones, puede optar por habilitar la compatibilidad con monikers asincrónicos, así como otras optimizaciones. Para agregar compatibilidad para descargar las propiedades de control de forma asincrónica, siga estos pasos:

Para crear el proyecto mediante el Asistente para controles ActiveX de MFC

  1. Haga clic en Nuevo en el menú Archivo .

  2. Seleccione Asistente para controles ActiveX de MFC en los proyectos de Visual Studio C++ y asigne un nombre al proyecto.

  3. En la página Configuración de control , seleccione Carga de propiedades de forma asincrónica. Al seleccionar esta opción, se configura la propiedad ready state y el evento ready state changed automáticamente.

    También puede seleccionar otras optimizaciones, como la activación sin ventanas, que se describe en Controles ActiveX: Optimización.

  4. Haga clic en Finalizar para crear el proyecto.

Para crear una clase derivada de CDataPathProperty

  1. Cree una clase derivada de CDataPathProperty.

  2. En cada uno de los archivos de código fuente que incluye el archivo de encabezado del control, agregue el archivo de encabezado para esta clase antes que él.

  3. En esta clase, invalide OnDataAvailable. Se llama a esta función cada vez que los datos están disponibles para mostrarse. A medida que los datos estén disponibles, puede controlarlo de cualquier manera que elija, por ejemplo, mediante la representación progresiva.

    El fragmento de código siguiente es un ejemplo sencillo de mostrar progresivamente los datos en un control de edición. Tenga en cuenta el uso de la marca BSCF_FIRSTDATANOTIFICATION para borrar el control de edición.

    void CMyDataPathProperty::OnDataAvailable(DWORD dwSize, DWORD bscfFlag)
    {
       CListCtrl list_ctrl;
       CEdit *edit = list_ctrl.GetEditControl();
       if ((bscfFlag & BSCF_FIRSTDATANOTIFICATION) && edit->m_hWnd)
       {
          edit->SetSel(0, -1);
          edit->Clear();
       }
    
       if (dwSize > 0)
       {
          CString string;
          LPTSTR str = string.GetBuffer(dwSize);
          UINT nBytesRead = Read(str, dwSize);
          if (nBytesRead > 0)
          {
             string.ReleaseBuffer(nBytesRead);
             edit->SetSel(-1, -1);
             edit->ReplaceSel(string);
          }
       }
    }
    

    Tenga en cuenta que debe incluir AFXCMN. H para usar la CListCtrl clase .

  4. Cuando cambie el estado general del control (por ejemplo, desde la carga hasta inicializado o interactivo por el usuario), llame a COleControl::InternalSetReadyState. Si el control tiene solo una propiedad de ruta de acceso de datos, puede agregar código en BSCF_LASTDATANOTIFICATION para notificar al contenedor que se ha completado la descarga. Por ejemplo:

    if (bscfFlag & BSCF_LASTDATANOTIFICATION)
    {
       GetControl()->InternalSetReadyState(READYSTATE_COMPLETE);
    }
    
  5. Sobrescriba OnProgress. En OnProgress, se pasa un número que muestra el intervalo máximo y un número que muestra la distancia a lo largo de la descarga actual. Puede usar estos números para mostrar el estado, como el porcentaje completado para el usuario.

El siguiente procedimiento agrega una propiedad al control para usar la clase derivada.

Para agregar una propiedad

  1. En Vista de clases, haga clic con el botón derecho en la interfaz debajo del nodo de biblioteca y seleccione Agregar y, a continuación, Agregar propiedad. Se iniciará el Asistente para agregar propiedades.

  2. En el Asistente para agregar propiedades, seleccione el botón de radio Establecer/Obtener métodos , escriba el nombre de propiedad, por ejemplo, EditControlText y seleccione BSTR como tipo de propiedad.

  3. Haga clic en Finalizar

  4. Declare una variable miembro de la CDataPathPropertyclase derivada en la clase de control ActiveX.

    CMyDataPathProperty EditControlText;
    
  5. Implemente los Get/Set métodos. Para Get, devuelva la cadena. Para Set, cargue la propiedad y llame a SetModifiedFlag.

    BSTR CMFCActiveXControlCtrl::GetEditControlText(void)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       CString strResult;
       strResult = EditControlText.GetPath();
       return strResult.AllocSysString();
    }
    
    void CMFCActiveXControlCtrl::SetEditControlText(LPCTSTR newVal)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       Load(newVal, EditControlText);
       SetModifiedFlag();
    }
    
  6. En DoPropExchange, agregue la siguiente línea:

    PX_DataPath(pPX, _T("DataPath"), EditControlText);
    
  7. Invalide ResetData para notificar a la propiedad que restablezca su control agregando esta línea:

    EditControlText.ResetData();
    

Decidir si se debe derivar de CDataPathProperty o CCachedDataPathProperty

En el ejemplo anterior se describen los pasos para derivar la propiedad del control de CDataPathProperty. Esta es una buena opción si va a descargar datos en tiempo real que cambian con frecuencia y para los que no es necesario mantener todos los datos, sino solo el valor actual. Un ejemplo es un control de ticker de stock.

También puede derivar de CCachedDataPathProperty. En este caso, los datos descargados se almacenan en caché en un archivo de memoria. Esta es una buena opción si necesita mantener todos los datos descargados; por ejemplo, un control que representa progresivamente un mapa de bits. En este caso, la clase tiene una variable miembro que contiene los datos:

CMemFile m_Cache;

En la clase de control ActiveX, puede usar este archivo asignado a memoria en OnDraw para mostrar los datos. En la clase derivada del control CCachedDataPathPropertyActiveX, invalide la función OnDataAvailable miembro y invalide el control, después de llamar a la implementación de la clase base.

void CMyCachedDataPathProperty::OnDataAvailable(DWORD dwSize, DWORD bscfFlag)
{
   CCachedDataPathProperty::OnDataAvailable(dwSize, bscfFlag);
   GetControl()->InvalidateControl();
}

Descargar datos de forma asincrónica mediante controles ActiveX

La descarga de datos a través de una red debe realizarse de forma asincrónica. La ventaja de hacerlo es que si se transfiere una gran cantidad de datos o si la conexión es lenta, el proceso de descarga no bloqueará otros procesos en el cliente.

Los monikers asincrónicos proporcionan una manera de descargar datos de forma asincrónica a través de una red. Una operación de lectura en un moniker asincrónico devuelve inmediatamente, incluso si no se ha completado la operación.

Por ejemplo, si solo hay 10 bytes disponibles y se llama a Read de forma asincrónica en un archivo 1K, Read no se bloquea, sino que devuelve con los 10 bytes disponibles actualmente.

Los monikers asincrónicos se implementan mediante la CAsyncMonikerFile clase . Sin embargo, los controles ActiveX pueden usar la CDataPathProperty clase , que se deriva de CAsyncMonikerFile, para ayudar a implementar propiedades de control asincrónicas.

Mostrar un control en una página web

Este es un ejemplo de una etiqueta de objeto y atributos para insertar un control en una página web.

<OBJECT
  CLASSID="clsid:FC25B780-75BE-11CF-8B01-444553540000"
  CODEBASE="/ie/download/activex/iechart.ocx"
  ID=chart1
  WIDTH=400
  HEIGHT=200
  ALIGN=center
  HSPACE=0
  VSPACE=0>
  <PARAM NAME="BackColor" value="#ffffff"/>
  <PARAM NAME="ForeColor" value="#0000ff"/>
  <PARAM NAME="url" VALUE="/ie/controls/chart/mychart.txt"/>
</OBJECT>

Actualización de un control OLE existente para usar nuevas características de control ActiveX

Si el control OLE se creó con una versión de Visual C++ anterior a la 4.2, hay pasos que puede seguir para mejorar su rendimiento y mejorar su funcionalidad. Para obtener una explicación detallada de estos cambios, consulte Controles ActiveX: Optimización.

Si va a agregar compatibilidad asincrónica con propiedades a un control existente, deberá agregar la propiedad de estado lista y el ReadyStateChange evento usted mismo. En el constructor del control, agregue:

m_lReadyState = READYSTATE_LOADING;

Actualizará el estado listo a medida que se descargue el código llamando a COleControl::InternalSetReadyState. Un lugar al que podría llamar InternalSetReadyState es desde la OnProgress invalidación de CDataPathPropertyla clase derivada.

Consulte también

Tareas de programación de Internet de MFC
Conceptos básicos de programación de Internet de MFC