Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Os controles ActiveX são a versão atualizada da especificação de controle OLE.
Importante
ActiveX é uma tecnologia herdada que não deve ser usada para novos desenvolvimentos. Para obter mais informações, consulte Controles ActiveX.
Os controles são uma arquitetura primária para o desenvolvimento de componentes de software programáveis que podem ser usados em uma variedade de contêineres diferentes, incluindo navegadores da Web com reconhecimento de COM na Internet. Qualquer controle ActiveX pode ser um controle da Internet e pode adicionar sua funcionalidade a um documento ativo ou fazer parte de uma página da Web. Os controles em uma página da Web podem se comunicar uns com os outros usando scripts.
Os controlos ActiveX não estão limitados à Internet. Um controle ActiveX também pode ser usado em qualquer contêiner, desde que o controle ofereça suporte às interfaces exigidas por esse contêiner.
Os controlos ActiveX têm várias vantagens, incluindo:
Menos interfaces necessárias do que os controles OLE anteriores.
A capacidade de funcionar sem janelas e estar sempre ativo no local.
Para ser um controle ActiveX, um controle deve:
Suporte a
IUnknowninterface.Seja um objeto COM.
Exporte DLLRegisterServer e DLLUnRegisterServer.
Suporta interfaces adicionais conforme necessário para a funcionalidade.
Tornando seus controles existentes Internet-Friendly
Projetar um controle que funcionará bem em um ambiente de Internet requer consideração para as taxas de transmissão relativamente baixas na Internet. Você pode usar seus controles existentes; No entanto, há etapas que você deve seguir para tornar o tamanho do código menor e fazer com que as propriedades de controle sejam baixadas de forma assíncrona.
Para melhorar o desempenho de seus controles, siga estas dicas sobre considerações de eficiência:
Implemente as técnicas descritas no artigo Controles ActiveX: Otimização.
Considere como um controle é instanciado.
Seja assíncrono; não bloqueie outros programas.
Download de dados em pequenos blocos.
Ao baixar grandes fluxos, como bitmaps ou dados de vídeo, acesse os dados de um controle de forma assíncrona em cooperação com o contêiner. Recupere os dados de forma incremental ou progressiva, trabalhando cooperativamente com outros controles que também podem estar recuperando dados. O código também pode ser baixado de forma assíncrona.
Faça o download do código e das propriedades em segundo plano.
Torne-se ativo na interface do usuário o mais rápido possível.
Considere como os dados persistentes são armazenados, tanto propriedades quanto BLOBs de dados grandes (como uma imagem bitmap ou dados de vídeo).
Controles com quantidades significativas de dados persistentes, como bitmaps grandes ou arquivos AVI, exigem atenção cuidadosa ao método de download. Um documento ou página pode ficar visível o mais rápido possível e permitir que o usuário interaja com a página enquanto os controles recuperam dados em segundo plano.
Escreva rotinas eficientes para manter o tamanho do código e o tempo de execução reduzidos.
Controles de botões e rótulos pequenos, com apenas alguns bytes de dados persistentes, são adequados para uso no ambiente da Internet e funcionam bem dentro de navegadores.
Considere que o progresso é comunicado ao contêiner.
Notifique o contêiner sobre o progresso no download assíncrono, incluindo quando o usuário pode começar a interagir com uma página e quando o download for concluído. O contêiner pode exibir o progresso (como a porcentagem concluída) para o usuário.
Considere como os controles são registrados no computador cliente.
Criando um novo controle ActiveX
Ao criar um novo controle usando o Assistente de Aplicativo, você pode optar por habilitar o suporte para monikers assíncronos, bem como outras otimizações. Para adicionar suporte para baixar propriedades de controle de forma assíncrona, siga estas etapas:
Para criar seu projeto usando o Assistente de controle ActiveX MFC
Clique em Novo no menu Arquivo .
Selecione MFC ActiveX Control Wizard nos projetos do Visual Studio C++ e nomeie seu projeto.
Na página Configurações de Controle , selecione Carrega propriedades de forma assíncrona. Selecionar esta opção configura a propriedade de estado pronto e o evento de alteração de estado pronto para si.
Você também pode selecionar outras otimizações, como a ativação sem janelas, que é descrita em Controles ActiveX: Otimização.
Escolha Concluir para criar o projeto.
Para criar uma classe derivada de CDataPathProperty
Crie uma classe derivada de
CDataPathProperty.Em cada um dos seus arquivos de origem que inclui o arquivo de cabeçalho para seu controle, adicione o arquivo de cabeçalho para esta classe antes dele.
Nesta classe, substitua
OnDataAvailable. Esta função é chamada sempre que os dados estão disponíveis para exibição. À medida que os dados ficam disponíveis, você pode tratá-los da maneira que quiser, por exemplo, renderizando-os progressivamente.O trecho de código abaixo é um exemplo simples de exibição progressiva de dados em um controle de edição. Observe o uso do flag BSCF_FIRSTDATANOTIFICATION para limpar o controlo de edição.
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); } } }Observe que você deve incluir AFXCMN. H para usar a
CListCtrlclasse.Quando o estado geral do seu controle mudar (por exemplo, de carregamento para inicializado ou interativo pelo usuário), chame
COleControl::InternalSetReadyState. Se seu controle tiver apenas uma propriedade de caminho de dados, você poderá adicionar código em BSCF_LASTDATANOTIFICATION para notificar o contêiner de que o download foi concluído. Por exemplo:if (bscfFlag & BSCF_LASTDATANOTIFICATION) { GetControl()->InternalSetReadyState(READYSTATE_COMPLETE); }Anule
OnProgress. NoOnProgress, é-lhe fornecido um número que mostra o alcance máximo e um número que indica o progresso atual do download. Você pode usar esses números para exibir status como porcentagem concluída para o usuário.
O próximo procedimento adiciona uma propriedade ao controle para usar a classe recém-derivada.
Para adicionar uma propriedade
Na Vista de Classe, clique com o botão direito do rato na interface por baixo do nó da biblioteca e selecione Adicionar e, em seguida, Adicionar Propriedade. Isso iniciará o Assistente para Adicionar Propriedade.
No Assistente para Adicionar Propriedade, selecione o botão de opção Definir/Obter Métodos , digite o Nome da Propriedade, por exemplo, EditControlText, e selecione BSTR como o Tipo de Propriedade.
Clique em Concluir.
Declare uma variável membro da sua classe derivada de
CDataPathPropertyna sua classe de controlo ActiveX.CMyDataPathProperty EditControlText;Implemente os
Get/Setmétodos. ParaGet, retorne a cadeia de caracteres. ParaSet, carregue a propriedade e chameSetModifiedFlag.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(); }Em DoPropExchange, adicione a seguinte linha:
PX_DataPath(pPX, _T("DataPath"), EditControlText);Sobreponha ResetData para notificar a propriedade de que deve redefinir o seu controlo ao adicionar esta linha:
EditControlText.ResetData();
Decidindo se derivar de CDataPathProperty ou CCachedDataPathProperty
O exemplo anterior descreve as etapas para derivar a propriedade do controle de CDataPathProperty. Esta é uma boa escolha se você estiver baixando dados em tempo real que mudam com frequência e para os quais você não precisa manter todos os dados, mas apenas o valor atual. Um exemplo é um controle de ticker de ações.
Você também pode derivar de CCachedDataPathProperty. Nesse caso, os dados baixados são armazenados em cache em um arquivo de memória. Essa é uma boa opção se você precisar manter todos os dados baixados — por exemplo, um controle que processa progressivamente um bitmap. Nesse caso, a classe tem uma variável membro contendo seus dados:
CMemFile m_Cache;
Na sua classe de controle ActiveX, pode usar este arquivo de memória mapeada em OnDraw para exibir os dados. Em sua classe derivada do controle CCachedDataPathPropertyActiveX, substitua a função OnDataAvailable de membro e invalide o controle, depois de chamar a implementação da classe base.
void CMyCachedDataPathProperty::OnDataAvailable(DWORD dwSize, DWORD bscfFlag)
{
CCachedDataPathProperty::OnDataAvailable(dwSize, bscfFlag);
GetControl()->InvalidateControl();
}
Download de dados de forma assíncrona usando controles ActiveX
O download de dados através de uma rede deve ser feito de forma assíncrona. A vantagem de fazer isso é que, se uma grande quantidade de dados for transferida ou se a conexão for lenta, o processo de download não bloqueará outros processos no cliente.
Os monikers assíncronos fornecem uma maneira de baixar dados de forma assíncrona em uma rede. Uma operação de leitura em um moniker assíncrono retorna imediatamente, mesmo que a operação não tenha sido concluída.
Por exemplo, se apenas 10 bytes estiverem disponíveis e Read for chamado de forma assíncrona em um arquivo 1K, Read não bloqueará, mas retornará com os 10 bytes atualmente disponíveis.
Você implementa monikers assíncronos usando a classe CAsyncMonikerFile. No entanto, os controles ActiveX podem usar a classe CDataPathProperty, que é derivada de CAsyncMonikerFile, para ajudar a implementar propriedades de controle assíncrono.
Exibindo um controle em uma página da Web
Aqui está um exemplo de uma marca de objeto e atributos para inserir um controle em uma página da 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>
Atualizando um controle OLE existente para usar novos recursos de controle ActiveX
Se seu controle OLE foi criado com uma versão do Visual C++ anterior à 4.2, há etapas que você pode tomar para melhorar seu desempenho e aprimorar sua funcionalidade. Para obter uma discussão detalhada dessas alterações, consulte Controles ActiveX: otimização.
Se você estiver adicionando suporte de propriedade assíncrona a um controle existente, precisará adicionar a propriedade de estado pronto e o ReadyStateChange evento por conta própria. No construtor para o seu controlo, adicione:
m_lReadyState = READYSTATE_LOADING;
Você atualizará o estado pronto à medida que seu código for baixado chamando COleControl::InternalSetReadyState. Um local que se pode chamar InternalSetReadyState é no método de substituição da classe derivada OnProgress do CDataPathProperty.
Ver também
Tarefas de programação da Internet MFC
MFC Noções básicas de programação para Internet