Суббота, 19.08.2017, 10:36
Opensource and other ГлавнаяРегистрацияВход
Приветствую Вас Гость | RSS
Наш сайт
Наш опрос
Оцените мой сайт
Всего ответов: 1
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
 Первое GTK# приложение 

Шаг 1. Присядьте удобнее

Вы должны чувствовать себя комфортно. Откройте Dr.Pepper и включите любимую музыку. Хорошо, теперь мы готовы.

Шаг 2. Создание папок и файлов

Для начала нам нужно создать новую директорию для маленького проекта. (Пользователи Windows: давайте не будем использовать пробелы в названии директории, чтобы избежать в дальнейшем головной боли).

Откройте shell (Если вы в Windows, откройте меню Пуск) далее Программы -> Mono 1.x.x -> Mono Command Prompt. Она автоматически установит нужные пути к Mono-библиотекам. Перейдите в только что созданную директорию. Мы часто будем использовать консоль, поэтому оставьте ее запущенной.

Вернемся к делу. Откройте свой любимый редактор (MonoDevelop, vi, emacs, notepad и т.д.) и создайте новый пустой проект (если это возможно) или создайте новый пустой файл. Сохраните файл под именем "helloworld.cs".

Шаг 3. Формирование кода

Я надеюсь, что Вы уже знакомы с C#, и код написанный ниже не вызовет никаких проблем в понимании. Мы должны создать новый класс, использовать Gtk# и указать точку входа в нашу программу. Это будет выглядеть так:


using System;
using Gtk;

public class GtkHelloWorld
{
public static void Main()
{
Console.WriteLine("HelloWorld");
}

}

Это должно выглядеть весьма знакомо для Вас. Только теперь мы можем воспользоваться компилятором. Сохраним исходный код, перейдем в консоль и построим проект:



mcs -pkg:gtk-sharp-2.0 helloword.cs


Для тех, кто пользовался csc компилятором в Windows параметр "-pkg:" может показаться незнакомым. Этого параметра не было в csc, потому что Mono пришел из мира Linux. Этот параметр позволяет указать на необходимость подключения пакета gtk-sharp-2.0. Т.е. система ищет файл "gtk-sharp-2.0.pc", который содержит данные о местоположении библиотеки для этого пакета (среди другой информации). Т.е. мы не должны вводить "-r:gtk-sharp-2.0.dll -r:atk-sharp-2.0.dll -r:pango-sharp-2.0.dll ...." руками.

Шаг 4. Добавление графического интерфейса GUI

Теперь давайте вернемся обратно к нашему коду. Уберем оператор "Console.WriteLine". Первое, что мы сделаем - создадим новое окно. Проделаем это добавлением нового оператора new Window и блока приложения (для начала нити цикла main). Вот так:




using System;
using Gtk;
public class GtkHelloWorld {
public static void Main()
{
Application.Init();
//Create the Window
Window myWin = new Window("My first GTK# Application! ");
myWin.Resize(200,200);
//Create a label and put some text in it.
Label myLabel = new Label();
myLabel.Text = "Hello World!!!!";
//Add the label to the form
myWin.Add(myLabel);
//Show Everything
myWin.ShowAll();
Application.Run();
}
}

Теперь скомпилируем исходный код так же как мы делали это раньше, и запустим программу:



mono HelloWorld.exe


В итоге вы получите что-то вроде этого:


Не так уж и сложно, да?

Первая вещь, которую Вы могли заметить, это то, что в отличии от использования System.Windows.Forms мы не писали код для точной компоновки текста в окне. Например, мы не писали 'myLabel.Left = 100' или 'myLabel.Width = 200' или что-то подобное для размещения текстовой метки на форме, мы просто пишем 'myWin.Add(...)'. И все это потому, что 'Gtk.Window' - это виджет, который наследуется от Bin, или одиночного виджета который размещен в контейнере Container.

Другая часть кода, которая могла Вас заинтересовать, это использование выражений "Application.Init()" и "Application.Run()". Если вы когда-либо ранее использовали System.Windows.Forms это аналогично использованию "Application.Run()" во многих случаях. Обычно, когда приложения заканчивает обработку любого кода в основном потоке, приложение останавливается. Команда "ShowAll()" не блокирует код и продолжает дальнейшее выполнение кода (вплоть до остановки). Команда "Application.Init()" говорит оболочке выполнения "слушать" сигналы, поступающие от Gtk.Windows и в момент, когда выполняется "Application.Run()" выполнение кода передается основному циклу сообщений. Это позволяет оставаться приложению запущенным до тех пор, пока не будут закрыты все окна. Для большей информации смотрите информацию об объекте Application.

Шаг 5. Формирование окна

Возможно, Вы захотите спросить себя: "Как я смогу добавить новый виджет на окно, если оно может содержать только один виджет?". До этого мы говорили, что Window действительно может содержать в себе только один виджет, но виджет сам по себе может содержать в себе множество других виджетов. Некоторые из этих виджетов наследуются от контейнера Gtk.Box, а в некоторых случаях напрямую от контейнера. Контейнерный виджет Bin наследуется напрямую от виждета-контейнера, как и многие другие виджеты, но Bin может содержать в себе только один элемент управления.

Для того чтобы размещать большое количество виджетов в нашем окне, мы должны добавить на окно один из виджетов, который может содержать в себе другие виджеты. Существует множество виджетов, которые могут делать это, но мы затронем только некоторые простые: HBox, VBox и возможно Table.

Шаг 6. Добавление событий

Все классы производные от Widget предоставляют следующие события:

Многие их этих событий могут быть обработаны стандартным обработчиком событий. Например:



public static void HandlerMethod(object obj, EventArgs args)


Пример обработки событий нажатия на кнопку:



public static void ButtonPressHandler(object obj, ButtonPressEventArgs args)


ButtonPressEventArgs - это класс производный от SignalArgs, который в свою очередь является наследником от EventArgs. Класс ButtonPressEventArgs, как и многие другие в GTK#, добавляет свойство Gdk.Event (или другое от Gdk.Event) к EventArgs.

Типы Gdk.Event:

  • EventType.Nothing;
  • EventType.Delete;
  • EventType.Destroy;
  • EventType.Expose;
  • EventType.MotionNotify;
  • EventType.ButtonPress;
  • EventType.TwoButtonPress;
  • ThreeButtonPress;
  • ButtonRelease;
  • KeyPress;
  • KeyRelease;
  • EnterNotify;
  • LeaveNotify;
  • FocusChange;
  • Configure;
  • Map;
  • Unmap;
  • PropertyNotify;
  • SelectionClear;
  • SelectionRequest;
  • SelectionNotify;
  • ProximityIn;
  • ProximityOut;
  • DragEnter;
  • DragLeave;
  • DragMotion;
  • DragStatus;
  • DropStart;
  • DropFinished;
  • ClientEvent;
  • VisibilityNotify;
  • NoExpose;
  • Scroll;
  • WindowState;
  • Setting;
  • OwnerChange;
  • GrabBroken.

Например, для использования события Gdk.Event мы можем использовать такой код:




using Gdk;
...
widget.ButtonPressEvent += new ButtonPressEventHandler(ButtonPressHandler);
...
private void ButtonPressHandler(object obj, ButtonPressEventArgs args) {
// single click
if (args.Event.Type == EventType.ButtonPress)
{
...
}
// double click
if (args.Event.Type == EventType.TwoButtonPress)
{
...
}
// the left button was used
if (args.Event.Button == 1)
{
...
}
}

В примере выше вы можете увидеть, как обнаружить было ли одиночное нажатие мышкой или это был двойной клик.

Поиск
Календарь
«  Август 2017  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Copyright Mixim's home corporation © 2017Бесплатный хостинг uCoz