使用控件(按钮等)动态填充100%窗口的算法



假设我想创建一个对象的网格,比如按钮。我知道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,按钮高度是窗口高度,如果你喜欢一列,反之亦然。

你可以试着用纵横比做一些事情来让这更有意义,例如宽度>高度意味着你应该去划船。

如果控件的数量是一个乘积,那么它将是一个正方形,或者您可以再次使用宽度/高度来计算按钮的宽度和高度。

你可能还想考虑按钮的最小宽度和高度,但你会遇到更多不适合的问题。如果你想在每个按钮周围添加一些填充物,只需计算一下,然后将按钮居中。

最新更新