Partilhar via


Controles ActiveX MFC: usando imagens em um controle ActiveX

Este artigo descreve o tipo de imagem comum e como implementá-lo no controle ActiveX. Os tópicos incluem:

Visão geral das propriedades da imagem personalizada

Um tipo de imagem é um de um grupo de tipos comuns a alguns controles ActiveX. O tipo de imagem manipula meta-arquivos, bitmaps ou ícones e permite que o usuário especifique uma imagem a ser exibida em um controle ActiveX. As propriedades de Imagem Personalizada são implementadas usando um objeto de imagem e funções Get/Set que permitem ao usuário de controle acesso à propriedade Picture. Os usuários de controle acessam a propriedade Picture personalizada usando a página de propriedades de imagem de estoque.

Além do tipo de imagem padrão, tipos de Fonte e Cor também estão disponíveis. Para mais informações sobre como usar o tipo de fonte padrão em seu controle ActiveX, confira o artigo Controles ActiveX MFC: como usar fontes.

As classes de controle ActiveX fornecem vários componentes que você pode usar para implementar a propriedade Picture dentro do controle. Esses componentes incluem:

  • A classe CPictureHolder.

    Essa classe dá acesso fácil ao objeto de imagem e à funcionalidade para o item exibido pela propriedade Picture personalizada.

  • Suporte para propriedades do tipo LPPICTUREDISP, implementadas com funções Get/Set.

    Usando o Modo de Exibição de Classe, você pode adicionar rapidamente uma ou mais propriedades personalizadas que dão suporte ao tipo imagem. Para mais informações sobre como adicionar propriedades de controle ActiveX com o Modo de Exibição de Classe, confira o artigo Controles ActiveX MFC: propriedades.

  • Uma página de propriedades que manipula uma ou mais propriedades Picture de um controle.

    Esta página de propriedades faz parte de um grupo de páginas de propriedades padrão disponíveis para controles ActiveX. Para mais informações sobre páginas de propriedades de controle ActiveX, confira o artigo Controles ActiveX do MFC: como usar páginas de propriedades padrão

Como implementar uma propriedade de imagem personalizada no controle ActiveX

Quando você concluir as etapas descritas nesta seção, o controle poderá exibir imagens escolhidas pelo usuário. O usuário pode alterar a imagem exibida usando uma página de propriedades que mostra a imagem atual e tem um botão Procurar que permite que o usuário selecione imagens diferentes.

Uma propriedade Picture personalizada é implementada usando um processo semelhante ao usado para implementar outras propriedades, sendo a principal diferença que a propriedade personalizada deve dar suporte a um tipo de imagem. Como o item da propriedade Picture deve ser desenhado pelo controle ActiveX, várias adições e modificações devem ser feitas à propriedade para ela ser totalmente implementada.

Para implementar uma propriedade de imagem personalizada, faça o seguinte:

Adições ao projeto de controle

Para adicionar a ID da página de propriedades para a página de propriedades de imagem padrão, insira a seguinte linha após a macro BEGIN_PROPPAGEIDS no arquivo de implementação de controle (.CPP):

PROPPAGEID(CLSID_CPicturePropPage)

Você também deve incrementar o parâmetro de contagem de sua macro BEGIN_PROPPAGEIDS em um. A linha abaixo ilustra o seguinte:

BEGIN_PROPPAGEIDS(CMyAxPicCtrl, 2)

Para adicionar o membro de dados CPictureHolder à classe de controle, insira a seguinte linha na seção protegida da declaração de classe de controle no arquivo de cabeçalho de controle (.H):

CPictureHolder    m_pic;

Não é necessário dar ao membro de dados o nome m_pic; qualquer nome serve.

Então adicione uma propriedade personalizada que dê suporte a um tipo de imagem:

