Я создаю базовый графический интерфейс для студенческого проекта, использую wxwidgets и кодовые блоки, потому что C++ - мой удобный язык программирования. Однако я хочу изменить параметры в wxChoice, потому что эти параметры не должны быть всегда одинаковыми, это означает, что если я добавлю что-то в список выбора, а затем я хочу обновить список до полного другого списка, сначала я Мне нужно удалить старые элементы из списка выбора, а затем добавить новые, но я не могу найти, как это сделать. Вот мой код:
//Event
void TestFrame::OnChoice1Select(wxCommandEvent& event)
{
fstream in;
string str,str2;
int i;
//File where I store my list of lists
in.open("Recursos/Carreras-LC.txt",ios::in);
//Go to an specific line of the file where the list for the current choice is
in=gotoLine(in,Choice1->GetSelection()+1);
//Gets the line with the list
getline(in,str,'\n');
in.close();
//Here is where I'll put the code to remove the current list of choices
//My code to append the items from the list i got before
i=0;
while(str[i]!='\0'){
if (str[i]==','){
Choice2->Append(_(str2));
i++;
str2 = "";
}else{
str2+=str[i];
i++;
}
}
}
Также, если есть лучший способ сделать такой динамический графический интерфейс, пожалуйста, сообщите мне. заранее спасибо.





i have to remove the old items from the choice list and then append the new ones, but i cant find how to do that
Вы можете использовать метод wxChoice :: Clear () для удаления всех записей из элемента управления выбором, и вы можете использовать метод wxChoice :: Delete (unsigned int n) для удаления определенной записи из элемента управления.
Они перечислены в страница документации в разделе «Общедоступные функции-члены, унаследованные от wxItemContainer».
Also if there's a better way to do this kind of dynamic GUI please tell me. thanks in advance.
Один из вариантов - использовать wxUpdateUIEvent для обновления выбора, когда основной кадр находится в режиме ожидания. Если вы собираетесь пойти по этому пути, я бы
m_choiceNeedsUpdate или что-то в этом роде и обработчик событий void OnUpdateUI(wxUpdateUIEvent& event) (или как вы хотите его назвать) в класс формы вашего приложения.this->Bind(wxEVT_UPDATE_UI,&MyFrame::OnUpdateUI,this);Когда вы делаете что-то, что требует обновления выбора, вы можете организовать его обновление с помощью таких вызовов:
m_choiceNeedsUpdate=true;
this->UpdateWindowUI();
Тело обработчика событий, в котором обновляется элемент управления выбором, может выглядеть примерно так
void MyFrame::OnUpdateUI(wxUpdateUIEvent& event)
{
if (m_choiceNeedsUpdate)
{
//Update the choice control here (probably using the Clear/Delete methods)
m_choiceNeedsUpdate=false;
}
}
Преимущество этого маршрута состоит в том, что вся логика, касающаяся обновления пользовательского интерфейса, может быть помещена в один метод / обработчик событий. Это особенно удобно, если у вас есть несколько элементов управления, которые могут нуждаться в динамическом обновлении.
Обратной стороной является то, что во время работы вашего фрейма будет происходить много вызовов этого обработчика событий, что потенциально может повлиять на производительность. Вот почему я защитил логику изменения элемента управления выбором с помощью переменной m_choiceNeedsUpdate bool в приведенном выше примере.
wxEVT_UPDATE_UIне предназначен для такого использования, он должен обновлять элемент управления напрямую, а не устанавливать флаг. Если вы сделаете именно это, будет менее запутанно просто использоватьwxEVT_IDLEнапрямую.