Compartilhar via


Os controles ActiveX MFC: Tópicos avançados

Este artigo aborda tópicos avançados relacionados ao desenvolvimento de controles ActiveX.Eles incluem:

  • Usando classes de banco de dados em controles do ActiveX

  • Implementação de uma propriedade parametrizada

  • Manipulando erros em seu controle ActiveX

  • Teclas especiais do manuseio no controle

  • Acessando controles de caixa de diálogo que são invisível em time de execução

Usando classes de banco de dados em controles do ActiveX

Como as classes de controle ActiveX fazem parte da biblioteca de classes, você pode aplicar os mesmos procedimentos e regras para usar classes de banco de dados em um aplicativo MFC padrão para o desenvolvimento de controles ActiveX que usar as classes de banco de dados MFC.

Para obter uma visão geral sobre as classes de banco de dados MFC, consulte Classes de banco de dados MFC (DAO e ODBC).O artigo apresenta ambas as classes de ODBC do MFC e o DAO MFC classes e direcione para obter mais detalhes sobre qualquer um.

Observação:

sistema autônomo do Visual C++. NET, o ambiente do Visual C++ e sistema autônomo assistentes não suportam mais DAO (Embora sistema autônomo classes DAO estão incluídas e você ainda poderá usá-las).A Microsoft recomenda que você use Modelos de BD OLE DB or ODBC e do MFC para novos projetos.Você só deve usar o DAO em manutenção de aplicativos existentes.

Implementação de uma propriedade parametrizada

Uma propriedade parametrizada (às vezes chamada de uma matriz de propriedade) é um método para expor um conjunto homogêneo de valores sistema autônomo uma única propriedade do controle.Por exemplo, você pode usar uma propriedade com parâmetros para expor uma matriz ou um dicionário sistema autônomo uma propriedade.No Visual Basic, essa propriedade é acessada usando a notação de array:

x = o.Array(2, 3) ' gets element of 2D array
o.Array(2, 3) = 7 ' sets element of 2D array

Use o Assistente para adicionar propriedades para implementar uma propriedade parametrizada.O Assistente para adicionar propriedade implementa a propriedade adicionando um emparelhar de funções get/conjunto que permitem ao usuário controle acessar a propriedade usando a notação acima ou no modo padrão.

Semelhante a métodos e propriedades, propriedades parametrizadas também têm um limite para o número de parâmetros permitido.No caso de propriedades parametrizadas, o limite é de 15 parâmetros (com um parâmetro reservada para armazenar o valor da propriedade).

O procedimento a seguir adiciona uma propriedade parametrizada, chamada matriz, que pode ser acessado sistema autônomo uma matriz bidimensional de números inteiros.

Para adicionar uma propriedade parametrizada usando o Assistente para adicionar propriedade

  1. Carregar projeto do controle.

  2. No modo de exibição de classe, expandir o nó de biblioteca do seu controle.

  3. clicar com o botão direito do mouse no nó de interface para o seu controle (o segundo nó do nó biblioteca) para em em aberto o menu de atalho.

  4. No menu de atalho, clicar Adicionar e, em seguida, clicar Adicionar propriedade.

  5. No Nome da propriedade box, type Array.

  6. No Tipo da propriedade caixa de seleção curto.

  7. For Implementação Digite, clicar Obtém/define métodos.

  8. No Obter função and Função de conjunto caixas, digite nomes exclusivos para seu get e set funções ou aceite os nomes padrão.

  9. Adicionar um parâmetro, chamado row (tipo short), usando o Nome de parâmetro and Tipo de parâmetro controles.

  10. Adicionar um segundo parâmetro chamado column (tipo short).

  11. Clique em Finish.

As alterações feitas pela propriedade de Assistente

Quando você adiciona uma propriedade personalizada, o Assistente para adicionar propriedade faz alterações para o cabeçalho de classe de controle (.H) e os arquivos de implementação (.CPP).

As seguintes linhas são adicionadas ao arquivo .h da classe de controle:

SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);

Esse código declara duas funções chamadas GetArray e SetArray que permite ao usuário solicitar uma linha específica e uma coluna quando estiver acessando a propriedade.

