假设我想创建一个对象的网格,比如按钮。我知道Window的宽度和高度,也知道需要添加的按钮数量。
有没有智能算法可以根据这个计算每个按钮的宽度和高度?我正试图想出一些东西,但当我真的想填充整个窗口时,我得到的只是一片空白。
无论对象是什么,在这种情况下,为了简单起见,我都使用按钮。
简单地说,我想用一个对象(一个按钮)填充整个屏幕。如果只有一个按钮可以填充整个屏幕,那么两个按钮将共享大小。
而且,如果我想在下一次运行时将值更改为更多按钮,那么它也应该填满整个屏幕。
有什么想法吗?
如果您有一行按钮,您只需要将窗口的宽度除以按钮的数量,并将所有按钮的宽度设置为该值。
button.width = window.width / numberOfButtons;
button.height = window.height;
如果你有多行,只需要对高度做同样的处理;
button.width = window.width / numberOfButtonsH;
button.height = window.height / numberOfButtonsV;
如果希望按钮的大小更合理,请尝试使用所需按钮数的平方根作为一行中按钮的数量。如果所需的按钮数量不均匀,则添加另一行并将该行中的最后一个按钮居中。
对于十七个按钮,您将有五行,前四行每行四个按钮,最后一行一个按钮。
可以这样做(编辑为使用临时数据结构):
int width = 600;//replace those values with your own dimensions
int height = 600;
inline bool isUneven(const int i)
{
return (i%2);
}
struct tempButton
{
int x,y,w,h;
};
void populateWindow( const int requestedObjects = 18 )
{
int objectsPerRow = (int)floor(sqrt(requestedObjects));
int rows = objectsPerRow;
int diff = requestedObjects-rows*objectsPerRow;
tempButton tmp[requestedObjects];
if(diff>0)
{
++rows;// only needed for button dimension calculation, will be changed later
}
int buttonWidth = width / objectsPerRow;
int buttonHeight = height / rows;
int lastRowWidth = 0; width / diff;
for(int i=0; i<requestedObjects-diff; ++i)
{
tmp[i].h = buttonHeight;
tmp[i].w = buttonWidth;
}
if(diff>0)
{
lastRowWidth = width / diff;
for(int i=requestedObjects-diff; i<requestedObjects; ++i)
{
tmp[i].h = buttonHeight;
tmp[i].w = lastRowWidth;
}
--rows; // subtract one, because placing the last button on its own is easier
}
for(int i=0; i<rows; ++i)
{
for(int j=0; j<objectsPerRow; ++j)
{
tmp[j+i*objectsPerRow].x = j*buttonWidth; // set the positions
tmp[j+i*objectsPerRow].y = i*buttonHeight;
}
}
if(diff>0)
{
for(int i=requestedObjects-diff; i<requestedObjects; ++i)
{
tmp[i].x = (i-(requestedObjects-diff))*lastRowWidth;
tmp[i].y = rows*buttonHeight;
}
}
// now create the buttons using the temporary data
}
要做到这一点,您需要更多的规则。
控件的数量必须是另外两个数字的乘积,所以正如有人建议的那样,17只给你17*1,所以按钮宽度是宽度/17,按钮高度是窗口高度,如果你喜欢一列,反之亦然。
你可以试着用纵横比做一些事情来让这更有意义,例如宽度>高度意味着你应该去划船。
如果控件的数量是一个乘积,那么它将是一个正方形,或者您可以再次使用宽度/高度来计算按钮的宽度和高度。
你可能还想考虑按钮的最小宽度和高度,但你会遇到更多不适合的问题。如果你想在每个按钮周围添加一些填充物,只需计算一下,然后将按钮居中。