Руководство по программированию с wxWidgets (11. Самодельные виджеты)

Jan Bodnar, “The wxWidgets programming tutorial (11. Custom widgets)”, public translation into Russian from English More about this translation.

Translate into another language.

Самодельные виджеты

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

Вообще существует два типа тулкитов: спартанские и тяжеловесные. FLTK тулкит является спартанским. Он предоставляет только базовые виджеты и подразумевает, что программист создаст недостающие сам. wxWidget является тяжеловесным тулкитом. Он предоставляет большое количество виджетов. Однако, даже он не предоставляет более специализированных виджетов. Например, виджет измерения скорости, или виджет, который измеряет вместимость CD для записи (см. Nero). Тулкит так же не содержит графиков и диаграмм.

Программисты должны создавать такие виджеты сами. Это делается с помощью инструментов для рисования, предоставляемых тулкитом. Существует два варианта. Программист может изменить или дополнить существующий виджет. Или же он может создать самодельный виджет с нуля.

Здесь я предполагаю, что вы прочитали предыдущую главу, о контекстах устройств.

Виджет прожига

Это пример виджета созданного с нуля. Этот виджет встречается в различных приложения для прожига дисков, таких как Nero.

Мы помещаем wxPanel внизу окна и рисуем чистый виджет вручную. Весь важный код находится в методе OnPaint() класса widget. Этот виджет визуально показывает общую ёмкость носителя и свободное место, доступное на нём. Виджет контролируется слайдером. Минимальное значение нашего виджета 0, максимальное - 750. Если мы достигнем значения 700, мы начнем рисовать красным цветом. Так обычно обозначается пережог.

wxSize size = GetSize();

int width = size.GetWidth();

int till = (int) ((width / 750.0) * cur_width);

int full = (int) ((width / 750.0) * 700);

Мы рисуем виджет динамическим. Чем больше окно, тем больше виджет прожига и наоборот. Поэтому мы должны вычислять размер wxPanel, в которой мы рисуем самодельный виджет. Параметр till определяет итоговую величину для рисования. Это значение получаем от слайдера. Это пропорция от всей области. Параметр full определяет точку, где мы начинаем рисовать красным цветом. Помните, пользуйтесь арифметикой для чисел с плавающей точкой. Это позволит достичь большей точности.

Фактически рисование состоит из трёх шагов. Мы рисуем жёлтый, или красный и жёлтый прямоугольники. Далее мы рисуем вертикальные линии, которые делят виджет на несколько частей. Наконец, мы рисуем числа, указывающие ёмкость носителя.

void Widget::OnSize(wxSizeEvent& event)

{

Refresh();

}

Каждый раз, когда окно меняет свои размеры, мы обновляем виджет. Т.е. виджет перерисовывает себя.

void Burning::OnScroll(wxScrollEvent& WXUNUSED(event))

{

cur_width = m_slider->GetValue();

m_wid->Refresh();

}

При перемещении ползунка слайдера, мы получаем некоторое значение и сохраняем его в переменной cur_width. Эта переменная используется, при рисовании виджета прожига. После этого мы перерисовываем виджет.

Original (English): The wxWidgets programming tutorial (11. Custom widgets)

Translation: © ber113 .

translated.by crowd

Like this translation? Share it or bookmark!