Создание графического интерфейса для работы с графами

МЕТОДИЧКА

(В среде С++ Builder 6)

Предмет: Структуры и алгоритмы компьютерной обработки данных

1. Запустите среду C++ Builder 6.

2. После запуска на экране появится форма, с которой можно начинать работать

(Если среда уже была запущена, то закройте предыдущий проект и выполните команду

File->New->Application для создания нового)

В результате на экране вы увидите следующее:

3. Теперь нужно разместить на форме необходимые для работы с графами компоненты.

Компонент Image(находится на вкладке Additional), компонент StringGrid(тоже на вкладке Additional) и компонент Button(на вкладке Standart). Компонент Image нам нужен для рисования графа, в компоненте StringGrid будет отображаться матрица смежности для нарисованного графа, а кнопку Button приспособим для очистки компонента Image и матрицы смежности.

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

4. Теперь приступим непосредственно к программированию

Объявите следующие переменные в качестве глобальных:

TPoint koortoch[50]; //массив точек

int n; //счетчик текущей вершины

int versh=-1; //понадобиться нам для обработки различных ситуаций при нажатии мыши

5. Щелкните один раз мышкой на компоненте Image, а затем слева, на панели Object Inspector перейдите на вкладку Events. Найдите строку OnMouseDown и дважды по ней щелкните.

Сейчас мы будем писать обработчик события “Щелчок мышкой” по компоненту Image.

В появившееся окно вставляем следующий код:

if (Button==0) //если нажата правая кнопка мыши

{

Image1->Canvas->Pen->Width = 10;//радиус наших шариков

Image1->Canvas->TextOut(X+15,Y,IntToStr(n+1)); //выводится созданный по счету шарик

koortoch[n]=Point(X,Y); //массив точек

n++; //увеличиваем номер вершины

Form1->StringGrid1->ColCount=n+1;//количество столбцов матр. смежности увеличивается

Form1->StringGrid1->RowCount=n+1; //количество строк матр. смежности увеличивается

for(int i=0;i<=n;i++)//в цикле проставляем номера столбцов и строк

{

Form1->StringGrid1->Cells[0][i]=i;

Form1->StringGrid1->Cells[i][0]=i;

}

Image1->Canvas->Pen->Color = clBlue;//устанавливаем цвет вершин

Image1->Canvas->Ellipse(X,Y,X+10,Y+10); //рисуем эллипс

}

if (Button==1) //если нажата левая кнопка мыши

{

if (versh==-1)//если пока не запомнили ни одну из вершин

{

for(int i=0;i<n;i++) //проверяем попал ли щелчок мыши на какую-то из вершин

if (X<koortoch[i].x+10&&X>koortoch[i].x-10&&Y<koortoch[i].y+10&&Y>koortoch[i].y-10)

{

versh=i;//если попали, то запоминаем вершину по которой щелкнули

break;

}

}

else //если по одной из вершин уже раннее щелкнули(запомнили), то

{

int toversh=-1;

for(int i=0;i<n;i++)//проверяем не попал ли щелчок на одну из вершин

if (X<koortoch[i].x+10&&X>koortoch[i].x-10&&Y<koortoch[i].y+10&&Y>koortoch[i].y-10)

{

toversh=i;//если попал, то соединяем вершины

break;

}

if ((toversh!=-1)&&(versh!=toversh))//если щелкнули сначала по одной, а потом по другой вершине

{

//по номеру вершины узнаем ее конкретные координаты x и y

Image1->Canvas->MoveTo(koortoch[versh].x,koortoch[versh].y);

Image1->Canvas->Pen->Width = 1;//ширина линии, которой соединяем вершины

//рисуем линию между вершинами по которым щелкнули мышкой

Image1->Canvas->LineTo(koortoch[toversh].x,koortoch[toversh].y);

//заполняем матрицу смежности:

Form1->StringGrid1->Cells[versh+1][toversh+1]=1;

Form1->StringGrid1->Cells[toversh+1][versh+1]=1;

versh=-1;

}

}

}

В результате на экране будет примерно следующее:

6. Один раз щелкните мышкой на форме(либо слева в окне Object TreeView выберите вашу форму). Затем слева, на панели Object Inspector перейдите на вкладку Events. Найдите строку OnActivate и дважды по ней щелкните.

В появившемся окне введите следующий код:

Image1->Picture=NULL;

Image1->Canvas->Rectangle(0,0,Width,Height);

Это необходимо для инициализации компонента Image при активации формы.

7. Теперь напишем обработчик события “Нажатие на кнопку” для кнопки “Очистить”

Дважды щелкните на кнопке, которую ранее мы расположили на форме.

В появившееся окно вставляем следующий код:

Image1->Picture=NULL;

Image1->Canvas->Rectangle(0,0,Width,Height);

for(int i=0;i<n+1;i++)

for(int j=0;j<n+1;j++)

StringGrid1->Cells[j][i]=""; //в цикле очищаем матрицу смежности

n=0;//обнуляем счетчик вершин

В результате на экране будет примерно следующее:

8. Теперь нажмите Alt+F9 для запуска проекта

Руководство:

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

Когда на экране есть хотя бы 2 вершины их можно соединять ребрами. Для этого необходимо щелкнуть правой кнопкой мыши сначала на одной вершине, а затем на другой. Для очистки поля и матрицы смежности нужно нажать кнопку “Очистить”.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: