Controles de ActiveX na Internet
Controles de ActiveX são a versão atualizada da especificação de controle OLE.Os controles são uma arquitetura principal para o desenvolvimento de componentes de software programável que podem ser usados em uma variedade de diferentes recipientes, incluindo navegadores ciente de COM a Internet.Qualquer controle de ActiveX pode ser um controle da Internet e podem adicionar funcionalidade a um documento ativo ou ser parte de uma página da Web.Controles em uma página da Web podem se comunicar entre si usando scripts.
Controles de ActiveX não são limitados à Internet.Um controle de ActiveX pode ser usado em qualquer recipiente, como o controle suporta as interfaces necessárias pelo recipiente.
Controles de ActiveX têm várias vantagens, incluindo:
Menos necessário interfaces que controles OLE anteriores.
Capacidade de ser sem janelas e sempre in-loco ativo.
Para ser um controle ActiveX, um controle deve:
Suporte a IUnknown interface.
Ser um objeto COM.
Exportar DLLRegisterServer e DLLUnRegisterServer.
Suporte a interfaces adicionais conforme necessário para a funcionalidade.
Tornando seus controles existentes amigável de Internet
Criando um controle que funcione bem em um ambiente de Internet requer consideração para as taxas de transmissão relativamente baixas na Internet.Você pode usar os controles existentes; No entanto, há etapas que você deve tomar para diminuir o tamanho do código e fazer com que suas propriedades de controle download de forma assíncrona.
Para melhorar o desempenho de seus controles, siga estas dicas sobre considerações de eficiência:
Implementar as técnicas descritas no artigo ActiveX controles: otimização.
Considere como um controle é instanciado.
Ser assíncrona; não conter backup de outros programas.
Download de dados em pequenos blocos.
Ao baixar o fluxos muito grandes, como bitmaps ou dados de vídeo, acesse os dados do controle assincronamente em cooperação com o contêiner.Recupere dados de modo incremental ou progressivo, trabalhar cooperativamente com outros controles também podem recuperar dados.Código também pode ser baixando assincronamente.
Baixe código e propriedades de plano de fundo.
Torne-se a interface do usuário ativa o mais rápido possível.
Considere como os dados persistentes são armazenados, propriedades e dados grandes BLOBs (como um dados bitmap de imagem ou vídeo).
Controles com quantidades significativas de dados persistentes, como bitmaps grandes ou arquivos AVI, exigem atenção para o método de download.Um documento ou página pode se tornam visível assim que possível e permitir que o usuário interaja com a página enquanto controles recuperam dados em segundo plano.
Escreva rotinas eficientes para manter o tamanho do código e tempo de execução para baixo.
Pequenos controles de botão e rótulo, com apenas alguns bytes de dados persistentes, são adequados para uso no ambiente de Internet e trabalho bem em navegadores.
Considere a possibilidade de progresso é comunicado ao contêiner.
Notifica o contêiner do andamento do 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 andamento (como porcentagem concluída) para o usuário.
Considere como os controles são registrados no computador cliente.
Criar um novo controle de ActiveX
Ao criar um novo controle usando o Assistente de aplicativo, você pode escolher habilitar o suporte para identificadores de origem assíncronas, 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 de ActiveX do MFC
Clique em New sobre o arquivo menu.
Selecione Assistente de controle MFC ActiveX do Visual C++ projetos e nomeie o projeto.
Sobre o Configurações de controle de página, selecione carrega propriedades assincronamente.Esta opção define a propriedade de estado de pronto e o evento pronto estado alterado para você.
Você também pode selecionar outras otimizações, como ativação sem janelas, que é descrito em ActiveX controles: otimização.
Escolha 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 inclui o arquivo de cabeçalho para o seu controle, adicione o arquivo de cabeçalho para esta classe antes dele.
Nesta classe, substituir OnDataAvailable.Essa função é chamada sempre que os dados estão disponíveis para exibição.Como os dados se tornam disponíveis, você pode manipular qualquer forma que você escolher, por exemplo por progressivamente processamento-lo.
O trecho de código abaixo é um exemplo simples de progressivamente exibir dados em um controle de edição.Observe o uso do sinalizador de 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 o CListCtrl classe.
Quando o controle geral do estado alterado (por exemplo, de carregamento para inicializado ou usuário interativo), chamada COleControl::InternalSetReadyState.Se seu controle tem a propriedade de caminho de dados apenas uma, você pode adicionar código em BSCF_LASTDATANOTIFICATION para notificar o contêiner que o download for concluído.Por exemplo:
if (bscfFlag & BSCF_LASTDATANOTIFICATION) { GetControl()->InternalSetReadyState(READYSTATE_COMPLETE); }
Substitua OnProgress.Em OnProgress, são passados um número mostrando o intervalo máximo e é um número mostrando quanto junto o download atual.Você pode usar esses números para exibir o status como porcentagem concluída para o usuário.
O procedimento a seguir adiciona uma propriedade para o controle para usar a classe derivada apenas.
Para adicionar uma propriedade
Em Class View, clique com o botão direito na interface sob o nó de biblioteca e selecione Add, em seguida, Adicionar propriedade.Isso iniciará o Assistente para adicionar propriedade.
No Assistente para adicionar propriedade, selecione o Métodos Get/Set botão de opção, digite o Nome de propriedade, por exemplo, EditControlText e selecionar BSTR como o tipo de propriedade.
Clique em Concluir.
Declare uma variável de membro de sua CDataPathProperty-classe derivada para sua classe de controle de ActiveX.
CMyDataPathProperty EditControlText;
Implementar a Get/Set métodos.Para obter, retornar a seqüência de caracteres.Para Set, carregar a propriedade e a chamada 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(); }
Em DoPropExchange, adicione a seguinte linha:
PX_DataPath(pPX, _T("DataPath"), EditControlText);
Substituir ResetData para notificar a propriedade redefinir seu controle adicionando esta linha:
EditControlText.ResetData();
Decidir se deve derivar de CDataPathProperty ou CCachedDataPathProperty
O exemplo anterior descreve etapas para derivação de propriedade do controle de CDataPathProperty.Esta é uma boa opção se estiver baixando dados em tempo real que freqüentemente as alterações e para o qual você não precisa manter todos os dados, mas apenas o valor atual.Um exemplo é um controle de bolsa.
Você também pode derivar de CCachedDataPathProperty.Nesse caso, os dados baixados é armazenado em cache em um arquivo de memória.Esta é 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 de membro que contém seus dados:
CMemFile m_Cache;
Na sua classe de controle de ActiveX, você pode usar este arquivo de memória mapeada em OnDraw para exibir os dados.No seu controle de ActiveX CCachedDataPathProperty-derivado classe, substituir a função de membro OnDataAvailable e invalidar 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 de ActiveX
Download de dados em uma rede deve ser feito assincronamente.A vantagem de fazer portanto, é que, se uma grande quantidade de dados é transferida ou se a conexão estiver lenta, o processo de download não irá bloquear outros processos no cliente.
Monikers assíncronas oferecem uma maneira para baixar dados assincronamente em uma rede.Uma operação de leitura em um moniker assíncrono retorna imediatamente, mesmo se a operação não foi concluída.
Por exemplo, se apenas 10 bytes disponíveis e leitura é chamada de forma assíncrona em um arquivo de 1K, leitura não bloquear, mas retorna com as 10 bytes disponíveis no momento.
Implementar monikers assíncronas usando o CAsyncMonikerFile classe.No entanto, podem usar os controles de ActiveX de CDataPathProperty classe, que é derivada de CAsyncMonikerFile, para ajudar a implementar as propriedades de controle assíncrono.
O exemplo ASYNDOWN demonstra como configurar um loop assíncrono usando timers para ler os dados.ASYNDOWN é descrito em detalhes no artigo da Base de Conhecimento "HOWTO: AsyncDown demonstra assíncrono dados Download" (Q177244) e está disponível para download no Centro de Download da Microsoft.(Para obter mais informações sobre como baixar arquivos do Centro de Download da Microsoft, consulte o artigo "Como para obter suporte a arquivos de Serviços Online da Microsoft" (Q119591) na Base de dados de Conhecimento da Microsoft). Você pode encontrar artigos da Base de dados de Conhecimento no CD-ROM do Biblioteca MSDN ou em https://support.microsoft.com/support.
A técnica básica usada em ASYNDOWN é definir um timer no CDataPathProperty::OnDataAvailable para indicar quando os dados estão disponíveis.Quando o timer é recebida, o aplicativo lê em blocos de 128 bytes de dados e preenche um controle de edição.Se dados não estão disponíveis quando a mensagem do timer é manipulada, o cronômetro está desativado.OnDataAvailableativa o timer se mais dados chegam mais tarde.
Exibição de 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 os novos recursos de controle de ActiveX
Se o controle OLE foi criado com uma versão do Visual C++ anteriores à 4.2, há etapas que você pode tomar para melhorar seu desempenho e aprimorar sua funcionalidade.Para obter uma discussão detalhada sobre essas alterações, consulte ActiveX controles: otimização.
Se você estiver adicionando suporte a propriedade assíncrona a um controle existente, você precisará adicionar a propriedade de estado de pronto e o ReadyStateChange evento sozinho.No construtor para o seu controle, adicione:
m_lReadyState = READYSTATE_LOADING;
Você irá atualizar o estado de pronto como seu código é baixado, chamando COleControl::InternalSetReadyState.Um lugar que você poderia chamar InternalSetReadyState do OnProgress substituir de CDataPathProperty-classe derivada.
Em seguida, siga as etapas no criar um novo controle de ActiveX.