Руководство по программированию с wxWidgets (8. Виджеты часть 2). |
- Statistics
- Participants
- Translate into Russian
- Translation result
- Translation complete.
Виджеты часть 2.
В этой главе мы продолжим знакомство с различными виджетами.
wxListBox (Окно списка)
Окно списка (лист бокс) используется для отображения и работы со списком объектов. Как следует из названия - это прямоугольник внутри которого находится список строк. Мы можем использовать его для отображения списка mp3 файлов, названий книг, модулей большого программного проекта, имен друзей. У этого виджета есть два режима работы: режим одиночного выбора и режим множественного выбора. По-умолчанию задаётся режим одиночного выбора. С лист боксом связано два важных события. Первое: wxEVT_COMMAND_LISTBOX_SELECTED. Это событие генерируется когда мы выбираем сроку в лист боксе. Второе: wxEVT_COMMAND_LISTBOX_DOUBLE_CLICKED. Оно генерируется, когда мы дважды щёлкаем на объекте в лист боксе. Количество элементов внутри лист бокса ограничено платформой GTK. В соответствии с документацией это число не должно превышать 2000 элементов. Элементы нумеруются с нуля. Полосы прокрутки появляются автоматически, когда в этом возникает необходимость.
listbox = new wxListBox(panel, ID_LISTBOX,
wxPoint(-1, -1), wxSize(-1, -1));
Это конструктор виджета окна списка.
В нашем примере мы использовали лист бокс и четыре кнопки, которые служат для добавления, переименования, удаления и очистки всех элементов списка.
wxString str = wxGetTextFromUser(wxT("Add new item"));
if (str.Len() > 0)
m_lb->Append(str);
Чтобы добавить новую строку в лист бокс, мы отображаем диалог wxGetTextFromUser, а потом вызываем метод Append(), который добавляет полученную с помощью диалога строку в список.
m_lb->Clear();
Для очистки всех элементов списка нужно просто вызвать метод Clear().
int sel = m_lb->GetSelection();
if (sel != -1) {
m_lb->Delete(sel);
}
Для удаления элемента мы вычисляем выбранный элемент, а потом вызываем метод Delete().
Переименование элементов осуществляется в несколько шагов.
wxString text;
wxString renamed;
Мы определили две локальные переменные.
int sel = listbox->GetSelection();
if (sel != -1) {
text = listbox->GetString(sel);
renamed = wxGetTextFromUser(wxT("Rename item"),
wxT("Rename dialog"), text);
}
Мы получаем выбранную строку и сохраняем её в переменной renamed.
if (!renamed.IsEmpty()) {
m_lb->Delete(sel);
m_lb->Insert(renamed, sel);
}
Мы проверяем не является ли переменная renamed пустой. Это для предотвращения добавления пустых строк. После этого мы удаляем старый элемент и добавляем новый.
wxNotebook (Записная книжка)
Записная книжка - это виджет объединяющий множество окон с соответствующими ярлыками. Вы можете позиционировать записную книжку с помощью следующих флагов:
* wxNB_LEFT (Слева)
* wxNB_RIGHT (Справа)
* wxNB_TOP (Сверху)
* wxNB_BOTTOM (Снизу)
Позицией по-умолчанию является сверху.
В этом примере мы создали виджет записной книжки с тремя таблицами и поместили его снизу.
wxNotebook *nb = new wxNotebook(this, -1, wxPoint(-1, -1),
wxSize(-1, -1), wxNB_BOTTOM);
Здесь мы создали записную книжку.
nb->AddPage(grid1, wxT("Sheet1"));
nb->AddPage(grid2, wxT("Sheet2"));
nb->AddPage(grid3, wxT("Sheet3"));
Мы добавили три объекта таблицы в записную книжку
wxScrolledWindow (Прокручивающееся окно)
Это один из виджетов контейнеров. Он может быть полезен, когда у нас отображаемая область больше чем окно. В нашем примере мы демонстрируем как раз такой случай. Мы поместили в наше окно изображение большого размера. Когда окно меньше, чем наше изображение автоматически появляются полосы прокрутки.
В нашем примере мы выводим изображение Замка Спис.
wxImage::AddHandler(new wxJPEGHandler);
Для обработки jpeg изображений мы должны инициировать соответствующий обработчик wxJPEGHandler.
wxScrolledWindow *sw = new wxScrolledWindow(this);
wxBitmap bmp(wxT("castle.jpg"), wxBITMAP_TYPE_JPEG);
wxStaticBitmap *sb = new wxStaticBitmap(sw, -1, bmp);
Мы создали прокручивающееся окно и поместили в него объект wxStaticBitmap.
sw->SetScrollbars(10, 10, width/10, height/10);
Установили полосы прокрутки.
sw->Scroll(50,10);
Немного прокрутили окно.
