Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Os controles ActiveX são a versão atualizada da especificação de controle OLE.
Importante
O ActiveX é uma tecnologia herdada que não deve ser usada para o novo desenvolvimento. Para obter mais informações, confira Controles ActiveX.
Os controles são uma arquitetura primária para desenvolver 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. Controles em uma página da Web podem se comunicar entre si usando scripts.
Os controles ActiveX não estão limitados à Internet. Um controle ActiveX também pode ser usado em qualquer contêiner, desde que o controle dê suporte às interfaces exigidas por esse contêiner.
Os controles ActiveX têm várias vantagens, incluindo:
Menos interfaces necessárias do que os controles OLE anteriores.
A capacidade de ser sem janelas e sempre ativo no local.
Para ser um controle ActiveX, um controle deve:
Dê suporte à
IUnknowninterface.Seja um objeto COM.
Exportar DLLRegisterServer e DLLUnRegisterServer.
Dê suporte a interfaces adicionais conforme necessário para a funcionalidade.
Tornando seus controles existentes Internet-Friendly
A criação de 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 tomar para tornar o tamanho do código menor e fazer com que suas 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.
Ser assíncrono; não mantenha outros programas em espera.
Baixe dados em blocos pequenos.
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 de forma cooperativa com outros controles que também podem estar recuperando dados. O código também pode ser baixado de forma assíncrona.
Baixe o código e as 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 as propriedades quanto os 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 para baixar o método. 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 executar o tempo inativo.
Controles de botão pequeno e rótulo, 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 de progresso no download assíncrono, inclusive 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 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 as propriedades de controle de forma assíncrona, siga estas etapas:
Para criar seu projeto usando o Assistente de Controle ActiveX do MFC
Clique em Novo no menu Arquivo .
Selecione o Assistente de Controle ActiveX do MFC nos projetos do Visual Studio C++ e nomeie seu projeto.
Na página Configurações de Controle , selecione Carregar propriedades de forma assíncrona. Selecionar essa opção configura a propriedade de estado pronto e o evento de estado pronto alterado para você.
Você também pode selecionar outras otimizações, como a ativação sem janelas, que é descrita em Controles ActiveX: Otimização.
Selecione Concluir para criar o projeto.
Para criar uma classe derivada de CDataPathProperty
Criar uma classe derivada de
CDataPathProperty.Em cada um dos arquivos de origem que incluem o arquivo de cabeçalho para o controle, adicione o arquivo de cabeçalho para essa classe antes dele.
Nesta classe, substitua
OnDataAvailable. Essa função é chamada sempre que os dados estão disponíveis para exibição. À medida que os dados ficam disponíveis, você pode lidar com eles da maneira que escolher, por exemplo, renderizando-os progressivamente.O trecho de código abaixo é um exemplo simples de exibir dados progressivamente em um controle de edição. Observe que o uso do sinalizador BSCF_FIRSTDATANOTIFICATION para limpar o controle 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 controle for alterado (por exemplo, do carregamento para inicializado ou interativo do usuário), chame
COleControl::InternalSetReadyState. Se o controle tiver apenas uma propriedade de caminho de dados, você poderá adicionar código no BSCF_LASTDATANOTIFICATION para notificar o contêiner de que o download foi concluído. Por exemplo:if (bscfFlag & BSCF_LASTDATANOTIFICATION) { GetControl()->InternalSetReadyState(READYSTATE_COMPLETE); }Substituir
OnProgress. EmOnProgress, você passa um número mostrando o intervalo máximo e um número mostrando o quão longe o download atual está. Você pode usar esses números para exibir o status, como porcentagem concluída para o usuário.
O próximo procedimento adiciona uma propriedade ao controle para usar a classe derivada.
Para adicionar uma propriedade
No Modo de Exibição de Classe, clique com o botão direito do mouse na interface abaixo 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 de membro da classe
CDataPathPropertyderivada para sua classe de controle 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(); }No DoPropExchange, adicione a seguinte linha:
PX_DataPath(pPX, _T("DataPath"), EditControlText);Substitua ResetData para notificar a propriedade para redefinir seu controle adicionando esta linha:
EditControlText.ResetData();
Decidir se deseja derivar de CDataPathProperty ou CCachedDataPathProperty
O exemplo anterior descreve as etapas para derivar a propriedade do controle de CDataPathProperty. Essa é uma boa opção se você estiver baixando dados em tempo real que são alterados 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 escala 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 renderiza progressivamente um bitmap. Nesse caso, a classe tem uma variável de membro que contém seus dados:
CMemFile m_Cache;
Em sua classe de controle ActiveX, você pode usar esse arquivo mapeado de OnDraw memória para exibir os dados. Na classe derivada do controle CCachedDataPathPropertyActiveX, substitua a função OnDataAvailable 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();
}
Baixar dados de forma assíncrona usando controles ActiveX
O download de dados em 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 a leitura for chamada de forma assíncrona em um arquivo 1K, a leitura não bloqueará, mas retornará com os 10 bytes disponíveis no momento.
Você implementa monikers assíncronos usando a CAsyncMonikerFile classe. No entanto, os controles ActiveX podem usar a CDataPathProperty classe, que é derivada de CAsyncMonikerFile, para ajudar a implementar propriedades de controle assíncronas.
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 o controle OLE foi criado com uma versão do Visual C++ antes da 4.2, há etapas que você pode executar para melhorar seu desempenho e aprimorar sua funcionalidade. Para obter uma discussão detalhada sobre essas 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 pronta e o ReadyStateChange evento por conta própria. No construtor do controle, adicione:
m_lReadyState = READYSTATE_LOADING;
Você atualizará o estado pronto à medida que o código for baixado chamando COleControl::InternalSetReadyState. Um lugar que você pode chamar InternalSetReadyState é da OnProgress substituição da CDataPathPropertyclasse derivada.
Consulte também
Tarefas de programação da Internet do MFC
Noções básicas de programação da Internet do MFC