Para adicionar uma propriedade de imagem personalizada usando o Assistente para Adicionar Propriedade

  1. Carregue o projeto do controle.

  2. No Modo de Exibição de Classe, expanda o nó de biblioteca do controle.

  3. Clique com o botão direito do mouse no nó de interface do controle (o segundo nó do nó da biblioteca) para abrir o menu de atalho.

  4. No menu de atalho, escolha Adicionar e depois Adicionar propriedade.

  5. Na caixa Nome da Propriedade, digite o nome da propriedade. Para fins de exemplo, ControlPicture é usado neste procedimento.

  6. Na caixa Tipo de Propriedade, selecione IPictureDisp* para o tipo de propriedade.

  7. Para o Tipo de Implementação, clique em Métodos Get/Set.

  8. Digite nomes exclusivos para obter e definir funções ou aceite os nomes padrão. (Neste exemplo, os nomes padrão GetControlPicture e SetControlPicture são usados.)

  9. Clique em Concluir.

O Assistente para Adicionar Propriedade adiciona o seguinte código entre os comentários do mapa de expedição no arquivo de cabeçalho de controle (.H) :

IPictureDisp* GetControlPicture(void);
void SetControlPicture(IPictureDisp* pVal);

Além disso, o seguinte código foi inserido no mapa de expedição da implementação de controle (arquivo .CPP):

DISP_PROPERTY_EX_ID(CMyAxPicCtrl, "ControlPicture", dispidControlPicture,
   GetControlPicture, SetControlPicture, VT_PICTURE)

O Assistente para Adicionar Propriedade também adiciona as duas seguintes funções de stub no arquivo de implementação de controle:

IPictureDisp* CWizardGenCtrl::GetControlPicture(void)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your dispatch handler code here

   return NULL;
}

void CWizardGenCtrl::SetControlPicture(IPictureDisp* /*pVal*/)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your property handler code here

   SetModifiedFlag();
}

Observação

Seus nomes de classe e função de controle podem ser diferentes do exemplo acima.

Modificações ao projeto de controle

Depois de fazer as adições necessárias ao projeto de controle, você precisará modificar várias funções que afetam a renderização do controle ActiveX. Essas funções, OnResetState, OnDraw e as funções Get/Set de uma propriedade de imagem personalizada, estão localizadas no arquivo de implementação de controle. (Observe que, neste exemplo, a classe de controle é chamada CSampleCtrl, o membro de dados CPictureHolder é chamado m_pic e o nome da propriedade de imagem personalizada é ControlPicture.)

Na função de controle OnResetState, adicione a seguinte linha opcional após a chamada para COleControl::OnResetState:

m_pic.CreateEmpty();
m_pic.CreateEmpty();

Isso define a imagem do controle como uma imagem em branco.

Para desenhar a imagem corretamente, faça uma chamada para CPictureHolder::Render na função de controle OnDraw. Modifique sua função para se parecer com o seguinte exemplo:

void CMyAxPicCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
   if (!pdc)
      return;

   m_pic.Render(pdc, rcBounds, rcBounds);
}

Na função Get da propriedade de imagem personalizada do controle, adicione a seguinte linha:

return m_pic.GetPictureDispatch();
return m_pic.GetPictureDispatch();

Na função Set da propriedade Picture personalizada do controle, adicione as seguintes linhas:

m_pic.SetPictureDispatch(pVal);
InvalidateControl();

A propriedade de imagem deve ser persistente para que as informações adicionadas no tempo de design sejam exibidas em tempo de execução. Adicione a seguinte linha à função DoPropExchange da classe derivada de COleControl:

PX_Picture(pPX, _T("ControlPicture"), m_pic);

Observação

Seus nomes de classe e função podem ser diferentes do exemplo acima.

Depois de concluir as modificações, recompile o projeto para incorporar a nova funcionalidade da propriedade Picture personalizada e use o Contêiner de Teste para testar a nova propriedade. Confira Testar Propriedades e Eventos com o Contêiner de Testes para obter informações sobre como acessar o contêiner de testes.

Confira também

Controles ActiveX do MFC
Controles ActiveX do MFC: usando fontes
Controles ActiveX do MFC: páginas de propriedade