Controles ActiveX MFC: usando imagens em um controle ActiveX
Este artigo descreve o tipo mais comum de imagem e como implementá-la no controle ActiveX. Os tópicos incluem:
Visão geral de propriedades personalizadas da imagem
Implementando uma propriedade personalizada da imagem no controle ActiveX
Adições ao projeto de controle
Visão geral de propriedades personalizadas da imagem
Um tipo de imagem é um de um grupo de tipos comuns a alguns controles ActiveX. O tipo da imagem trata metarquivos, bitmaps, ou ícones e permite que o usuário especifica uma imagem a ser exibida em um controle ActiveX. As propriedades personalizadas da imagem são implementadas usando um objeto de imagem e obtenção/definem as funções que permitem o acesso de usuário à propriedade do controle da imagem. Os usuários do controle acessam a propriedade personalizada de imagem usando a página de propriedades de estoque da imagem.
Além do tipo imagem padrão, os tipos de fonte e cor também estão disponíveis. Para obter mais informações sobre como usar a fonte padrão digite no controle ActiveX, consulte o artigo Controles ActiveX MFC: Usando fontes.
As classes do controle ActiveX fornecem vários componentes que você pode usar para implementar a propriedade da imagem no controle. Esses componentes incluem:
A classe de CPictureHolder .
Esta classe fornece acesso fácil ao objeto de imagem e a funcionalidade do item exibido pela propriedade personalizada da imagem.
O suporte para as propriedades de tipo LPPICTUREDISP, implementadas com obtém ou define funções.
Usando a exibição da classe você pode adicionar rapidamente uma propriedade personalizada, ou propriedades, que da suporte ao tipo da imagem. Para obter mais informações sobre como adicionar propriedades do controle ActiveX exibição com a classe, consulte o artigo Controles ActiveX MFC: Propriedades.
Uma página de propriedades que manipula a propriedade ou as propriedades da imagem de um controle.
Esta página de propriedades é parte de um grupo de páginas de propriedades de estoque disponível para os controles ActiveX. Para obter mais informações sobre as páginas de propriedades do controle ActiveX, consulte o artigo Controles ActiveX MFC: Usando as páginas de propriedades de estoque
Implementando uma propriedade personalizada da imagem no controle ActiveX
Quando concluir as etapas descritas nesta seção, o controle pode exibir as 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 de procura que permite ao usuário diferentes imagens selecione.
Uma propriedade personalizada da imagem é implementada usando um processo semelhante ao do usado implementando outras propriedades, a principal diferença é que a propriedade personalizada deve dar suporte a um tipo de imagem. Como o item da propriedade da imagem deve ser desenhado pelo controle ActiveX, um número de adições e alterações devem ser feitas à propriedade antes que possa ser totalmente implementada.
Para implementar uma propriedade personalizada da imagem, você deve fazer o seguinte:
Adicionar código ao projeto de controle.
Uma ID padrão da página de propriedades da imagem, um membro de dados do tipo CPictureHolder, e uma propriedade personalizada do tipo LPPICTUREDISP com uma implementação obter/cluster devem ser adicionados.
Modificar várias funções em sua classe de controle.
Essas alterações serão feitas para várias funções que são responsáveis pelo desenho do controle ActiveX.
Adições ao projeto de controle
Para adicionar a ID da página de propriedades da página de propriedades padrão da imagem, insira a seguinte linha depois que a macro de BEGIN_PROPPAGEIDS no arquivo de implementação de controle (.CPP):
PROPPAGEID(CLSID_CPicturePropPage)
Você deve também incrementar o parâmetro de contagem de seu macro de BEGIN_PROPPAGEIDS por um. A linha a seguir ilustra esta:
BEGIN_PROPPAGEIDS(CMyAxPicCtrl, 2)
Para adicionar o membro de dados de CPictureHolder a classe de controle, insira a seguinte linha na seção protegida de declaração da classe de controle no arquivo de cabeçalho de controle (. H):
CPictureHolder m_pic;
Não é necessário nomear o membro de dados m_pic; qualquer nome será suficiente.
Em seguida, adicione uma propriedade personalizada que da suporte a um tipo de imagem:
Para adicionar uma propriedade personalizada de imagem usando o assistente para adicionar propriedade
Carregar o projeto do controle.
Na exibição da classe, expanda o nó da biblioteca do controle.
Clique com o botão direito do mouse no nó da interface para o controle (o segundo nó do nó da biblioteca) para abrir o menu de atalho.
No menu de atalho, escolha Adicionar e depois Adicionar Propriedade.
Na caixa de Nome da propriedade , digite o nome da propriedade. Por exemplo, propósitos de ControlPicture são usadas neste procedimento.
Na caixa de Tipo de propriedade , IPictureDisp* selecione para o tipo de propriedade.
Para Tipo de Implementação, clique Get/Set Methods.
Os nomes exclusivos do seu e definem ou obtêm funções aceitam nomes padrão. (Neste exemplo, os nomes padrão GetControlPicture e em SetControlPicture é usado.)
Clique em Concluir.
O assistente da propriedade adicionar adiciona o código a seguir entre os comentários do mapa de distribuição no cabeçalho de controle (. H) arquivo:
IPictureDisp* GetControlPicture(void);
void SetControlPicture(IPictureDisp* pVal);
Além disso, o seguinte código foi inserido no mapa de expedição do arquivo de implementação de controle (.CPP):
DISP_PROPERTY_EX_ID(CMyAxPicCtrl, "ControlPicture", dispidControlPicture,
GetControlPicture, SetControlPicture, VT_PICTURE)
O assistente para adicionar propriedade também adiciona as duas 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();
}
Dica
Os nomes da classe e de função de controle pode ser diferente do exemplo anterior.
Alterações no projeto de controle
Depois que você executou as adições necessárias ao controle do, você precisa modificar várias funções que afetam a renderização do controle ActiveX. Essas funções, OnResetState, OnDrawas funções, e obter/conjunto de uma propriedade personalizada da imagem, ficam localizadas no arquivo de implementação do controle. (Observe que neste exemplo a classe do controle é chamada CSampleCtrl, o membro de dados de CPictureHolder é chamada m_pic, e o nome da propriedade personalizada da imagem é ControlPicture.)
Na função de OnResetState de controle, adicione a seguinte linha opcional depois da chamada a COleControl::OnResetState:
m_pic.CreateEmpty();
Isso define a imagem do controle para uma imagem em branco.
Para desenhar a imagem corretamente, faça uma chamada a CPictureHolder::Render na função de OnDraw do controle. Modifique a função para ser semelhante ao seguinte exemplo:
void CMyAxPicCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
if (!pdc)
return;
m_pic.Render(pdc, rcBounds, rcBounds);
}
A função obter da propriedade personalizada da imagem de controle, adicione a seguinte linha:
return m_pic.GetPictureDispatch();
Na função de conjunto da propriedade personalizada da imagem de controle, adicione as seguintes linhas:
m_pic.SetPictureDispatch(pVal);
InvalidateControl();
A propriedade da imagem deve ser feita persistente de forma que as informações adicionada em tempo de design aparece em tempo de execução. Adicione a seguinte linha a COleControl- função derivado de DoPropExchange da classe:
PX_Picture(pPX, _T("ControlPicture"), m_pic);
Dica
Os nomes da classe e de função pode ser diferente do exemplo anterior.
Depois de concluir as alterações, recriar seu projeto inserir a nova funcionalidade da propriedade personalizada de imagem e usar o contêiner de teste para testar a nova propriedade. Consulte Propriedades e eventos de teste com contêineres de teste para obter mais informações sobre como acessar o contêiner de teste.