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