我正在创建一个UI。现在我正在研究通用box
s,它们在调整大小时动态添加和删除滚动条。
我沿着底部和右边缘绘制滚动条。内边缘很重要。
所以在某些时候盒子的大小调整了。如果它已调整大小,我会检查新尺寸是否小于内容所需的尺寸,如果是,则添加滚动条。
我的问题源于只需要一个滚动条的时候;其他尺寸/轴的尺寸非常接近内容所需的尺寸。
这个滚动条是在内边缘绘制的。现在删除可用于内容的区域。问题是,如果显示滚动条,我将不得不再次检查可用区域以查看是否需要其他滚动条。然后再说一遍。
这似乎是一个递归问题;但我不确定它对我有什么帮助。
一些代码:
void Box::UpdateVisibleRegion()
{
// if the dimensions of this box is smaller than what the widget needs, display horizontal scrollbar
if(GetDimensions().x < m_widget->GetDimensions().x)
{
m_scrollbarH->SetVisibility(true);
m_scrollbarH->SetSize(utils::coord<int>(GetDimensions().x,m_scrollbarH->GetDimensions().y));
}
else
{
m_scrollbarH->SetVisibility(false);
}
// likewise for vertical scrollbar
if(GetDimensions().y < m_widget->GetDimensions().y)
{
m_scrollbarV->SetVisibility(true);
m_scrollbarV->SetSize(utils::coord<int>(m_scrollbarV->GetDimensions().x,GetDimensions().y));
}
else
{
m_scrollbarV->SetVisibility(false);
}
而且存在问题。如果盒子的高度刚刚超过小部件的高度;宽度远远低于它;然后显示水平滚动条。但现在检查垂直滚动条应该是:
if(GetDimensions().y - m_scrollbarH->GetDimensions().y < m_widget->GetDimensions().y)
因为滚动条在内侧边缘绘制,所以空间较小。但显然我不知道,直到我检查了另一个。水平和垂直都会相互影响。
我确信递归就是答案;但是我看不到它。
我可以用一两个大的嵌套if语句来做到这一点......