Além disso, o Assistente para adicionar propriedade adiciona as seguintes linhas ao MAP de despacho de controle, no arquivo de implementação (.CPP) de classe de controle:

DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)

Finalmente, as implementações do GetArray e SetArray as funções são adicionadas ao participante do arquivo .CPP. Na maioria dos casos, você modificará a função get para retornar o valor da propriedade.A função conjunto geralmente irá conter código que deve ser executado, antes ou após as alterações na propriedade.

Para esta propriedade ser útil, você poderia declarar uma variável de membro matriz bidimensional na classe controle do tipo curto, para armazenar valores de propriedade com parâmetros.Você pode modificar a função get para retornar o valor armazenado na linha adequada e coluna, conforme indicado pelos parâmetros e modificar a função de conjunto para atualizar o valor referenciado pelos parâmetros de linha e coluna.

Manipulando erros em seu controle ActiveX

Se as condições de erro ocorrerem no controle, talvez seja necessário relatar o erro para o contêiner de controle.Há dois métodos para relatar erros, dependendo da situação em que o erro ocorre.Se o erro ocorrer dentro de uma propriedade Get ou conjunto função, ou na implementação de um método de automação OLE, o controle deve telefonar COleControl::ThrowError, que informa ao usuário controle que ocorreu um erro.Se o erro ocorrer a qualquer Outros momento, o controle deve telefonar COleControl::FireError, que dispara um evento de erro das ações.

Para indicar o tipo de erro que ocorreu, o controle deve passar um código de erro para ThrowError ou FireError. Um código de erro é um código de status OLE, que tem um valor de 32 bit.Quando possível, escolher um código de erro do conjunto padrão de códigos definidos no arquivo de cabeçalho OLECTL.H.A tabela a seguir resume esses códigos.

Códigos de erro do controle ActiveX

Erro

Descrição

CTL_E_ILLEGALFUNCTIONCALL

telefonar de função ilegal

CTL_E_OVERFLOW

Estouro

CTL_E_OUTOFMEMORY

Falta de memória

CTL_E_DIVISIONBYZERO

Divisão por zero

CTL_E_OUTOFSTRINGSPACE

Falta de espaço de seqüência de caracteres

CTL_E_OUTOFSTACKSPACE

Falta de espaço de pilha

CTL_E_BADFILENAMEORNUMBER

Número ou nome de arquivo inválido

CTL_E_FILENOTFOUND

Arquivo não encontrado

CTL_E_BADFILEMODE

Modo Bad file

CTL_E_FILEALREADYOPEN

O arquivo já em aberto

CTL_E_DEVICEIOERROR

Erro de dispositivo de E/S

CTL_E_FILEALREADYEXISTS

O arquivo já existe

CTL_E_BADRECORDLENGTH

Comprimento de registro inválido

CTL_E_DISKFULL

Disco cheio

CTL_E_BADRECORDNUMBER

Número de registro inválido

CTL_E_BADFILENAME

Nome de arquivo inválido

CTL_E_TOOMANYFILES

Há arquivos demais

CTL_E_DEVICEUNAVAILABLE

Dispositivo não disponível

CTL_E_PERMISSIONDENIED

Permissão negada

CTL_E_DISKNOTREADY

Disco não está pronto

CTL_E_PATHFILEACCESSERROR

Erro de acesso ao arquivo/caminho

CTL_E_PATHNOTFOUND

Caminho não encontrado

CTL_E_INVALIDPATTERNSTRING

Seqüência de caracteres de padrão inválido

CTL_E_INVALIDUSEOFNULL

Uso inválido do nulo

CTL_E_INVALIDFILEFORMAT

Formato de arquivo inválido

CTL_E_INVALIDPROPERTYVALUE

valor da propriedade inválido

CTL_E_INVALIDPROPERTYARRAYINDEX

Índice de matriz de propriedade inválido

CTL_E_SETNOTSUPPORTEDATRUNTIME

Não é suportado em time de execução do conjunto

CTL_E_SETNOTSUPPORTED

