Os controles ActiveX MFC: Usando fontes

Se seu controle ActiveX exibir texto, você pode permitir que o usuário do controle alterar a aparência do texto, alterando uma propriedade de fonte.Propriedades de fonte são implementadas sistema autônomo objetos de fonte e podem ser um dos dois tipos: ações ou personalizado.Propriedades Font ações são propriedades de fonte preimplemented que podem ser adicionados usando o Assistente para adicionar propriedade.Propriedades personalizadas da fonte não são preimplemented e o desenvolvedor do controle determina o comportamento e o uso da propriedade.

Este artigo aborda os seguintes tópicos:

  • Usando a propriedade fonte de ações

  • Usando propriedades de fonte personalizada em seu controle

Usando a propriedade fonte de ações

Propriedades fonte ações são preimplemented, a classe COleControl.Além disso, uma página de propriedades de fonte padrão também está disponível, permitindo que o usuário alterar vários atributos de objeto fonte, sistema autônomo nome, dimensionar e estilo.

acesso o objeto de fonte por meio de GetFont, SetFont, and InternalGetFont funções de do COleControl. O controle de usuário acessará o objeto de fonte via o GetFont e SetFont funções da mesma maneira sistema autônomo qualquer Outros propriedade get/conjunto. Quando acesso ao objeto de fonte é exigido em um controle, use o InternalGetFont função.

Conforme discutido em sistema autônomo controles ActiveX MFC: Propriedades, adicionando propriedades de ações é fácil com o Adicionar Assistente de propriedade.escolher a propriedade Font e o Assistente para adicionar propriedade automaticamente insere a entrada de fonte das ações em MAP de despacho do controle.

Para adicionar a propriedade fonte ações 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.

    Isso abre o Assistente para adicionar propriedade.

  5. No Nome da propriedade clicarFonte.

  6. Clique em Finish.

O Assistente para adicionar propriedade adiciona a seguinte linha ao MAP de despacho do controle, localizado no arquivo de implementação de classe do controle:

DISP_STOCKPROP_FONT()

Além disso, o Assistente para adicionar propriedade adiciona a seguinte linha ao arquivo .idl controle:

[id(DISPID_FONT)] IFontDisp*Font;

A propriedade legenda ações é um exemplo de uma propriedade de texto que pode ser obtido usando as informações de propriedade fonte das ações.Adicionando a propriedade legenda ações para o controle usa etapas semelhantes aos usados para o estoque fonte propriedade.

Para adicionar a propriedade legenda ações 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.

    Isso abre o Assistente para adicionar propriedade.

  5. No Nome da propriedade clicarLegenda.

  6. Clique em Finish.

O Assistente para adicionar propriedade adiciona a seguinte linha ao MAP de despacho do controle, localizado no arquivo de implementação de classe do controle:

DISP_STOCKPROP_CAPTION()

Modificar a função OnDraw

A implementação padrão de OnDraw usa a fonte de sistema do Windows para todo o texto exibido no controle. Isso significa que você deve modificar o OnDraw código, selecionando o objeto de fonte para o contexto de dispositivo. Para fazer isso, chame COleControl::SelectStockFont e passar o contexto de dispositivo do controle, conforme mostrado no exemplo a seguir:

CFont* pOldFont;
TEXTMETRIC tm;
const CString& strCaption = InternalGetText();

pOldFont = SelectStockFont(pdc);
pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH )GetStockObject(WHITE_BRUSH)));
pdc->Ellipse(rcBounds);
pdc->GetTextMetrics(&tm);
pdc->SetTextAlign(TA_CENTER | TA_TOP);
pdc->ExtTextOut((rcBounds.left + rcBounds.right) / 2, 
   (rcBounds.top + rcBounds.bottom - tm.tmHeight) / 2,
   ETO_CLIPPED, rcBounds, strCaption, strCaption.GetLength(), NULL);

pdc->SelectObject(pOldFont);

Após o OnDraw função foi modificada para usar o objeto de fonte, o texto dentro do controle seja exibido com características de propriedade de fonte das ações do controle.

Usando propriedades de fonte personalizada em seu controle

Juntamente com a propriedade Font ações, o controle ActiveX pode ter propriedades de fonte personalizadas.Para adicionar uma propriedade de fonte personalizada, você deve:

  • Use o Assistente para adicionar propriedades para implementar a propriedade de fonte personalizada.

  • Processamento de notificações de fonte.

  • Implementar uma nova interface de notificação de fonte.

Implementação de uma propriedade de fonte personalizada

Para implementar uma propriedade personalizada, você pode usar o Assistente para adicionar propriedades para adicionar a propriedade e, em seguida, fazer algumas modificações no código.As seções a seguir descrevem como adicionar o personalizadoHeadingFont propriedade para o controle de exemplo.

