Se eu criar um CMFCLinkCtrl
controle programaticamente e atribuir o texto no construtor, tudo ficará bem. Mas se eu tentar alterar o URL para outra coisa, ele não será atualizado visualmente. De acordo com a documentação SetURL
afirma:
Exibe um URL especificado como texto do botão.
Mas quando você olha para a fonte MFC subjacente do controle, tudo o que ele faz é:
void CMFCLinkCtrl::SetURL(LPCTSTR lpszURL)
{
if (lpszURL == NULL)
{
m_strURL.Empty();
}
else
{
m_strURL = lpszURL;
}
}
Ligar UpdateWindow();
ou Invalidate();
ligar no controle não fez diferença. Percebi então que o IDE tem duas propriedades:
Para legenda é afirmado:
Especifica o texto exibido pelo controle.
Para URL afirma:
Especifica a sequência de URL do controle de link.
No final eu simplesmente fiz isso:
m_linkStatusbarLocalCong.SetURL(strCongregation);
m_linkStatusbarLocalCong.SetWindowText(strCongregation);
Agora está funcionando bem. Perdi alguma coisa ao ler a documentação?
Não. A documentação afirma claramente:
E isso é uma mentira.
SetURL()
atualiza apenas o membro da classe protegidom_strURL
, mas não executa nenhuma etapa adicional. Se todo o resto na implementação fosse sensato, isso não seria um grande problema, e a chamadaUpdateWindow()
reconciliaria a representação visual com o estado interno.Embora nada na
CMFCLinkCtrl
implementação de seja sensato. O códigoOnDraw()
chega e lê o texto da janela para exibição e nunca consideram_strPrefix
/m_strURL
.Em essência,
SetWindowText()
controla o que está sendo exibido eSetURLPrefix()
/SetURL()
define a URL a ser lançada ao clicar. Você precisa atualizar ambos para que a exibição seja consistente com o comportamento.Não sei por que o MFC optou por criar o seu próprio em vez de agrupar um controle SysLink
CMFCLinkCtrl
nativo . Eu sei que foi executado de forma incrivelmente desleixada.