搜索了一下,发现问题出在MFC的
CMFCMenuButton::SizeToContent()
afxmenubutton.cpp中的实现:
CSize CMFCMenuButton::SizeToContent(BOOL bCalcOnly)
{
CSize size = CMFCButton::SizeToContent(FALSE); // <==== The culprit!!!
size.cx += CMenuImages::Size().cx;
if (!bCalcOnly)
{
SetWindowPos(NULL, -1, -1, size.cx, size.cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
}
return size;
}
也就是说,它将
SizeToContent()
与
bCalcOnly
参数设置为
FALSE
,这意味着它还将调整控件的大小以刚好适合文本(没有下拉箭头)。这比文本加上箭头所需的要小,当然原始大小也会丢失。
解决方法可以是在
大小到内容()
调用,并使用此项而不是新项:
CRect rctButton;
m_btnReset.GetWindowRect(&rctButton);
const auto nOrigWidth = rctButton.Width(); // Store the original width
const auto sizNewButton = m_btnReset.SizeToContent(true); // This resizes the control!!!
if (sizNewButton.cx > nOrigWidth) // Compare to the original width rather than the new one
m_btnReset.SizeToContent();
else // Restore original width
m_btnReset.SetWindowPos(NULL, -1, -1, nOrigWidth, sizNewButton.cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
替代解决方案:
定义新的
CMFCMenuButton
-基于类,重写
大小到内容()
-在实现中调用基础
CMFCButton::SizeToContent()
与
b仅计算
由调用方传递的参数,而不是
错误的
。将控件映射到此类,而不是
CMFC菜单按钮
。那就是使用一个修复它的类。不过,对于一个变通方法来说,这太过分了。