如何在单击时动态创建多个控件

How to create multiple controls dynamically on click

我正在尝试在 运行 按钮单击时动态地在 M.F.C 对话框中创建多行控件(编辑框、复选框和删除按钮)。 并且所有添加的控件都应该在滚动中显示 window。 但不幸的是我找不到解决这个问题的方法。 有人有什么想法吗?

我可以创建一行控件。我的问题是如何在单击“添加”按钮时添加多行,以及如何通过单击同一行上的“删除”按钮来删除该行。

点击添加多次后应该是这样的:

|     Edit Box: Type in a Name          |    |Add| 

|Edit Box| |Name 1 (Edit Box)| |Edit Box| |Delete|   ^ 
|Edit Box| |Name 2 (Edit Box)| |Edit Box| |Delete|   | 
|Edit Box| |Name 3 (Edit Box)| |Edit Box| |Delete|   |
etc...                                               v

这是我的一些代码:

int CSettingDlg::AddControlSet() //Create a single row of controls
{
    int d = 3500;
    if (m_pStrAdd.IsEmpty() == FALSE)
    {
        GetDlgItem(IDC_TEST1)->GetWindowRect(&rect);
        ScreenToClient(&rect);

        EditBox = new CEdit;
        EditBox->Create(WS_CHILD | WS_VISIBLE | WS_BORDER | ES_READONLY, rect, this, d++);

//using the same code above to create 2 more Edit box

        Delete = new CButton;
        Delete->Create(_T("Del"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, rect, this, d++);
        return TRUE;
    }
}

void CSettingDlg::OnBnClickedAddSettingdlg() //Add button Event handler
{
        UpdateData();
        AddControlSet();
}

当你在window环境中处理动态创建控件时,你应该知道XY方向draw/create 表单控件。

监控方向如下:

现在假设您正在以 CRect rect(0, 0, 100, 50);

开头的表单上创建控件

然后单行中的一个控件将放置在此位置(在您的情况下为编辑框),当您在同一行中的编辑框旁边添加删除按钮时,您应该在 X 轴获取删除按钮的新位置。因此下一个位置的矩形将类似于 CRect rect(105, 0, 205, 50);

移动到下一行时采用相同的方法,然后 Y 轴应添加少量坐标以获得下一行的新位置。例如,下一行编辑控件坐标将为CRect rect(0, 55, 100, 105);