Para adicionar a propriedade de fonte personalizada 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.

    Isso abre o Assistente para adicionar propriedade.

  5. No Nome da propriedade caixa, digite um nome para a propriedade.Para esse exemplo, use HeadingFont.

  6. For Tipo de implementação, clicar Obtém/define métodos.

  7. No Tipo da propriedade caixa de seleção IDispatch * para o tipo da propriedade.

  8. Clique em Finish.

O Assistente para adicionar propriedade cria o código para adicionar o HeadingFont propriedade personalizada para o CSampleCtrl classe e o arquivo SAMPLE.IDL. Porque HeadingFont é um tipo de propriedade get/conjunto, o Assistente para adicionar propriedade modifica o CSampleCtrl MAP de expedição da classe para incluir uma DISP_PROPERTY_EX_IDDISP_PROPERTY_EX entrada de macro:

DISP_PROPERTY_EX_ID(CMyAxFontCtrl, "HeadingFont", dispidHeadingFont, 
   GetHeadingFont, SetHeadingFont, VT_DISPATCH)

The DISP_PROPERTY_EX macro associa o HeadingFont nome da propriedade com seus correspondentes CSampleCtrl classe Get e conjunto métodos, GetHeadingFont e SetHeadingFont. O tipo do valor da propriedade também é especificado; nesse caso, VT_FONT.

O Assistente para adicionar propriedade também adiciona uma declaração no controle arquivo de cabeçalho (.H) para o GetHeadingFont e SetHeadingFont funções e adiciona seus modelos de função no arquivo de implementação de controle (.CPP):

IDispatch* CWizardGenCtrl::GetHeadingFont(void)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your dispatch handler code here

   return NULL;
}

void CWizardGenCtrl::SetHeadingFont(IDispatch* /*pVal*/)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your property handler code here

   SetModifiedFlag();
}

Finalmente, o Assistente para adicionar propriedade modifica o arquivo .idl de controle, adicionando uma entrada para o HeadingFont propriedade:

[id(1)] IDispatch* HeadingFont;

Modificações do código de controle

Agora que você adicionou o HeadingFont propriedade do controle, você deve fazer algumas alterações para os arquivos de cabeçalho e a implementação de controle para suportar totalmente a nova propriedade.

No arquivo de controle de cabeçalho (.H), adicione a seguinte declaração de uma variável de membro protegido:

protected:
   CFontHolder m_fontHeading;

No arquivo de implementação do controle (.CPP), faça o seguinte:

  • Inicializar m_fontHeading no construtor de controle.

    CMyAxFontCtrl::CMyAxFontCtrl()
       : m_fontHeading(&m_xFontNotification)
    {
        InitializeIIDs(&IID_DNVC_MFC_AxFont, &IID_DNVC_MFC_AxFontEvents);
    }
    
  • Declarar um estático FONTDESC estrutura que contém atributos padrão da fonte.

    static const FONTDESC _fontdescHeading =
      { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE( 12 ), FW_BOLD, 
        ANSI_CHARSET, FALSE, FALSE, FALSE };
    
  • No controle DoPropExchange membro funcionar, adicione uma telefonar para o PX_Font função. Isso proporciona inicialização e persistência para sua fonte de propriedade personalizada.

    void CMyAxFontCtrl::DoPropExchange(CPropExchange* pPX)
    {
        ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
        COleControl::DoPropExchange(pPX);
    
       // [...other PX_ function calls...]
       PX_Font(pPX, _T("HeadingFont"), m_fontHeading, &_fontdescHeading);
    }
    
  • Concluir a implementação do controle de GetHeadingFont função de membro.

    IDispatch* CMyAxFontCtrl::GetHeadingFont(void)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       return m_fontHeading.GetFontDispatch();
    }
    
  • Concluir a implementação do controle de SetHeadingFont função de membro.

    void CMyAxFontCtrl::SetHeadingFont(IDispatch* pVal)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       m_fontHeading.InitializeFont(&_fontdescHeading, pVal);
       OnFontChanged();    //notify any changes
       SetModifiedFlag();
    }
    
  • Modificar o controle OnDraw função de membro para definir uma variável para a fonte selecionada anteriormente.

    CFont* pOldHeadingFont;
    
  • Modificar o controle OnDraw função de membro para selecionar a fonte personalizada no contexto de dispositivo, adicionando a seguinte linha onde quer que a fonte será usada.

    pOldHeadingFont = SelectFontObject(pdc, m_fontHeading);
    
  • Modificar o controle OnDraw função de membro para selecionar a fonte anterior novamente no contexto de dispositivo adicionando a seguinte linha após a fonte foi usada.

    pdc->SelectObject(pOldHeadingFont);
    

Depois de implementar a propriedade de fonte personalizada, a página de propriedades de fonte padrão deve ser implementada, permitindo que os usuários de controle alterar a fonte corrente do controle.Para adicionar a ID da página de propriedades para a página de propriedades de fonte padrão, insira a seguinte linha após o BEGIN_PROPPAGEIDS macro:

PROPPAGEID(CLSID_CFontPropPage)

Você também deve incrementar o parâmetro de contagem de seu BEGIN_PROPPAGEIDS macro por um. A linha a seguir ilustra isso:

BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)

Após essas alterações terem sido feitas, reconstrua o projeto inteiro para incorporar a funcionalidade adicional.

Processamento de notificações de fonte

Na maioria dos casos o controle precisa saber quando as características do objeto fonte foram modificadas.Cada objeto de fonte é capaz de fornecer notificações quando ela mudar chamando uma função de membro do IFontNotification interface, implementado por COleControl.

Se o controle usa a propriedade fonte ações, suas notificações são manipuladas pelo OnFontChanged função de membro de COleControl. Quando você adiciona propriedades de fonte personalizada, é necessário que eles usar a mesma implementação.No exemplo na seção anterior, isso foi realizado por meio da transmissão &m_xFontNotification ao inicializar o m_fontHeading variável de membro.

Implementar várias interfaces de objeto fonte

As linhas sólidas na figura acima mostram que os dois objetos de fonte estão usando a mesma implementação de IFontNotification.Isso poderia causar problemas se você quiser distinguir qual fonte é alterada.

Uma maneira para distinguir entre as notificações de objeto de fonte do controle é criar uma implementação separada do IFontNotification interface para cada objeto de fonte no controle.Essa técnica permite otimizar o código de desenho, atualizando somente a seqüência de caracteres ou seqüências de caracteres, que usam a fonte modificada recentemente.As seções a seguir, demonstre as etapas necessárias para implementar interfaces de notificação separada para uma segunda propriedade.Segunda a propriedade fonte é considerada o HeadingFont propriedade que foi adicionada na seção anterior.

Implementação de uma nova interface de notificação de fonte

Para distinguir entre as notificações de dois ou mais fontes, uma nova interface de notificação deve ser implementada para cada fonte usada no controle.As seções a seguir descrevem como implementar uma nova interface de notificação de fonte modificando os arquivos de cabeçalho e a implementação do controle.

Adições ao arquivo de cabeçalho

No arquivo de controle de cabeçalho (.H), adicione as seguintes linhas para a declaração da classe:

protected:
   BEGIN_INTERFACE_PART(HeadingFontNotify, IPropertyNotifySink)
   INIT_INTERFACE_PART(CMyAxFontCtrl, HeadingFontNotify)
      STDMETHOD(OnRequestEdit)(DISPID);
      STDMETHOD(OnChanged)(DISPID);
   END_INTERFACE_PART(HeadingFontNotify)

Isso cria uma implementação do IPropertyNotifySink interface de chamada HeadingFontNotify. Essa nova interface contém um método chamado OnChanged.

Adições ao arquivo de implementação

O código que inicializa a fonte do título (no construtor controle), altere &m_xFontNotification para &m_xHeadingFontNotify. Em seguida, adicione o seguinte código:

STDMETHODIMP_(ULONG) CMyAxFontCtrl::XHeadingFontNotify::AddRef()
{
   METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
   return 1;
}
STDMETHODIMP_(ULONG) CMyAxFontCtrl::XHeadingFontNotify::Release()
{
   METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
   return 0;
}

STDMETHODIMP CMyAxFontCtrl::XHeadingFontNotify::QueryInterface(REFIID iid, LPVOID FAR* ppvObj)
{
   METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
   if( IsEqualIID(iid, IID_IUnknown) || IsEqualIID(iid, IID_IPropertyNotifySink))
   {
      *ppvObj= this;
      AddRef();
      return NOERROR;
   }
   return ResultFromScode(E_NOINTERFACE);
}

STDMETHODIMP CMyAxFontCtrl::XHeadingFontNotify::OnChanged(DISPID)
{
   METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
   pThis->InvalidateControl();
   return NOERROR;
}

STDMETHODIMP CMyAxFontCtrl::XHeadingFontNotify::OnRequestEdit(DISPID)
{
   return NOERROR;
}

The AddRef e Release métodos de IPropertyNotifySink controlar de interface a contagem de referência para o objeto de controle ActiveX. Quando o controle obtém acesso ao ponteiro de interface, o controle chama AddRef Para incrementar a contagem de referência. Quando o controle for concluído com o ponteiro, ele chama Release, muito da mesma maneira que GlobalFree pode ser chamado para liberar um bloco de memória global.Quando a contagem de referência para esta interface vai para zero, a implementação de interface pode ser liberada.Neste exemplo, a QueryInterface função retorna um ponteiro para um IPropertyNotifySink interface em um determinado objeto. Essa função permite que um controle ActiveX para consultar um objeto para determinar quais interfaces oferece suporte.

Após essas alterações foram feitas em seu projeto, recompilar o projeto e use o contêiner de teste para testar a interface.See Teste de propriedades e eventos com o contêiner de teste para obter informações sobre como acessar o contêiner de teste.

Consulte também

Conceitos

Controles do ActiveX MFC

Referência

Os controles ActiveX MFC: Usando imagens em um controle ActiveX

Os controles ActiveX MFC: Usando as ações propriedade páginas