Я пытаюсь создать несколько строк элементов управления (поле редактирования, флажок и кнопку удаления) в диалоговом окне 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 Моя настоящая проблема в том, что я использовал GetWindowRect и ScreentoClient, чтобы найти нужную координату для создания моего элемента управления. но когда я добавляю эти значения из ScreentoClient в CRect(), он ничего не создает. поэтому мне нужно создать невидимые элементы управления и получить от них координаты, а затем перейти к переменной rect. Затем я могу создать новые элементы управления поверх тех, которые были скрыты. Вот и все. я знаю, что это потому, что каждый раз, когда я нажимаю «Добавить», код в функции AddControlSet каждый раз получает только одну и ту же координату, но я не знаю никакого решения, чтобы это исправить.
Это один способ хранения состояния. Я уверен, что есть менее запутанные способы сохранения необходимой информации, чтобы знать, куда должна идти следующая строка элементов управления. Например, сохранить некоторую идентифицируемую функцию самой последней созданной строки. В любом случае, если это действительно проблема, которую вы пытаетесь решить, вам придется включить ее в свой вопрос. Как написано, это не очевидно.
Возможно, вам действительно нужна сетка, содержащая ряды необходимых ячеек. Затем нажатие кнопки просто добавляет новую строку. Например, Окончательная сетка Дандас поддерживает типы ячеек с флажками и кнопками.
Когда вы имеете дело с динамическим созданием элемента управления в оконной среде, вы должны знать направление Икс и Д для рисования/создания элемента управления в форме.
Ниже приведено направление монитора:
Теперь предположим, что вы создаете элемент управления в форме, начиная с 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). Это меня так смущает.
Если вы знаете, как создать одну строку элементов управления, и хотите создать несколько строк, выполните код, который создает одну строку несколько раз. Непонятно, в чем проблема настоящий (при условии, что это не та проблема, которая имеет тривиальное решение).