Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Использование графического интерфейса библиотеки FLTK при создании программ на языке программирования С++. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
777 Кб
Скачать

FL_ALIGN_IMAGE_BACKDROP (изображение будет использоваться в качестве фона для виджета).

Шрифт текста метки можно изменить с помощью метода labelfont(). Поддерживаемые семейства шрифтов – Helvetica, Courier, Times и Screen. Они обозначаются константами FL_HELVETICA, FL_COURIER, FL_TIМES и

FL_SCREEN. Также можно добавить FL_BOLD для включения жирного написания и FL_ITALIC – для курсива. На рисунке 10 показано, как выглядят основные доступные шрифты. Демонстрацию можно найти в файле fltk/fonts.срр.

Рисунок 10 – Основные шрифты, используемые FLTK

Дополнительно можно влиять на внешний вид текста метки с помощью метода labeltype() с помощью следующих типов:

FL_NORMAL_LABEL (рисует текст).

FL_NO_LABEL (ничего не делает).

FL_SHADOW_LABEL (рисует тень под текстом).

FL_ENGRAVED_LABEL (рисует края, как если бы текст был выгравирован).

FL_EMBOSSED_LABEL (рисует края, будто текст приподнят).

FL_ICON_LABEL (рисует значок, связанный с текстом).

Библиотека FLTK содержит функции, позволяющие проанализировать

командную строку и обработать ей опции. Если программе не нужны параметры командной строки, тогда можно передать argc и argv параметрами методу show() главного окна, например, так:

int main(int argc, char **argv)

{

Fl_Window *window = new Fl_Window (…); // . . . подготовка виджетов win->show(argc, argv);

return Fl::run();

}

Если программа должна обрабатывать параметры командной строки, то можно организовать просмотр флагов командной строки самостоятельно, а те из них, которые не распознаются, передавать библиотеке FLTK с помощью

21

функции Fl::args(). Вместо Fl::args() можно самостоятельно организовать цикл просмотра параметров командной строки и отдавать параметр для обработки FLTK с помощью другой функции Fl::arg().

Также FLTK предусматривает ряд предопределенных диалоговых окон, позволяющих быстро задать вопрос или просто выдать сообщение. Все эти окна являются модальными, на время их работы другие виджеты программы блокируются. Окно выдается на экран вызовом соответствующей функции: для выдачи информационного или предупреждающего сообщения используются функции fl_message() и fl_alert(), пользователь увидит диалоговое окно с заданным текстом и кнопкой «Ok». Также есть несколько вариантов для функции fl_message(), позволяющих снабдить окно иконкой, открыть окно там, где находится курсор мыши, и т.п. Функция fl_ask() выдает окно с заданным текстом и двумя кнопками «Yes» и «No», возвращает 0 или 1 в зависимости от того, какую из кнопок пользователь нажал. Функция fl_choice() позволяет вывести до трех кнопок (возвращаемое значение будет от 0 до 2).

Объекты абстрактного класса Fl_Image и его потомки, такие как Fl_Bitmap, Fl_PNG_Image и другие, позволяют разместить в памяти изображение, пример представления взят из примера библиотеки FLTK examples/bitmap.cxx:

#define sorceress_width 75 #define sorceress_height 75 static uchar sorceress_bits[] = {

0xfc, 0x7e, 0x40, 0x20, 0x90, 0x00, 0x07, 0x80, 0x23, 0x00, 0x00, 0xc6, 0xc1, 0x41, 0x98, 0xb8, 0x01, 0x07, 0x66, 0x00, 0x15, 0x9f, 0x03, 0x47,

// …

}

Это изображение можно назначить любому виджету с помощью метода image():

b = new Fl_Button(140,160,120,120,"Bitmap");

b->image(new Fl_Bitmap(sorceress_bits,sorceress_width,sorceress_height));

// …

Также изображение можно представить в виде подключаемого файла в текстовом формате XPM, особенностью формата является то, что он использует семантику языка Си и может быть включен в код. Файл состоит из описания массива строк из 6 разделов формата:

static char* <variable_name>[] = { <Values>,

<Colors>,

<Pixels>,

<Extensions>

};

Values описывает параметры изображения значениями, разделенными пробелами: ширина, высота, число цветов, знаков на каждый цвет.

22

Таблица цветов Colors описывает соответствие символов цветам. Формат <символы><пробел><c><пробел><значение>. Например:

"`. c #ffffff", "`# c #ff0000", "`a c #6b6b6b"

Pixels – строки, состоящие из символов, описанных в таблице цветов. Например, красный квадрат размером 3 на 3 пикселя на белом поле 5 на 3 пикселя:

"`.`#`#`#`.",

"`.`#`#`#`.",

"`.`#`#`#`."

Также формат поддерживает 1 прозрачный цвет, который в таблице цветов описывается как None.

Пример представления изображения в данном формате:

/* XPM */

static const char * grid_xpm[] = { "17 17 2 1",

"c None",

".c #808080",

"

",

" .

. ",

"............... ",

". . . . . ",

". . . . . ",

"............. ",

". . . . . ",

". . . . . ",

"............. ",

". . . . . ",

". . . . . ",

"............. ",

". . . . . ",

". . . . . ",

"............... ",

" .

.

",

"

 

"};

 

Для

использования изображения необходимо включить файл формата

XPM в программу и подключить его к выбранному виджету:

#include "grid.xpm"

// …

Fl_Pixmap *pixmap = new Fl_Pixmap(grid_xpm); showGridButton->image(pixmap);

23

// …

В следующем примере используется класс Fl_Menu_Bar, в примере открывается окно с небольшой строкой меню. Выполнение подпунктов меню осуществляется с помощью callback функций, "win" определяется в виде глобального указателя на объект Fl_Window, поэтому можем использовать его непосредственно в функциях обратного вызова.

#include <FL/Fl.H> #include <FL/Fl_Window.H>

#include <FL/Fl_Menu_Bar.H>

Fl_Window* win;

void Menu_CB_Open(Fl_Widget* w,void*) {win->label("Open");} void Menu_CB_Save(Fl_Widget* w,void*) {win->label("Save);} void Menu_CB_Quit(Fl_Widget* w,void*) {win->label("Quit");} void Menu_CB_Help(Fl_Widget* w,void*) {win->label("Help");}

int main() {

win = new Fl_Window(420, 280); win->color(FL_WHITE);

Fl_Menu_Bar menubar(0, 0, win->w(), 25); menubar.add("&File/&Open", 0, Menu_CB_Open); menubar.add("&File/&Save", 0, Menu_CB_Save); menubar.add("&File/&Quit", 0, Menu_CB_Quit); menubar.add("&Help", 0, Menu_CB_Help); win->end();

win->show(); return(Fl::run());

}

В примере в главное окно добавлен объект Fl_Menu_Bar, в строке меню определены четыре пункта. Символ "&" определяет сочетание клавиш для этого пункта меню. Первые три инструкции определяют меню "Файл" с подпунктами "Открыть", "Сохранить" и "Завершить". В пункте "Справка" нет пунктов подменю. Каждая инструкция определяет функцию обратного вызова, которая должна быть вызвана, если пользователь щелкнет мышью по пункту меню. Функции обратного вызова показывают, какой пункт меню был выбран.

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

XPM.

#include <FL/Fl.H>

24

#include <FL/Fl_Window.H> #include <FL/Fl_Button.H> #include <FL/Fl_Pixmap.H> #include <FL/Fl_Input.H> #include <FL/Fl_Group.H> #include <FL/Fl_Choice.H> #include <FL/fl_ask.H> #include <FL/Fl_Menu_Bar.H>

#define FONT_SERIF 1 #define FONT_SANS_SERIF 2 #define FONT_MONOSPACE 3

static const char *save_xpm[] = { "16 16 9 1",

" c None",

". c #000000", "+ c #0000FF", "@ c #000080", "# c #A0A0A0", "$ c #0000C0", "% c #FFFFFF", "& c #C0C0FF", "* c #DCDCDC", "................",

".+@##########@+.", ".$@%%%%%%%%%%@$.", ".+@%%%%%%%%%%@+.", ".+@%########%@+.", ".+@%%%%%%%%%%@+.", ".+@%########%@+.", ".+@&%%%%%%%%&@+.", ".++@@@@@@@@@@++.", ".++++++++++++++.", ".++$......@@$++.", ".++.******.+@++.", ".++.*@+***.+@++.", ".++.*@+***.+@++.", ".@+.******.+@++.", " ..............."};

class Toolbar : public Fl_Group {

25

public:

Fl_Button *save1; Fl_Button *save2; Fl_Pixmap *p_save; Fl_Choice *font_group;

Fl_Menu_Item *font_group_items; static void cb_save(Fl_Widget*, void*); static void cb_fonts(Fl_Widget*, void*);

Toolbar(int Xpos, int Ypos, int Width, int Height);

};

void Toolbar::cb_save(Fl_Widget *w, void *data){ fl_alert("Save Button %d pressed!",(int)data);

}

void Toolbar::cb_fonts(Fl_Widget *w, void *data){ fl_alert("Font number %d selected!",(int)data);

}

Toolbar::Toolbar(int Xpos, int Ypos, int Width, int Height) : Fl_Group(Xpos, Ypos, Width, Height)

{

box(FL_UP_BOX);

Ypos += 2; Height -= 4; Xpos += 3; Width = Height; int i;

save1 = new Fl_Button(Xpos, Ypos, Width, Height); Xpos += Width + 5;

save2 = new Fl_Button(Xpos, Ypos, Width, Height); Xpos += Width + 5;

font_group = new Fl_Choice(Xpos, Ypos, 110, Height); Xpos += 111;

p_save = new Fl_Pixmap(save_xpm); save1->image(p_save); save2->image(p_save); save1->tooltip("Save file1"); save1->callback(cb_save,(void*)1); save2->tooltip("Save file2"); save2->callback(cb_save,(void*)2); font_group_items = new Fl_Menu_Item[4];

for (i = 0; i < 4; i++) font_group_items[i].text = NULL; font_group_items->add("Serif", 0, cb_fonts, (void*) FONT_SERIF, 0); font_group_items->add("Sans-Serif", 0, cb_fonts,(void*) FONT_SANS_SERIF, 0);

26

font_group_items->add("Monospace", 0, cb_fonts, (void*) FONT_MONOSPACE, 0); font_group->menu(font_group_items);

}

int main()

{

Fl_Window win(500, 300,"FLTK"); win.color(FL_WHITE); win.begin();

Fl_Menu_Bar menubar(0, 0, win.w(), 25); menubar.add("&File", 0, 0); menubar.add("&Edit", 0, 0);

Toolbar tool(0,26,win.w(),30); tool.clear_visible_focus(); win.end();

win.show(); return Fl::run();

}

При необходимости отображения изображения, сохраненного на диске, можно воспользоваться следующим примером:

#include <FL/Fl.H> #include <FL/Fl_Window.H>

#include <FL/Fl_JPEG_Image.H> #include <FL/Fl_Box.H>

int main() {

Fl_Window* win=new Fl_Window(720,486); Fl_Box* mypicturebox;

Fl_JPEG_Image* myimage;

myimage = new Fl_JPEG_Image("nicepic.jpg"); mypicturebox = new Fl_Box(20, 20, 100, 100); mypicturebox->image(myimage);

win->show(); return(Fl::run());

}

Нужно не забыть при конфигурировании библиотеки FLTK перед ее компиляцией добавить включение опции использования изображений формата JPEG, --enable-localjpeg, а при работе с изображениями добавить параметры: - lfltk_images и -lfltk_jpeg.

Для проверки на появление ошибки при загрузке изображения можно использовать следующее:

if ( myimage.h() == 0 ) { perror(JPGFILE); exit(1); }

27

В ранее показанных примерах объявлялся объект window, и кнопки и другие виджеты были в группе объекта window. В следующем примере у окна есть дочерний элемент – виджет TABs. У этого виджета есть две дочерние группы объектов класса Fl_Group, группы "aaa" и "bbb". У каждой из этих групп в качестве дочерних элементов три кнопки.

Виджет "Вкладки" примера отобразит группу, принадлежащую выбранной в данный момент вкладке, рисунок 11.

Рисунок 11 – Виджет «Закладки»

#include <FL/Fl.H> #include <FL/Fl_Window.H> #include <FL/Fl_Tabs.H> #include <FL/Fl_Group.H> #include <FL/Fl_Button.H>

int main(int argc, char *argv[]) {

Fl_Window *win = new Fl_Window(400,200,"Tabs Example"); Fl_Tabs *tabs = new Fl_Tabs(10,10,400-20,200-20);

// закладка A

Fl_Group *aaa = new Fl_Group(10,35,400-20,200-45,"A-Buttons"); Fl_Button *b1 = new Fl_Button(50, 60,90,25,"Button A1"); b1->color(88+1);

Fl_Button *b2 = new Fl_Button(50, 90,90,25,"Button A2"); b2->color(88+2);

Fl_Button *b3 = new Fl_Button(50,120,90,25,"Button A3"); b3->color(88+3);

aaa->end();

// закладка B

Fl_Group *bbb = new Fl_Group(10,35,400-10,200-35,"B-Buttons"); Fl_Button *b1 = new Fl_Button( 50,60,90,25,"Button B1"); b1->color(88+1);

Fl_Button *b2 = new Fl_Button(150,60,90,25,"Button B2");

28

b2->color(88+3);

Fl_Button *b3 = new Fl_Button(250,60,90,25,"Button B3"); b3->color(88+5);

bbb->end(); tabs->end(); win->end(); win->show(); return(Fl::run());

}

Отслеживание поведения и нажатия на клавиатуру осуществляется с помощью методов handle(int e) и handle_key(int e, int key), для получения нажатой клавиши на клавиатуре используется функция Fl::event_key(). В следующем примере отслеживается положение указателя мыши, если указатель мыши находится над полем в середина окна, то поле станет красного цвета, события – также извлекаются и отображаются в строке заголовка окна, рисунок 12.

Рисунок 12 – Иллюстрация поведения и нажатия на клавиатуру

#include <FL/Fl_Window.H> #include <FL/Fl_Double_Window.H> #include <FL/Fl.H>

#include <FL/Fl_Box.H>

Fl_Window* win;

class EventWindow: public Fl_Box

{

private:

int handle_key(int e,int key); public:

EventWindow(int t, int l, int width, int height); int handle(int e);

29

};

EventWindow::EventWindow(int t, int l, int width, int height) :Fl_Box(FL_UP_BOX, t, l, width, height, "") {

labelfont(FL_ITALIC); labelsize(24); labeltype(FL_SHADOW_LABEL); label("OnMouseOver"); Fl::focus(this);

}

int EventWindow::handle(int e) { switch(e) {

case FL_ENTER: color (FL_RED);

labelcolor(FL_BLACK); damage(1);

return 1; case FL_LEAVE:

color(FL_GRAY); labelcolor(FL_BLACK); damage(1);

return 1;

case FL_KEYDOWN:

return handle_key(e,Fl::event_key()); default:

return Fl_Box::handle(e);

};

}

int EventWindow::handle_key(int e,int key) { char labeltext[20]; sprintf(labeltext,"Key entered: %c ",key); win->label(labeltext);

return 1;

}

int main() {

win = new Fl_Window(300, 200); win->color(FL_BLUE);

EventWindow* eventwin = new EventWindow(20, 20, 260, 160); eventwin->show();

win->end(); win->show(); return Fl::run();

}

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]