如果我CMFCLinkCtrl
以编程方式创建一个控件并在构造函数中分配文本,一切都很好。但如果我随后尝试将 URL 更改为其他内容,它不会在视觉上更新。根据它的文档指出SetURL
:
将指定的 URL 显示为按钮文本。
但是,当您查看该控件的底层 MFC 源代码时,它所做的只是:
void CMFCLinkCtrl::SetURL(LPCTSTR lpszURL)
{
if (lpszURL == NULL)
{
m_strURL.Empty();
}
else
{
m_strURL = lpszURL;
}
}
调用UpdateWindow();
或Invalidate();
控制没有任何区别。然后我意识到 IDE 有两个属性:
对于标题是这样的:
指定控件显示的文本。
对于URL,它指出:
指定链接控件的 url 字符串。
最后我简单地这样做了:
m_linkStatusbarLocalCong.SetURL(strCongregation);
m_linkStatusbarLocalCong.SetWindowText(strCongregation);
现在工作正常。我在阅读文档时错过了什么吗?
不可以。文档明确指出:
那是一个谎言。
SetURL()
仅更新受保护的类成员m_strURL
,但不执行任何其他步骤。如果实现中的其他一切都正常,这就不是什么大问题,并且调用UpdateWindow()
将使视觉表示与内部状态保持一致。尽管如此,实现中没有任何内容是理智的。
CMFCLinkCtrl
中的代码OnDraw()
伸出手来读取窗口文本以进行显示,甚至从不考虑m_strPrefix
/m_strURL
。实质上,
SetWindowText()
控制显示的内容,并SetURLPrefix()
/SetURL()
设置单击时启动的 URL。您必须更新两者,以便显示与行为一致。我不知道为什么 MFC 选择自己推出
CMFCLinkCtrl
而不是包装本机SysLink控件。我确实知道它的执行非常草率。