Материал: 12562633_1109924Ispol_zo

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

label exit callback cb_exit

xywh {255 140 90 50}

}

}

}

Function {cb_exit()} {open selected return_type

{void *} } {

code {exit(0);} {}

}

// generated by Fast Light User Interface Designer

(fluid) version 1.0101

Далее компилируем этот файл в программу на языке С:

File > Write Code, в результате чего появятся два файла – fl.h и fl.cxx (заголовочный файл и файл на языке C++). Вот их текст:

Листинг 3. Файл "fl.h", созданный компилятором "fluid"

#ifndef fl_h

#define fl_h

#include <FL/Fl.H> int main();

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

//extern void cb_exit(Fl_Return_Button*, void*);

Fl_Window* make_window(); void * cb_exit();

#endif

// generated by Fast Light User Interface Designer

(fluid) version 1.0101

Листинг 4. fl.cxx, созданный компилятором "fluid"

#include <libintl.h>

#include "fl.h" #include <stdlib.h>

int main() { Fl_Window *w;

w=make_window();

Fl::run();

}

Fl_Window* make_window() {

Fl_Window* w;

{ Fl_Window* o = new Fl_Window(380, 215); w = o;

{ Fl_Return_Button* o = new Fl_Return_Button(255, 140, 90, 50, gettext("exit"));

21

o->callback((Fl_Callback*)cb_exit);

}

o->end();

}

return w;

}

void * cb_exit() { exit(0);

}

Откомпилируем программу при помощи gcc (под Linux) или VisualC (под Windows). При запуске программа выводит окно с единственным виджетом – кнопкой «Exit». Кнопка работает – по нажатию приложение завершает работу.

Лабораторная работа 4

Знакомство с FLTK

Два часа ознакомительного занятия.

Установить на рабочий компьютер пакет FLTK (исходные тексты), откомпилировать проект, загрузив рабочую среду fltk.dsw из каталога visualc. Откомпилировать файлы примеров (каталог test). Используя fluid, создать приложение «кнопка выхода». При компиляции особое внимание обратить на правильность настроек оболочки VisulC.

Лабораторная работа 5

Пересекаются ли отрезки? GUI

Написать графический интерфейс для программы из лабораторной работы 2. Разработать интерфейс с помощью fluid.

Отложенный пятый этап проекта.

Требования

Четыре часа на выполнение, языки реализации – С или С++, пакет FLTK, средство визуального проектирования fluid. Интерфейс должен быть интуитивно понятен, допускать ввод точек отрезка в графическом интерфейсе или из файла, вывод координат точек в файл.

Лабораторная работа 6

Находится ли точка внутри многоугольника? GUI

Написать графический интерфейс для программы из лабораторной работы 3. Разработать интерфейс с помощью fluid.

Отложенный пятый этап проекта.

22

Требования

Четыре часа на выполнение, языки реализации – С или С++, пакет FLTK, средство визуального проектирования fluid. Интерфейс должен быть интуитивно понятен, содержать элементы управления для задания положения тестирующей точки (колесики прокрутки, слайдеры или ползунки), осуществлять загрузку координат вершин многоугольника из файла, дополнительно – проверку этого многоугольника на самопересечение.

Алгоритмизация задачи определения самопересечения

Многоугольник не будет являться самопересекающимся, если любые две стороны не пересекаются. Использовать алгоритм из лабораторной работы 2.

Реализация

Создавать как консольное приложение.

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

Написание программы

Одно из возможных представлений пользовательского интерфейса приведено на рис. 10 и 11.

Рис. 10. Окно приложения (одна из реализаций)

23

Рис. 11. Окно приложения (точка вне полигона)

Для управления положением в данном случае используется не использованный в приложении fluid, но имеющийся в FLTK объект «позиционер» и колесики прокрутки (скроллеры).

Текст этого приложения (не полностью) приведен в листинге 5.

Листинг 5. Головной модуль «точка в полигоне»

#include <FL/Fl.H>

. . . . . . .

#include <FL/Fl_Positioner.h> #include "Main.h"

#define min(x,y) ((x)>(y)?y:x)

#define max(x,y) ((x)>=(y)?x:y)

dwin *ClientArea; Fl_Roller *vert; Fl_Roller *horiz; Fl_Button *btnfile;

Fl_Button *btnext;

Fl_Text_Display *txtdispl; Fl_Text_Buffer *txtbuf;

int NumPoint=0;

bool DotIsInPoligon(Point *p,int NumPoint,double

CoordX,double CoordY)

{

. . . . . . . . . . .

24

// ищем пересечения нашего луча с вершинами много- //угольника

// находим число пересечений нашего луча с ребрами

//многоугольника

if((numCross%2)==0) return false; return true;

}

//функция загрузки многоугольника из файла void StartLoadPolygon(char *fn)

{

FILE *fd; int i;

fd=fopen(fn, "r"); if(fd==NULL) return;

if(NumPoint!=0) delete [] Poly; fscanf(fd, "%d", &NumPoint);

Poly= new Point[NumPoint];

for(i=0;i<NumPoint;i++) fscanf(fd,"%d\

%d",&Poly[i].x,&Poly[i].y);

fclose(fd);

}

//Функция отрисовки void dwin::draw()

{

int i,x1,y1,x2,y2;

Fl_Positioner::draw(); if(NumPoint>1)

{

for(i=0;i<NumPoint;i++)

{

x1=Poly[i].x; y1=Poly[i].y; if(i+1==NumPoint)

{

x2=Poly[0].x; y2=Poly[0].y; fl_line(x()+x1, y()+y1, x()+x2,

y()+y2);

}

else

{

x2=Poly[i+1].x; y2=Poly[i+1].y; fl_line(x()+x1, y()+y1, x()+x2,

y()+y2);

}

}

}

}

static void cb_brow(dwin* b, void*)

25

Источник: https://studfile.net/preview/16710218/