Definições não suportadas (propriedade somente leitura)

CTL_E_NEEDPROPERTYARRAYINDEX

Índice de matriz de propriedade necessário

CTL_E_SETNOTPERMITTED

Conjunto não permitido

CTL_E_GETNOTSUPPORTEDATRUNTIME

Obtenha não suportada em time de execução

CTL_E_GETNOTSUPPORTED

Obter sem suporte (propriedade somente gravar)

CTL_E_PROPERTYNOTFOUND

Propriedade não encontrada

CTL_E_INVALIDCLIPBOARDFORMAT

Formato inválido de área de transferência

CTL_E_INVALIDPICTURE

Imagem inválido

CTL_E_PRINTERERROR

Erro com a Impressora

CTL_E_CANTSAVEFILETOTEMP

Não é possível salvar arquivo TEMP

CTL_E_SEARCHTEXTNOTFOUND

Texto de pesquisa não encontrado

CTL_E_REPLACEMENTSTOOLONG

Substituições muito longas

Se necessário, use o CUSTOM_CTL_SCODE macro para definir um código de erro personalizada para uma condição que não é coberto por um dos códigos padrão.O parâmetro para essa macro deve ser um número inteiro entre 1000 e 32767, inclusive.Por exemplo:

#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)

Se você estiver criando um controle ActiveX para substituir um controle VBX existente, defina os códigos de erro do controle ActiveX com os mesmos valores numéricos que usa o controle VBX para garantir que os códigos de erro são compatível.

Teclas especiais do manuseio no controle

Em alguns casos, talvez seja necessário lidar com determinadas combinações de pressionamento de tecla em um especial nisso; por exemplo, inserir uma nova linha quando a tecla ENTER é pressionada em um texto de várias linhas caixa controle ou mova entre um agrupar de edição controla quando um direcional pressionado ID da chave.

Se a classe base de seu controle ActiveX for COleControl, você pode substituir CWnd::PreTranslateMessage para controlar mensagens antes do contêiner processa.Ao usar essa técnica, sempre retornará TRUE se manipular a mensagem na sua substituir de PreTranslateMessage.

O exemplo de código a seguir demonstra uma possível maneira de lidar com quaisquer mensagens relacionadas às teclas de direção.

BOOL CMyAxUICtrl::PreTranslateMessage(MSG* pMsg)
{
   BOOL bHandleNow = FALSE;

   switch (pMsg->message)
   {
      case WM_KEYDOWN:
         switch (pMsg->wParam)
         {
         case VK_UP:
         case VK_DOWN:
         case VK_LEFT:
         case VK_RIGHT:
            bHandleNow = TRUE;
            break;
         }
         if (bHandleNow)
         {
            OnKeyDown((UINT)pMsg->wParam, LOWORD(pMsg->lParam), HIWORD(pMsg->lParam));
         }
         break;
   }
   return bHandleNow;
}

Para obter mais informações sobre manipulação de interfaces do teclado para um controle ActiveX, consulte a documentação do SDK do ActiveX.

Acessando controles de caixa de diálogo que são invisível em time de execução

Você pode criar controles de caixa de diálogo sem interface do usuário e são invisível em time de execução.Se você adiciona um invisível em time de execução controle ActiveX a uma caixa de diálogo e usar CWnd::GetDlgItem para acessar o controle, o controle não funcionará corretamente.Em vez disso, você deve usar uma das seguintes técnicas para obter um objeto que representa o controle:

  • Usando o ' Assistente para Adicionar membro variable ', selecionar Variável de controle e, em seguida, selecionar o controle 's ID.Digite um nome de variável de membro e selecionar classe de invólucro do controle sistema autônomo a Tipo de controle.

    - ou -

  • Declare uma variável local e subclasse sistema autônomo o item de caixa de diálogo.Inserir o código semelhante ao seguinte (CMyCtrl é a classe wrapper IDC_MYCTRL1 ID do controle é):

    CCirc myCirc;
    myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this);
    // ... use myCirc ...
    myCirc.UnsubclassWindow();
    

Consulte também

Conceitos

Controles do ActiveX MFC