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

C++ 如何在单击时动态创建多个控件,c++,mfc,C++,Mfc,我试图在运行时单击按钮时在M.F.C对话框中动态创建多行控件(编辑框、复选框和删除按钮)。 而且所有添加的控件都应该显示在滚动窗口中。 但不幸的是,我找不到任何解决这个问题的办法。 有人有什么想法吗 我可以创建一行控件。我的问题是如何在单击“添加”按钮时添加多行,并通过单击同一行上的“删除”按钮删除该行 在我多次单击“添加”后,应该是这样的: | Edit Box: Type in a Name | |Add| |Edit Box| |Name 1 (Edit

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

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

在我多次单击“添加”后,应该是这样的:

|     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();
}

当您在窗口环境中处理控件的动态创建时,您应该知道XY在窗体上绘制/创建控件的方向

以下是监视器的方向:

现在让我们假设您正在表单上创建控件,从
crectrect(0,01000,50)开始

然后,单行中的一个控件将放置在此位置(本例中为编辑框),当您在同一行的编辑框旁边添加删除按钮时,应在X轴中添加少量坐标,以获取删除按钮的新位置。因此,下一个位置的rect将类似于,
crectrect(105,0205,50)


当移动到下一行时,同样的方法是添加Y轴和少量坐标,以获得下一行的新位置。例如,下一行编辑控制坐标将是
CRect rect(0,55,100,105)

如果您知道如何创建一行控件,并且希望创建多行,请多次执行创建一行的代码。现在还不清楚真正的问题是什么(假设问题没有一个简单的解决方案)。@IInspectable我真正的问题是我使用GetWindowRect和ScreentoClient找到了创建控件所需的坐标。但当我将ScreentoClient中的这些值添加到CRect()中时,它没有创建任何内容。所以我必须创建不可见的控件并从中获取坐标,然后传递给rect变量。然后我可以在隐藏的控件之上创建新控件。就这样。我知道这是因为每次单击Add时,AddControlSet函数中的代码每次只能获得相同的坐标,但我不知道任何解决方案来修复它。这是存储状态的一种方法。我确信有一些不那么复杂的方法来保存您需要的信息,以知道下一行控件应该放在哪里。比如存储最近创建的行的一些可识别特征。不管怎样,如果这确实是你想要解决的问题,你必须把它包括在你的问题中。正如所写的,这并不明显。也许你们真正需要的是一个包含所需单元格行的网格。然后按下按钮只会添加一个新行。例如,支持复选框和按钮单元格类型。但我不知道为什么,当我将坐标输入到CRect()时,它没有做任何事情。我假设它是因为我输入的坐标是假的。但我实际上使用了一切,从GetWindowRect()+ScreentoClient(),到GetClientRect()+ScreentoClient()。但是当我输入我找到的坐标时,我仍然看不到对话框中的任何地方。我唯一能想到的是坐标的值类型(在调试模式下显示时)是“long”,但正确的是(intl,intt,intr,intb)。这让我很困惑。