Controles ActiveX na Internet
Os controles ActiveX são a versão atualizada da especificação do controle OLE.Os controles são uma arquitetura principal para o desenvolvimento de componentes de software programáveis que podem ser usados em uma variedade de diferentes contêineres, inclusive COM reconhecimento de navegadores da 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 com outros usando scripts.
Os controles ActiveX não são limitados à Internet.Também é possível usar um controle ActiveX em qualquer contêiner, enquanto o controle suporta sistema autônomo interfaces exigidas pelo contêiner.
Os controles ActiveX têm várias vantagens, incluindo:
Menos necessário interfaces que controles OLE anteriores.
A capacidade de ser sem janela e ativo sempre no local.
Para ser um controle ActiveX, um controle necessário:
Suporte a IUnknown interface.
Ser um objeto COM.
Exportar DLLRegisterServer and DLLUnRegisterServer.
Suporte a interfaces adicionais sistema autônomo necessários para a funcionalidade.
Tornando seus controles existentes amigável para Internet
Criar um controle que funcione bem em um ambiente de Internet requer considerações para as taxas de transmissão relativamente baixas na Internet.Você pode usar os controles existentes; no entanto, há etapas que você deve executar para diminuir o dimensionar do código e fazer as propriedades do controle baixar assincronamente.
Para melhorar o desempenho de seus controles, siga estas dicas sobre as considerações de eficiência:
Implementar as técnicas descritas no artigo Controles ActiveX: Otimização de.
Considere como um controle é instanciado.
Ser assíncrono; não conter backup de outros programas.
Faça o baixar de dados em pequenos blocos.
Ao fazer o download de fluxos de grandes, sistema autônomo bitmaps ou dados de vídeo, acessar dados do controle assincronicamente em cooperação com o contêiner.Recupere os dados de modo incremental ou progressivo, cooperativamente trabalhando com outros controles também podem ser recuperação de dados.Também pode ser download de código assincronamente.
Fazer o baixar de código e propriedades no plano de fundo.
Torne-se a interface do usuário ativo sistema autônomo rapidamente sistema autônomo possíveis.
Considere sistema autônomo são armazenados dados persistentes, propriedades e dados grandes BLOBs (sistema autônomo um dados bitmap de imagem ou vídeo).
Controles com uma quantidade significativa de dados persistentes, sistema autônomo arquivos AVI ou de bitmaps grandes exigem atenção cuidadosa para fazer o download de método.Um documento ou página pode se tornar visível sistema autônomo logo sistema autônomo 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 dimensionar do código e time 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 no baixar assíncrono, inclusive quando o usuário pode começar a interagir com uma página e quando o baixar estiver concluído.O contêiner pode exibir progresso (sistema autônomo 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 assíncrono de identificadores de origem, bem sistema autônomo Outros otimizações.Para adicionar suporte para fazer o baixar de propriedades do controle assincronamente, execute as seguintes etapas:
Para criar seu projeto usando o MFC controle ActiveX assistente
clicar New sobre o Arquivo menu.
selecionar Assistente de controle ActiveX MFC do Visual C++ projetos e nomeie o projeto.
Sobre o Configurações de controle página, selecionar Carrega propriedades de forma assíncrona.Esta opção configura a propriedade de estado de pronto e o evento alterado do estado de pronto para você.
Você também pode selecionar outras otimizações, por exemplo, Ativação sem janelas, descrito em Controles ActiveX: Otimização de.
escolher Concluir para criar o projeto.
Para criar uma classe derivada de CDataPathProperty
Criar uma classe derivada de CDataPathProperty.
Em cada um dos arquivos de fonte 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ível para exibição.sistema autônomo dados se torna disponível, você pode manipular qualquer forma que você escolher, por exemplo, progressivamente de renderização-lo.
O trecho de código abaixo é um exemplo simples de progressivamente exibir dados em um controle de edição.Observe o uso do sinalizar BSCF_FIRSTDATANOTIFICATION para desmarcar 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 estado geral do controle for alterada (por exemplo, de carregamento inicializados ou usuário interativo), telefonar COleControl::InternalSetReadyState. Se o controle tiver dados apenas uma propriedade de caminho, você pode adicionar código em BSCF_LASTDATANOTIFICATION para notificar o contêiner de seu baixar for concluído.Por exemplo:
if (bscfFlag & BSCF_LASTDATANOTIFICATION) { GetControl()->InternalSetReadyState(READYSTATE_COMPLETE); }
Substitua OnProgress.In OnProgress, são passadas inúmeros o intervalo máximo e é um número mostrando a distância ao longo de baixar corrente. Você pode usar esses números para exibir o status sistema autônomo 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
In Modo de exibição de classe, clicar com o botão direito do mouse na interface sob o nó da biblioteca e selecionar Adicionar, then Adicionar propriedade.Isso irá iniciar o Adicionar Assistente de propriedade.
No Adicionar Assistente de propriedade, selecionar o conjunto/Get métodos rádio botão, digite o Nome da propriedade, por exemplo, EditControlText e selecionar BSTR sistema autônomo a Tipo de propriedade.
Clique em Finish.
Declare uma variável de membro do seu CDataPathProperty-classe derivada à sua classe de controle ActiveX.
CMyDataPathProperty EditControlText;
Implementar o Obter / conjunto métodos.For Obter, retornar a seqüência de caracteres.For Set, carregar a propriedade e a telefonar 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(); }
In DoPropExchange, adicione a seguinte linha:
PX_DataPath(pPX, _T("DataPath"), EditControlText);
Substituir ResetData para notificar a propriedade para reiniciar o controle adicionando esta linha:
EditControlText.ResetData();
Decidir se é para derive de CDataPathProperty ou CCachedDataPathProperty
O exemplo anterior descreve etapas para a derivação de propriedade do controle de CDataPathProperty. Esta é uma mercadoria opção se você estiver fazendo o download de dados em time real que freqüentemente as alterações e para o qual você não precisa manter todos os dados, mas somente o valor corrente.Um exemplo é um controle de barra de cotação de ações.
Você também pode derivar a partir de CCachedDataPathProperty. Nesse caso, dados baixados são armazenados em cache em um arquivo de memória.Isso é uma mercadoria 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;
No sua classe de controle ActiveX, você pode usar esse arquivo de memória mapeada em OnDraw Para exibir os dados. No seu ActiveX controlar CCachedDataPathProperty-derivada da classe, substituir a função de membro OnDataAvailable e invalidar controle ActiveX, após chamar a implementação da classe base.
void CMyCachedDataPathProperty::OnDataAvailable(DWORD dwSize, DWORD bscfFlag)
{
CCachedDataPathProperty::OnDataAvailable(dwSize, bscfFlag);
GetControl()->InvalidateControl();
}
Baixando dados de forma assíncrona usando controles ActiveX
Fazer download de dados em uma rede deve ser concluído assincronicamente.A vantagem desse procedimento assim, é que se uma grande quantidade de dados é transferida ou se a conexão estiver lenta, o processo de baixar não irá bloco outros processos no cliente.
Monikers assíncrono 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ível e leitura é chamada assincronicamente em um arquivo de 1 K, leitura não bloqueia, mas retorna com as 10 bytes disponível no momento.
Implementar assíncrono de identificadores de origem usando o CAsyncMonikerFile classe. No entanto, os controles ActiveX podem usar o CDataPathProperty classe, que é derivado de CAsyncMonikerFile, para ajudar a implementar propriedades de controle assíncrono.
O exemplo ASYNDOWN demonstra como configurar um loop assíncrono usando temporizadores para ler os dados.ASYNDOWN é descrito em detalhes no artigo da Base de dados de Conhecimento da Microsoft "como: AsyncDown Demonstrates assíncrono dados baixar"(Q177244) e está disponível para baixar no centralizar de baixar da Microsoft.(Para obter mais informações sobre como baixar arquivos da Central de download da Microsoft, consulte o artigo "Como para obter arquivos de online do Atendimento Microsoft" (Q119591) na Base de Dados de Conhecimento Microsoft da Microsoft.) Você encontrará artigos da Base de dados de Conhecimento no CD-ROM Biblioteca MSDN ou em http://suporte.Microsoft.com/suporte.
A técnica básica usada em ASYNDOWN é conjunto um timer no CDataPathProperty::OnDataAvailable para indicar quando os dados estão disponível.Quando o timer de mensagem é recebida, o aplicativo lê em blocos de 128 byte de dados e preenche um controle de edição.Se não houver dados disponível quando a mensagem do timer é manipulada, o cronômetro está desativado.OnDataAvailable ativa o timer de se chegam de mais dados posteriormente.
Exibindo um controle em uma página da Web
Eis 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>
Atualizar um controle OLE existente para usar os novos recursos do controle ActiveX
Se o controle OLE foi criado com uma versão do Visual C++ anteriores à 4.2, há etapas que podem ser tomadas para melhorar seu desempenho e aprimorar sua funcionalidade.Para obter uma discussão detalhada sobre essas alterações, consulte Controles ActiveX: Otimização de.
Se você estiver adicionando suporte a propriedade assíncrono a um controle existente, você precisará adicionar a propriedade de estado de pronto e o ReadyStateChange evento você mesmo. No construtor para o seu controle, adicione:
m_lReadyState = READYSTATE_LOADING;
Você irá atualizar o estado de pronto sistema autônomo seu código é baixado chamando COleControl::InternalSetReadyState.Um único lugar, você poderia telefonar InternalSetReadyState está a partir do OnProgress substituir do CDataPathProperty-classe derivada.
Em seguida, siga as etapas no Criando um novo controle ActiveX.