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

C++ 使用控件(按钮等)动态完全填充100%窗口的算法,c++,algorithm,dynamic,grid,C++,Algorithm,Dynamic,Grid,假设我想创建一个对象的网格,比如按钮。我知道窗口的宽度和高度,也知道要添加的按钮数量 是否有任何智能算法可以根据此计算每个按钮的宽度和高度?我试图想出一些办法,但当我真的想填充整个窗口时,我得到的只是剩下的空白 无论对象是什么,在这种情况下,为了简单起见,我使用按钮 简单地说,我想用一个对象(一个按钮)填充整个屏幕。如果只有一个按钮可以填充整个屏幕,那么两个按钮的大小相同 而且,如果我想在下次运行时将值更改为更多按钮,那么它也应该填满整个屏幕 有什么想法吗?如果有一行按钮,只需将窗口的宽度除以按

假设我想创建一个对象的网格,比如按钮。我知道窗口的宽度和高度,也知道要添加的按钮数量

是否有任何智能算法可以根据此计算每个按钮的宽度和高度?我试图想出一些办法,但当我真的想填充整个窗口时,我得到的只是剩下的空白

无论对象是什么,在这种情况下,为了简单起见,我使用按钮

简单地说,我想用一个对象(一个按钮)填充整个屏幕。如果只有一个按钮可以填充整个屏幕,那么两个按钮的大小相同

而且,如果我想在下次运行时将值更改为更多按钮,那么它也应该填满整个屏幕


有什么想法吗?

如果有一行按钮,只需将窗口的宽度除以按钮的数量,然后将所有按钮的宽度设置为该值

button.width  = window.width / numberOfButtons;
button.height = window.height;
如果有多行,只需对高度执行相同的操作

button.width  = window.width  / numberOfButtonsH;
button.height = window.height / numberOfButtonsV;
如果希望按钮具有更合理的大小,请尝试使用所需按钮数的平方根表示一行中的按钮数。如果所需的按钮数量不均匀,请添加另一行,并将此行中的最后一个按钮居中

十七个按钮有五行,前四行每行四个按钮,最后一行一个按钮

可以这样做(编辑以使用临时数据结构):

int-width=600//用您自己的维度替换这些值
内部高度=600;
内联布尔不均匀(常数int i)
{
回报率(i%2);
}
结构临时按钮
{
int x,y,w,h;
};
void populateWindow(常量int requestedObjects=18)
{
int objectsPerRow=(int)楼层(sqrt(requestedObjects));
int rows=objectsPerRow;
int diff=请求的对象行*对象箭头;
tempButton tmp[请求对象];
如果(差异>0)
{
++行;//仅用于按钮尺寸计算,将在以后更改
}
int buttonWidth=宽度/对象箭头;
int buttonHeight=高度/行数;
int lastRowWidth=0;宽度/差异;
对于(int i=0;i0)
{
lastRowWidth=宽度/差异;

对于(int i=requestedObjects diff;i要做到这一点,您需要更多的规则

控件的数量必须是其他两个数字的乘积,因此,正如有人建议的那样,17只提供17*1,因此按钮宽度为gridth width/17,按钮高度为窗口高度,如果您喜欢一列,则反之亦然

你可以试着用纵横比来做一些事情,使之更有意义。例如,宽度>高度意味着你应该排一行

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


你可能还想考虑按钮的最小宽度和高度,但是你有更多的不适合的问题。如果你想在每个按钮周围填充一些,只需计算它然后集中其中的按钮。

所以你希望你的控件相等(或几乎)。共享窗口空间?您使用的是什么UI框架?几乎任何一个都应该提供布局管理器来为您处理。另一个问题:您希望如何分布对象?全部在一行中?多列和多行?您需要更具体一些。如果我有一个500x500、大约20或10 c的窗口他们应该均匀地分布。像网格一样。我在考虑窗口的长宽比,并且按按钮分配,但是我不知道如何。所以它们看起来“正常”,而不是一些按钮的宽度是2像素,高度是20。我只是使用C++,而不是用窗体或任何东西。所以我用CreateWindow创建按钮。(文本(“按钮”)…)这是一个弱的答案,你的算法如何渲染17个控件,智能地分布?我看不到比以前的不同。你给了我布局,但是没有算法。而且,代码比C++更为C。按钮不是类。我只能在创建它们时设置ID、x、y和大小。(键入、文本、样式、x、y、size_x、size_y、parent、hMenu、Instance、lpParam);您可以创建一个临时数据结构来保存这些值,然后在函数末尾创建按钮。我将根据该按钮编辑帖子。
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

}