Как динамически создавать несколько элементов управления по клику

Я пытаюсь создать несколько строк элементов управления (поле редактирования, флажок и кнопку удаления) в диалоговом окне MFC динамически во время выполнения при нажатии кнопки. А также все добавленные элементы управления должны отображаться в окне прокрутки. Но, к сожалению, я не могу найти решение этой проблемы. У кого-нибудь есть идеи?

Я могу создать один ряд элементов управления. Моя проблема заключается в том, как добавить несколько строк при нажатии кнопки «Добавить», а также удалить эту строку, нажав кнопку «Удалить» в той же строке.

Это должно выглядеть примерно так после того, как я несколько раз нажал «Добавить»:

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

Если вы знаете, как создать одну строку элементов управления, и хотите создать несколько строк, выполните код, который создает одну строку несколько раз. Непонятно, в чем проблема настоящий (при условии, что это не та проблема, которая имеет тривиальное решение).

IInspectable 21.05.2019 10:52

@IInspectable Моя настоящая проблема в том, что я использовал GetWindowRect и ScreentoClient, чтобы найти нужную координату для создания моего элемента управления. но когда я добавляю эти значения из ScreentoClient в CRect(), он ничего не создает. поэтому мне нужно создать невидимые элементы управления и получить от них координаты, а затем перейти к переменной rect. Затем я могу создать новые элементы управления поверх тех, которые были скрыты. Вот и все. я знаю, что это потому, что каждый раз, когда я нажимаю «Добавить», код в функции AddControlSet каждый раз получает только одну и ту же координату, но я не знаю никакого решения, чтобы это исправить.

Turtle Lover 21.05.2019 11:16

Это один способ хранения состояния. Я уверен, что есть менее запутанные способы сохранения необходимой информации, чтобы знать, куда должна идти следующая строка элементов управления. Например, сохранить некоторую идентифицируемую функцию самой последней созданной строки. В любом случае, если это действительно проблема, которую вы пытаетесь решить, вам придется включить ее в свой вопрос. Как написано, это не очевидно.

IInspectable 21.05.2019 13:57

Возможно, вам действительно нужна сетка, содержащая ряды необходимых ячеек. Затем нажатие кнопки просто добавляет новую строку. Например, Окончательная сетка Дандас поддерживает типы ячеек с флажками и кнопками.

acraig5075 22.05.2019 08:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
652
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы имеете дело с динамическим созданием элемента управления в оконной среде, вы должны знать направление Икс и Д для рисования/создания элемента управления в форме.

Ниже приведено направление монитора:

Теперь предположим, что вы создаете элемент управления в форме, начиная с CRect rect(0, 0, 100, 50);

Затем один элемент управления в одной строке будет размещен в этом месте (поле редактирования в вашем случае), и когда вы добавляете кнопку удаления рядом с полем редактирования в той же строке, вы должны добавить несколько координат на оси Икс, чтобы получить новое местоположение кнопки удаления . Следовательно, прямоугольник следующего местоположения будет выглядеть примерно так: CRect rect(105, 0, 205, 50);

Точно так же, когда для перехода к следующей строке следует добавить ось Y с несколькими координатами, чтобы получить новое местоположение для следующей строки. Например, координаты элемента управления редактирования следующей строки будут CRect rect(0, 55, 100, 105);

Но я не знаю, почему, когда я ввожу свои координаты в CRect(), он ничего не делает. Я предполагаю это, потому что координата, которую я ввел, была ложной. но я буквально использую все, от GetWindowRect() + ScreentoClient() до GetClientRect()+ScreentoClient(). Но когда я ввожу те координаты, которые я нашел, я все еще не вижу своего поля редактирования в диалоговом окне. единственное, о чем я мог подумать, это то, что тип значения координат (при отображении в режиме отладки) был «длинным», но CRect был (int l, int t, int r, int b). Это меня так смущает.

Turtle Lover 21.05.2019 12:22

Другие вопросы по теме