Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Se o controle ActiveX exibir texto, você poderá permitir que o usuário do controle altere a aparência do texto alterando uma propriedade de fonte. As propriedades de fonte são implementadas como objetos de fonte e podem ser de dois tipos: stock ou custom. As propriedades de Fonte de Estoque são propriedades de fonte pré-implementadas que você pode adicionar usando o Assistente para Adicionar Propriedade. As propriedades de fonte personalizada não são pré-implementadas e o desenvolvedor de controle determina o comportamento e o uso da propriedade.
Este artigo aborda os seguintes tópicos:
Utilizando a propriedade de Fonte Padrão (Stock Font)
As propriedades Stock Font são pré-implementadas pela classe COleControl. Além disso, uma página de propriedades Font padrão também está disponível, permitindo que o usuário altere vários atributos do objeto de fonte, como nome, tamanho e estilo.
Acesse o objeto font por meio das funções GetFont, SetFont e InternalGetFont do COleControl. O usuário de controle acessará o objeto de fonte através das GetFont funções e SetFont da mesma maneira que qualquer outra propriedade Get/set. Quando o acesso ao objeto de fonte é necessário de dentro de um controle, use a InternalGetFont função.
Conforme discutido em MFC ActiveX Controls: Properties, adicionar 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 padrão de Fonte no mapa de despacho do controlo.
Para adicionar a propriedade de Fonte padrão usando o Assistente de Adição de Propriedade
Carregue o projeto do seu controlador.
Na Vista de Classe, expanda o nó da biblioteca do seu controle.
Clique com o botão direito do mouse no nó da 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, em seguida, 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 despacho 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 arquivo .IDL do controle:
[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 stock Font. Adicionar a propriedade Caption padrão ao controlo utiliza etapas semelhantes às usadas para a propriedade Font padrão.
Para adicionar a propriedade de legenda padrão usando o Assistente para Adicionar Propriedade
Carregue o projeto do seu controlador.
Na Vista de Classe, expanda o nó da biblioteca do seu controle.
Clique com o botão direito do mouse no nó da 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, em seguida, 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 despacho 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 de OnDraw utiliza a fonte de sistema do Windows para todo o texto exibido no controlo. 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 foi modificada para usar o objeto de fonte, qualquer texto dentro do controle é exibido com características da propriedade Font do controle.
Usando propriedades de fonte personalizadas em seu controle
Além da propriedade de fonte padrão, o controlo ActiveX pode ter propriedades de fonte personalizadas. Para adicionar uma propriedade de fonte personalizada, você deve:
Utilize o Assistente de Adição de Propriedades para implementar a propriedade personalizada de Font.
Implementação de uma nova interface de notificação de fontes.
Implementando uma propriedade de fonte personalizada
Para implementar uma propriedade personalizada de Font, utilize o Assistente para Adicionar Propriedade para adicionar a propriedade e depois faça algumas modificações no código. As seções a seguir descrevem como adicionar a propriedade personalizada HeadingFont ao controle Sample.
Para adicionar a propriedade de tipo de letra personalizada com o Assistente para Adicionar Propriedades
Carregue o projeto do seu controlador.
Na Vista de Classe, expanda o nó da biblioteca do seu controle.
Clique com o botão direito do mouse no nó da 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, em seguida, 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 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 arquivo SAMPLE.IDL. Como HeadingFont é um tipo de propriedade Get/Set, o Assistente para Adicionar Propriedade modifica o mapa de despacho da classe CSampleCtrl para incluir uma entrada de macro DISP_PROPERTY_EX_ID DISP_PROPERTY_EX:
DISP_PROPERTY_EX_ID(CMyAxFontCtrl, "HeadingFont", dispidHeadingFont,
GetHeadingFont, SetHeadingFont, VT_DISPATCH)
A macro DISP_PROPERTY_EX associa o nome da propriedade HeadingFont aos métodos Get e Set CSampleCtrl e GetHeadingFont da classe correspondente SetHeadingFont. O tipo do valor da propriedade também é especificado; neste caso, VT_FONT.
O Assistente para Adicionar Propriedade também adiciona uma declaração no ficheiro de cabeçalho de controlo (.H) para as funções GetHeadingFont e SetHeadingFont, e adiciona os seus modelos de função no ficheiro de implementação de controlo (.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 controle . IDL adicionando uma entrada para a HeadingFont propriedade:
[id(1)] IDispatch* HeadingFont;
Alterações ao Código de Controlo
Agora que você adicionou a HeadingFont propriedade ao controle, você deve fazer algumas alterações no cabeçalho do controle e nos arquivos de implementação para oferecer 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 ficheiro de execução do controlo (. 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 controlo
DoPropExchange, adicione uma chamada à funçãoPX_Font. Isso fornece inicialização e persistência para sua propriedade de fonte 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 de membro de controle
OnDrawpara definir uma variável para manter a fonte selecionada anteriormente.CFont* pOldHeadingFont;Modifique a função de membro de controle
OnDrawpara selecionar a fonte personalizada no contexto do dispositivo, adicionando a seguinte linha 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 seguinte linha após a fonte ter sido usada.pdc->SelectObject(pOldHeadingFont);
Depois que a propriedade Font personalizada tiver sido implementada, a página de propriedades Font padrão deve ser implementada, permitindo que os usuários de controle alterem a fonte atual do controle. Para adicionar o ID da página de propriedades para a página de propriedades Fonte padrão, insira a seguinte linha após a macro BEGIN_PROPPAGEIDS:
PROPPAGEID(CLSID_CFontPropPage)
Você também deve incrementar o parâmetro count de sua macro BEGIN_PROPPAGEIDS em um. A linha a seguir ilustra isso:
BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)
Depois que essas alterações forem feitas, reconstrua todo o projeto para incorporar a funcionalidade adicional.
Processando 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 interface IFontNotification, implementada por COleControl.
Se o controle usa a propriedade Font stock, suas notificações são manipuladas pela OnFontChanged função de membro do 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 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 do 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 interface para cada objeto de IFontNotification fonte no controle. Essa técnica permite que você otimize seu código de desenho atualizando apenas a cadeia de caracteres, ou strings, 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. Assume-se que a segunda propriedade de letra é a propriedade HeadingFont 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. Esta nova interface contém um método chamado OnChanged.
Aditamentos ao ficheiro de execução
No código que inicializa a fonte do 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;
}
Os métodos AddRef e Release na interface IPropertyNotifySink controlam a contagem de referências para o objeto de controle ActiveX. Quando o controlador obtém acesso ao ponteiro da interface, o controlador chama AddRef para aumentar 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 esta interface vai para zero, a implementação da interface pode 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 suporta.
Depois que essas alterações tiverem sido feitas em seu projeto, reconstrua o projeto e use o contêiner de teste para testar a interface. Consulte Propriedades e eventos de teste com contêiner de teste para obter informações sobre como acessar o contêiner de teste.
Ver também
Controles ActiveX MFC
Controles ActiveX MFC: Usando imagens em um controle ActiveX
Controles ActiveX MFC: Usando páginas de propriedades padrão