string s = some_inbox.get_string();
if (s =="") {
// текст не введен
}
Объект класса Out_box
используется для выдачи сообщений, адресованных пользователю. По аналогии с классом In_box
, мы можем с помощью функции put()
ввести либо целые числа, либо строки. Примеры использования классов In_box
and Out_box
приведены в разделе 16.5.
get_floating_point()
, get_complex()
и так далее, но не сделали этого, так как вы можете взять строку, поместить ее в поток stringstream
и форматировать ввод, как захотите (см. раздел 11.4).
16.4.4. Класс Menu
Определяем очень простое меню.
struct Menu:Widget {
enum Kind { horizontal, vertical };
Menu(Point xy, int w, int h, Kind kk, const string& label);
Vector_ref
Kind k;
int offset;
int attach(Button& b); // связывает кнопку с меню
int attach(Button* p); // добавляет новую кнопку в меню
void show() // показывает все кнопки
{
for (int i = 0; i
selection[i].show();
}
void hide(); // hide all buttons
void move(int dx, int dy); // перемещает все кнопки
void attach(Window& win); // связывает все кнопки с объектом win
};
По существу, объект класса Menu
— это вектор кнопок. Как обычно, объект Point xy
задает координаты левого верхнего угла. Ширина и высота используются для изменения размера кнопки при ее добавлении в меню. Примеры описаны в разделах 16.5 и 16.7. Каждая кнопка меню (пункт меню) — это независимый объект класса Widget
, переданный объекту класса Menu
как аргумент функции attach()
. В свою очередь, класс Menu
содержит функцию attach()
, связывающую все свои кнопки с окном. Объект класса Menu
отслеживает все свои кнопки с помощью класса Vector_ref
(разделы 13.10 и E.4).
Если хотите создать всплывающее меню (“pop-up” menu), то сможете справиться с этой задачей самостоятельно (подробно об этом — в разделе 16.7).
16.5. Пример
Для того чтобы лучше ознакомиться с возможностями основных средств графического пользовательского интерфейса, рассмотрим окно для простого приложения, в котором происходит ввод, вывод и немного рисования.
Эта программа позволяет пользователю изобразить последовательность линий (незамкнутая ломаная; см. раздел 13.6), заданную как последовательность пар координат. Идея заключается в том, что пользователь постоянно вводит координаты (
Изначально поле ввода current (x, y)
остается пустым, а программа ожидает, пока пользователь введет первую пару координат. После этого введенная пара координат появится в поле ввода current (x, y)
, а ввод каждой новой пары координат приводит к появлению на экране новой линии, проходящей от текущей точки (координаты которой отображаются в поле ввода current (x, y)
) до только что введенной пары (
Так рисуется незамкнутая ломаная. Когда пользователь устанет, он щелкнет на кнопке Quit. Следуя этой простой логике, программа использует несколько полезных средств графического пользовательского интерфейса: ввод и вывод текста, рисование линии и многочисленные кнопки. Окно, показанное выше, демонстрирует результат после ввода двух пар координат. После семи шагов на экране отобразится следующий рисунок.
Определим класс для рисования таких окон. Он довольно прост.
struct Lines_window:Window {
Lines_window(Point xy,int w,int h,const string& title );
Open_polyline lines;
private:
Button next_button; // добавляет пару (next_x,next_y)
// в объект lines
Button quit_button;
In_box next_x;
In_box next_y;
Out_box xy_out;
static void cb_next(Address, Address); // обратный вызов
// next_button
void next();
static void cb_quit(Address, Address); // обратный вызов
// quit_button
void quit();
};