Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Se o controle ActiveX exibir texto, você poderá permitir que o usuário de controle altere a aparência do texto alterando uma propriedade de fonte. As propriedades da fonte são implementadas como objetos de fonte e podem ser um dos dois tipos: estoque ou personalizado. As propriedades da Fonte de Estoque são propriedades de fonte preimplementadas que você pode adicionar usando o Assistente para Adicionar Propriedade. As propriedades de Fonte Personalizada não são pré-simplificadas e o desenvolvedor de controle determina o comportamento e o uso da propriedade.
Este artigo aborda os seguintes tópicos:
Usando a propriedade Stock Font
As propriedades da Fonte de Estoque são preimplementadas pela classe COleControl. Além disso, uma página de propriedade font padrão também está disponível, permitindo que o usuário altere vários atributos do objeto de fonte, como seu nome, tamanho e estilo.
Acesse o objeto de fonte por meio das funções GetFont, SetFont e InternalGetFont de COleControl. O usuário de controle acessará o objeto de fonte por meio do GetFont e SetFont das funções da mesma maneira que qualquer outra propriedade Get/Set. Quando o acesso ao objeto de fonte for necessário de dentro de um controle, use a InternalGetFont função.
Conforme discutido nos Controles ActiveX do MFC: Propriedades, a adição de propriedades de estoque é fácil com o Assistente para Adicionar Propriedade. Você escolhe a propriedade Fonte e o Assistente para Adicionar Propriedade insere automaticamente a entrada fonte de estoque no mapa de expedição do controle.
Para adicionar a propriedade fonte de estoque usando o Assistente para Adicionar Propriedade
Carregue o projeto do controle.
No Modo de Exibição de Classe, expanda o nó de biblioteca do controle.
Clique com o botão direito do mouse no nó de interface do seu controle (o segundo nó do nó da biblioteca) para abrir o menu de atalho.
No menu de atalho, clique em Adicionar e clique em Adicionar Propriedade.
Isso abre o Assistente para Adicionar Propriedade.
Na caixa Nome da Propriedade , clique em Fonte.
Clique em Concluir.
O Assistente para Adicionar Propriedade adiciona a seguinte linha ao mapa de expedição do controle, localizado no arquivo de implementação da classe de controle:
DISP_STOCKPROP_FONT()
Além disso, o Assistente para Adicionar Propriedade adiciona a seguinte linha ao controle. Arquivo IDL:
[id(DISPID_FONT)] IFontDisp* Font;
A propriedade stock Caption é um exemplo de uma propriedade de texto que pode ser desenhada usando as informações da propriedade fonte de estoque. Adicionar a propriedade legenda de estoque ao controle usa etapas semelhantes às usadas para a propriedade fonte de estoque.
Para adicionar a propriedade legenda de estoque usando o Assistente para Adicionar Propriedade
Carregue o projeto do controle.
No Modo de Exibição de Classe, expanda o nó de biblioteca do controle.
Clique com o botão direito do mouse no nó de interface do seu controle (o segundo nó do nó da biblioteca) para abrir o menu de atalho.
No menu de atalho, clique em Adicionar e clique em Adicionar Propriedade.
Isso abre o Assistente para Adicionar Propriedade.
Na caixa Nome da Propriedade , clique em Legenda.
Clique em Concluir.
O Assistente para Adicionar Propriedade adiciona a seguinte linha ao mapa de expedição do controle, localizado no arquivo de implementação da classe de controle:
DISP_STOCKPROP_CAPTION()
Modificando a função OnDraw
A implementação padrão usa OnDraw a fonte do sistema Windows para todo o texto exibido no controle. Isso significa que você deve modificar o OnDraw código selecionando o objeto de fonte no contexto do dispositivo. Para fazer isso, chame COleControl::SelectStockFont e passe o contexto do 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);
Depois que a OnDraw função tiver sido modificada para usar o objeto de fonte, qualquer texto dentro do controle será exibido com características da propriedade fonte de estoque do controle.
Usando propriedades de fonte personalizadas em seu controle
Além da propriedade fonte de estoque, o controle ActiveX pode ter propriedades de fonte personalizadas. Para adicionar uma propriedade de fonte personalizada, você deve:
Use o Assistente para Adicionar Propriedade para implementar a propriedade Font personalizada.
Implementando uma propriedade de fonte personalizada
Para implementar uma propriedade font personalizada, use o Assistente para Adicionar Propriedade para adicionar a propriedade e, em seguida, faça algumas modificações ao código. As seções a seguir descrevem como adicionar a propriedade personalizada HeadingFont ao controle Sample.
Para adicionar a propriedade Fonte personalizada usando o Assistente para Adicionar Propriedade
Carregue o projeto do controle.
No Modo de Exibição de Classe, expanda o nó de biblioteca do controle.
Clique com o botão direito do mouse no nó de interface do seu controle (o segundo nó do nó da biblioteca) para abrir o menu de atalho.
No menu de atalho, clique em Adicionar e clique em Adicionar Propriedade.
Isso abre o Assistente para Adicionar Propriedade.
Na caixa Nome da Propriedade , digite um nome para a propriedade. Para este exemplo, use HeadingFont.
Para o Tipo de Implementação, clique em Obter/Definir Métodos.
Na caixa Tipo de Propriedade , selecione IDispatch* para o tipo da propriedade.
Clique em Concluir.
O Assistente para Adicionar Propriedade cria o código para adicionar a HeadingFont propriedade personalizada à CSampleCtrl classe e ao SAMPLE. Arquivo IDL. Como HeadingFont é um tipo de propriedade Get/Set, o Assistente para Adicionar Propriedade modifica o CSampleCtrl mapa de expedição da classe para incluir um DISP_PROPERTY_EX_ID DISP_PROPERTY_EX entrada de macro:
DISP_PROPERTY_EX_ID(CMyAxFontCtrl, "HeadingFont", dispidHeadingFont,
GetHeadingFont, SetHeadingFont, VT_DISPATCH)
A macro DISP_PROPERTY_EX associa o nome da HeadingFont propriedade aos métodos Get e Set da classe correspondente CSampleCtrl e GetHeadingFontSetHeadingFont. 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 arquivo de cabeçalho de controle (. H) para as GetHeadingFont funções e SetHeadingFont 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();
}
Por fim, o Assistente para Adicionar Propriedade modifica o controle. Arquivo IDL adicionando uma entrada para a HeadingFont propriedade:
[id(1)] IDispatch* HeadingFont;
Modificações no código de controle
Agora que você adicionou a HeadingFont propriedade ao controle, você deve fazer algumas alterações no cabeçalho de controle e nos arquivos de implementação para dar suporte total à nova propriedade.
No arquivo de cabeçalho de controle (. H), adicione a seguinte declaração de uma variável de membro protegida:
protected:
CFontHolder m_fontHeading;
No arquivo de implementação de controle (. CPP), faça o seguinte:
Inicialize m_fontHeading no construtor de controle.
CMyAxFontCtrl::CMyAxFontCtrl() : m_fontHeading(&m_xFontNotification) { InitializeIIDs(&IID_DNVC_MFC_AxFont, &IID_DNVC_MFC_AxFontEvents); }Declare uma estrutura FONTDESC estática contendo atributos padrão da fonte.
static const FONTDESC _fontdescHeading = { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE(12), FW_BOLD, ANSI_CHARSET, FALSE, FALSE, FALSE };Na função membro de controle
DoPropExchange, adicione uma chamada àPX_Fontfunção. Isso fornece inicialização e persistência para sua propriedade font 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); }Conclua a implementação da função de membro de controle
GetHeadingFont.IDispatch* CMyAxFontCtrl::GetHeadingFont(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); return m_fontHeading.GetFontDispatch(); }Conclua a implementação da função de membro de controle
SetHeadingFont.void CMyAxFontCtrl::SetHeadingFont(IDispatch* pVal) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); m_fontHeading.InitializeFont(&_fontdescHeading, pVal); OnFontChanged(); //notify any changes SetModifiedFlag(); }Modifique a função membro de controle
OnDrawpara definir uma variável para manter a fonte selecionada anteriormente.CFont* pOldHeadingFont;Modifique a função membro de controle
OnDrawpara selecionar a fonte personalizada no contexto do dispositivo adicionando a linha a seguir onde quer que a fonte seja usada.pOldHeadingFont = SelectFontObject(pdc, m_fontHeading);Modifique a função de membro de controle
OnDrawpara selecionar a fonte anterior de volta ao contexto do dispositivo adicionando a linha a seguir depois que a fonte tiver sido usada.pdc->SelectObject(pOldHeadingFont);
Depois que a propriedade Font personalizada tiver sido implementada, a página de propriedade Font padrão deverá ser implementada, permitindo que os usuários de controle alterem a fonte atual do controle. Para adicionar a ID da página de propriedades para a página de propriedade fonte padrão, insira a seguinte linha após a macro BEGIN_PROPPAGEIDS:
PROPPAGEID(CLSID_CFontPropPage)
Você também deve incrementar o parâmetro de contagem de sua macro BEGIN_PROPPAGEIDS por um. A linha a seguir ilustra o seguinte:
BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)
Depois que essas alterações forem feitas, recompile todo o projeto 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 de fonte foram modificadas. Cada objeto de fonte é capaz de fornecer notificações quando é alterado chamando uma função membro da IFontNotification interface, implementada por COleControl.
Se o controle usar a propriedade fonte de estoque, suas notificações serão tratadas pela OnFontChanged função membro de COleControl. Ao adicionar propriedades de fonte personalizadas, você pode fazer com que elas usem a mesma implementação. No exemplo na seção anterior, isso foi feito passando &m_xFontNotification ao inicializar a variável de membro m_fontHeading .
Implementando várias interfaces de objeto de fonte
As linhas sólidas na figura acima mostram que ambos os objetos de fonte estão usando a mesma implementação de IFontNotification. Isso pode causar problemas se você quiser distinguir qual fonte foi alterada.
Uma maneira de distinguir entre as notificações de objeto de fonte do controle é criar uma implementação separada da IFontNotification interface para cada objeto de fonte no controle. Essa técnica permite otimizar o código de desenho atualizando apenas a cadeia de caracteres ou cadeias de caracteres que usam a fonte modificada recentemente. As seções a seguir demonstram as etapas necessárias para implementar interfaces de notificação separadas para uma segunda propriedade Font. Supõe-se que a segunda propriedade de fonte seja a HeadingFont propriedade que foi adicionada na seção anterior.
Implementando uma nova interface de notificação de fonte
Para distinguir entre as notificações de duas 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 o cabeçalho de controle e os arquivos de implementação.
Adições ao arquivo de cabeçalho
No arquivo de cabeçalho de controle (. H), adicione as seguintes linhas à declaração de 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 da IPropertyNotifySink interface chamada HeadingFontNotify. Essa nova interface contém um método chamado OnChanged.
Adições ao arquivo de implementação
No código que inicializa a fonte de título (no construtor de 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;
}
O AddRef e Release os métodos na interface mantêm o IPropertyNotifySink controle da 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 é concluído com o ponteiro, ele chama Release, da mesma forma que GlobalFree pode ser chamado para liberar um bloco de memória global. Quando a contagem de referência para essa interface for zero, a implementação da interface poderá ser liberada. Neste exemplo, a QueryInterface função retorna um ponteiro para uma IPropertyNotifySink interface em um objeto específico. Essa função permite que um controle ActiveX consulte um objeto para determinar quais interfaces ele dá suporte.
Depois que essas alterações forem feitas em seu projeto, recompile o projeto e use o Contêiner de Teste para testar a interface. Confira Testar Propriedades e Eventos com o Contêiner de Testes para obter informações sobre como acessar o contêiner de testes.
Consulte também
Controles MFC ActiveX
Controles ActiveX do MFC: usando imagens em um controle ActiveX
Controles ActiveX do MFC: usando páginas de propriedades de estoque