Читаем Программирование полностью

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).

<p id="AutBody_Root288"><strong>16.4.4. Класс Menu</strong></p>

Определяем очень простое меню.

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).

<p id="AutBody_Root289"><strong>16.5. Пример</strong></p>

Для того чтобы лучше ознакомиться с возможностями основных средств графического пользовательского интерфейса, рассмотрим окно для простого приложения, в котором происходит ввод, вывод и немного рисования.

Эта программа позволяет пользователю изобразить последовательность линий (незамкнутая ломаная; см. раздел 13.6), заданную как последовательность пар координат. Идея заключается в том, что пользователь постоянно вводит координаты (x, y) в поля ввода next x и next y; после ввода каждой пары пользователь щелкает на кнопке Next point.

Изначально поле ввода current (x, y) остается пустым, а программа ожидает, пока пользователь введет первую пару координат. После этого введенная пара координат появится в поле ввода current (x, y), а ввод каждой новой пары координат приводит к появлению на экране новой линии, проходящей от текущей точки (координаты которой отображаются в поле ввода current (x, y)) до только что введенной пары (x, y), а сама точка (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();

};

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже