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
Carregar projeto do controle.
No modo de exibição de classe, expandir o nó de biblioteca do seu controle.
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.
No menu de atalho, clicar Adicionar e, em seguida, clicar Adicionar propriedade.
No Nome da propriedade box, type Array.
No Tipo da propriedade caixa de seleção curto.
For Implementação Digite, clicar Obtém/define métodos.
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.
Adicionar um parâmetro, chamado row (tipo short), usando o Nome de parâmetro and Tipo de parâmetro controles.
Adicionar um segundo parâmetro chamado column (tipo short).
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();