<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0">
<channel>
<title>www.gnome.org.ru - Разработка/ОсновыGTK/часть2</title>
<link>http://gnome.org.ru/wacko/Разработка/ОсновыGTK/часть2</link>
<description>Изменения страницы http://gnome.org.ru/wacko/Разработка/ОсновыGTK/часть2</description>
<language>en-us</language>
<item>
<title>2006-04-09 16:07:58</title>
<link>http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2/show?time=2006-04-09+16%3A07%3A58</link>
<description>&lt;div class="pageBefore">&lt;img src="http://gnome.org.ru/wacko/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a name=".razrabotka.osnovygtk.chast_2" href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2" class="">/Разработка&amp;nbsp;/&amp;nbsp;Основы&amp;nbsp;GTK&amp;nbsp;/&amp;nbsp;часть&amp;nbsp;2&lt;/a> за &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2?time=2006-04-09+16%3A07%3A58">2006-04-09 16:07:58&lt;/a> и &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2">2006-04-09 16:08:58&lt;/a>&lt;/b>&lt;br />
&lt;br />
No differences.&lt;/div>
</description>
</item>
<item>
<title>2006-04-09 11:43:04</title>
<link>http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2/show?time=2006-04-09+11%3A43%3A04</link>
<description>&lt;div class="pageBefore">&lt;img src="http://gnome.org.ru/wacko/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2" class="">/Разработка&amp;nbsp;/&amp;nbsp;Основы&amp;nbsp;GTK&amp;nbsp;/&amp;nbsp;часть&amp;nbsp;2&lt;/a> за &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2?time=2006-04-09+11%3A43%3A04">2006-04-09 11:43:04&lt;/a> и &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2?time=2006-04-09+16%3A07%3A58">2006-04-09 16:07:58&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">%%(wacko wrapper=box wrapper_width=400) &lt;br />
Как&amp;nbsp;вы&amp;nbsp;можете предположить, эти&amp;nbsp;функции создают новые виджеты, поэтому они&amp;nbsp;называются конструкторами (constructors) объектов, представляющих собой виджеты. В&amp;nbsp;языке С++ конструкторы обозначаются особым образом и&amp;nbsp;вызываются с&amp;nbsp;использованием специальных служебных слов языка. Однако С&amp;nbsp;не является объектно-ориентированным языком, поэтому в&amp;nbsp;нем нет&amp;nbsp;разницы между вызовом обычной функции и&amp;nbsp;конструктором. Только окончание _new() добавленное к&amp;nbsp;названию функции, свидетельствует о&amp;nbsp;том, что&amp;nbsp;это на&amp;nbsp;самом деле конструктор. Так&amp;nbsp;же&amp;nbsp;есть соглашение, что&amp;nbsp;любой конструктор в&amp;nbsp;пространстве имен gtk_* возвращает указатель на&amp;nbsp;&lt;span class="missingpage">Gtk&amp;nbsp;Widget&lt;/span>&lt;a href="http://gnome.org.ru/wacko/GtkWidget/edit?add=1" title="Создать эту страницу">?&lt;/a>, поэтому, объявляя переменную такого типа, вы&amp;nbsp;можете присвоить ей&amp;nbsp;результат вызова конструктора.&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">&lt;div class="indent">Объявление функции main знакомо любому программисту, знающему язык C&amp;nbsp;(если Вы&amp;nbsp;не знакомы с&amp;nbsp;языком С, знайте что&amp;nbsp;main – это&amp;nbsp;функция, с&amp;nbsp;которой начинается выполнение программы).&lt;/div>
%%(wacko wrapper=box wrapper_width=300) &lt;br />
Как&amp;nbsp;Вы&amp;nbsp;можете предположить, эти&amp;nbsp;функции создают новые виджеты, поэтому они&amp;nbsp;называются конструкторами (constructors) объектов, представляющих собой виджеты. В&amp;nbsp;языке С++ конструкторы обозначаются особым образом и&amp;nbsp;вызываются с&amp;nbsp;использованием специальных служебных слов языка. Однако С&amp;nbsp;не является объектно-ориентированным языком, поэтому в&amp;nbsp;нем нет&amp;nbsp;разницы между вызовом обычной функции и&amp;nbsp;конструктором. Только окончание _new() добавленное к&amp;nbsp;названию функции, свидетельствует о&amp;nbsp;том, что&amp;nbsp;это на&amp;nbsp;самом деле конструктор. Так&amp;nbsp;же&amp;nbsp;есть соглашение, что&amp;nbsp;любой конструктор в&amp;nbsp;пространстве имен gtk_* возвращает указатель на&amp;nbsp;&lt;span class="missingpage">Gtk&amp;nbsp;Widget&lt;/span>&lt;a href="http://gnome.org.ru/wacko/GtkWidget/edit?add=1" title="Создать эту страницу">?&lt;/a>, поэтому, объявляя переменную такого типа, вы&amp;nbsp;можете присвоить ей&amp;nbsp;результат вызова конструктора.&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2006-04-08 19:58:02</title>
<link>http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2/show?time=2006-04-08+19%3A58%3A02</link>
<description>&lt;div class="pageBefore">&lt;img src="http://gnome.org.ru/wacko/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2" class="">/Разработка&amp;nbsp;/&amp;nbsp;Основы&amp;nbsp;GTK&amp;nbsp;/&amp;nbsp;часть&amp;nbsp;2&lt;/a> за &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2?time=2006-04-08+19%3A58%3A02">2006-04-08 19:58:02&lt;/a> и &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2?time=2006-04-09+11%3A43%3A04">2006-04-09 11:43:04&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;div class="indent">&lt;div class="indent">Перед тем, как&amp;nbsp;перейти к&amp;nbsp;деталям, рассмотрим по&amp;nbsp;порядку, что&amp;nbsp;происходит, когда Вы&amp;nbsp;запускаете программу &lt;!--notypo-->HelloWorld&lt;!--/notypo-->:&lt;/div>&lt;/div>&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">&lt;div class="indent">&lt;div class="indent">Перед тем, как&amp;nbsp;перейти к&amp;nbsp;деталям, рассмотрим по&amp;nbsp;порядку, что&amp;nbsp;происходит, когда Вы&amp;nbsp;запускаете программу &lt;span class="missingpage">Hello&amp;nbsp;World&lt;/span>&lt;a href="http://gnome.org.ru/wacko/HelloWorld/edit?add=1" title="Создать эту страницу">?&lt;/a>:&lt;/div>&lt;/div>&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2006-04-08 19:47:49</title>
<link>http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2/show?time=2006-04-08+19%3A47%3A49</link>
<description>&lt;div class="pageBefore">&lt;img src="http://gnome.org.ru/wacko/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2" class="">/Разработка&amp;nbsp;/&amp;nbsp;Основы&amp;nbsp;GTK&amp;nbsp;/&amp;nbsp;часть&amp;nbsp;2&lt;/a> за &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2?time=2006-04-08+19%3A47%3A49">2006-04-08 19:47:49&lt;/a> и &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2?time=2006-04-08+19%3A58%3A02">2006-04-08 19:58:02&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;a name="h84-1">&lt;/a>&lt;h4>Определение расположения&lt;/h4>&lt;a name="h84-2">&lt;/a>&lt;h4>Подключение сигналов к&amp;nbsp;главному циклу&lt;/h4>
&lt;!--notypo-->&lt;textarea class="code" rows="2" readonly="readonly">&lt;/textarea>&lt;!--/notypo-->(wacko wrapper=box wrapper_width=300) 	&lt;br />
&lt;strong>Статический модификатор&lt;/strong>&lt;a name="h84-3">&lt;/a>&lt;h4>Отображение окна&lt;/h4>
Рисунок 1. Программа Hello World на&amp;nbsp;польском и&amp;nbsp;японскомском&lt;br />
&lt;span class="missingpage" title="404: //files?get=hello_ja_pl.jpg">file:hello_ja_pl.jpg&lt;/span>&lt;a name="h84-4">&lt;/a>&lt;h4>Активация главного цикла&lt;/h4>&lt;a name="h84-5">&lt;/a>&lt;h4>Компиляция и&amp;nbsp;запуск&lt;/h4>&lt;a name="h84-6">&lt;/a>&lt;h3>Использование GTK+ в&amp;nbsp;других языках программирования&lt;/h3>&lt;a name="h84-7">&lt;/a>&lt;h4>Hello World и&amp;nbsp;&lt;span class="missingpage">Py&amp;nbsp;GTK&lt;/span>&lt;a href="http://gnome.org.ru/wacko/PyGTK/edit?add=1" title="Создать эту страницу">?&lt;/a>&lt;/h4>&lt;a name="h84-8">&lt;/a>&lt;h4>Hello World и&amp;nbsp;Gtk#&lt;/h4>&lt;a name="h84-9">&lt;/a>&lt;h3>Полезные инструменты&lt;/h3>&lt;a name="h84-10">&lt;/a>&lt;h4>Glade и&amp;nbsp;Libglade&lt;/h4>
&lt;span class="missingpage" title="404: //files?get=glade_hello.jpg">file:glade_hello.jpg&lt;/span>&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">Определение расположения&lt;br />
Подключение сигналов к&amp;nbsp;главному циклу&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;br />
&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>
Статический модификатор&lt;br />
Отображение окна&lt;br />
Рисунок 1. Программа Hello World на&amp;nbsp;польском и&amp;nbsp;японском&lt;br />
ском&lt;br />
Окно программы &lt;span class="missingpage">Hello&amp;nbsp;World&lt;/span>&lt;a href="http://gnome.org.ru/wacko/HelloWorld/edit?add=1" title="Создать эту страницу">?&lt;/a>&lt;br />
Активация главного цикла&lt;br />
Компиляция и&amp;nbsp;запуск&lt;br />
Использование GTK+ в&amp;nbsp;других языках программирования&lt;br />
Hello World и&amp;nbsp;&lt;span class="missingpage">Py&amp;nbsp;GTK&lt;/span>&lt;a href="http://gnome.org.ru/wacko/PyGTK/edit?add=1" title="Создать эту страницу">?&lt;/a>&lt;br />
Hello World и&amp;nbsp;Gtk#&lt;br />
Полезные инструменты&lt;br />
Glade и&amp;nbsp;Libglade&lt;br />
Приложение использующее libglade&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2006-04-08 19:27:23</title>
<link>http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2/show?time=2006-04-08+19%3A27%3A23</link>
<description>&lt;div class="pageBefore">&lt;img src="http://gnome.org.ru/wacko/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2" class="">/Разработка&amp;nbsp;/&amp;nbsp;Основы&amp;nbsp;GTK&amp;nbsp;/&amp;nbsp;часть&amp;nbsp;2&lt;/a> за &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2?time=2006-04-08+19%3A27%3A23">2006-04-08 19:27:23&lt;/a> и &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2?time=2006-04-08+19%3A47%3A49">2006-04-08 19:47:49&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;a name="h84-1">&lt;/a>&lt;h3>В следующий раз&lt;/h3>&lt;a name="h84-2">&lt;/a>&lt;h4>Приложение&lt;/h4>
Исходные коды примеров (os-gtk2_hello.zip, 18Кб)&lt;br />
&lt;hr noshade="noshade" size="1" />&lt;a name="h84-3">&lt;/a>&lt;h4>Ссылки по&amp;nbsp;теме&lt;/h4>
&lt;strong>&lt;/strong>Изучение&lt;strong>&lt;/strong>&lt;br />
&lt;ul>&lt;li> Прочитайте все&amp;nbsp;статьи из&amp;nbsp;цикла «Основы GTK+»;
&lt;/li>&lt;li> Ознакомьтесь с&amp;nbsp;библиотекой GNU&amp;nbsp;Gettext, предназначенной для&amp;nbsp;перевода интерфейса программы во&amp;nbsp;время её выполнения;
&lt;/li>&lt;li> Посмотрите справочную информацию по&amp;nbsp;Libglade – библиотеки динамического создания интерфейса приложений GTK+;
&lt;/li>&lt;li> Посетите сайт GTK+, чтобы получить больше информации об&amp;nbsp;инструментарии;
&lt;/li>&lt;li> Страницы руководства GTK+ API&amp;nbsp;необходимы каждому разработчику;
&lt;/li>&lt;li> В&amp;nbsp;книге The&amp;nbsp;Official GNOME 2 Developer's Guide Матиса Варкуса (Matthias Warkus) вы&amp;nbsp;найдет информацию по&amp;nbsp;программированию для&amp;nbsp;GNOME 2, включая программирование с&amp;nbsp;GTK+.&lt;/li>&lt;/ul>
&lt;strong>Скачайте программы&lt;/strong>&lt;br />
&lt;ul>&lt;li> Загрузите Gtk# &amp;ndash; привязку GTK+ для&amp;nbsp;Microsoft. NET;
&lt;/li>&lt;li> Получите официальные исходные коды GTK+;
&lt;/li>&lt;li> Посетите сайт проекта &lt;span class="missingpage">Py&amp;nbsp;GTK&lt;/span>&lt;a href="http://gnome.org.ru/wacko/PyGTK/edit?add=1" title="Создать эту страницу">?&lt;/a>, посвященной созданию привязок GTK+ для&amp;nbsp;языка Python;
&lt;/li>&lt;li> Обратите внимание на&amp;nbsp;редактор фалов Glade Gazpacho,  написанный на&amp;nbsp;&lt;span class="missingpage">Py&amp;nbsp;GTK&lt;/span>&lt;a href="http://gnome.org.ru/wacko/PyGTK/edit?add=1" title="Создать эту страницу">?&lt;/a>;
&lt;/li>&lt;li> Установите Devhelp – ориентированный на&amp;nbsp;программистов, навигатор по&amp;nbsp;документации для&amp;nbsp;GNOME;
&lt;/li>&lt;li> Посмотрите GNOME &amp;ndash; продвинутый рабочий стол для&amp;nbsp;Linux;
&lt;/li>&lt;li> Попробуйте Xfce быстрый и&amp;nbsp;простой в&amp;nbsp;использовании рабочий стол;
&lt;/li>&lt;li> Посетите сайт Gnomefiles, дабы ознакомиться более чем&amp;nbsp;с&amp;nbsp;1000 программ использующих GTK+.&lt;/li>&lt;/ul>
Обсудите&lt;br />
&lt;ul>&lt;li> Задайте вопросы о&amp;nbsp;разработке ПО&amp;nbsp;с использованием GTK+ в&amp;nbsp;списках почтовой рассылки GTK+.&lt;/li>&lt;/ul>&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">Devhelp&lt;br />
В&amp;nbsp;следующий раз&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2006-04-08 18:04:08</title>
<link>http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2/show?time=2006-04-08+18%3A04%3A08</link>
<description>&lt;div class="pageBefore">&lt;img src="http://gnome.org.ru/wacko/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2" class="">/Разработка&amp;nbsp;/&amp;nbsp;Основы&amp;nbsp;GTK&amp;nbsp;/&amp;nbsp;часть&amp;nbsp;2&lt;/a> за &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2?time=2006-04-08+18%3A04%3A08">2006-04-08 18:04:08&lt;/a> и &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2?time=2006-04-08+19%3A27%3A23">2006-04-08 19:27:23&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;!--notypo-->&lt;textarea class="code" rows="4" readonly="readonly">#include &amp;lt;gtk/gtk.h&amp;gt;
    Следующие строки программы инициализируют GTK+ и поддержку интернационализации:
Листинг 2. Инициализация GTK+ и поддержки интернационализации&lt;/textarea>&lt;!--/notypo-->(code)&lt;br />
&lt;div class="indent">gtk_init(&amp;argc, &amp;argv);&lt;!--notypo-->&lt;textarea class="code" rows="9" readonly="readonly">Объявление функции main знакомо любому программисту, знающему язык C (если Вы не знакомы с языком С, знайте что main – это функция, с которой начинается выполнение программы). 
  Объявление функции main знакомо любому программисту, знающему язык C (если Вы не знакомы с языком С, знайте что main – это функция, с которой начинается выполнение программы).
    Следующая строка содержит объявление нескольких указателей с типом GtkWidget. GTK+ - это объектно-ориентированный инструментарий, по этой причине в нем используются обычные для объектно-ориентированного программирования приемы. Например, наследование используется, чтобы создать различные виды виджетов. Сам по себе язык С не является объектно-ориентированным, однако GTK+ преодолевает это ограничение путем использования нескольких хитроумных приемов и некоторых свойств языка С. Таким образом, объекты представляются указателями, а тип GtkWidget называется основным классом, от которого образуются все остальные классы. Поэтому выше я объявил переменные типа GtkWidget*.
    Следующие три строки – это вызовы, которые нужно расположить в начале программы, чтобы включить в ней поддержку интернационализации интерфейса. Надо заметить, что в настоящих приложениях вам не придется в ручную объявлять LOCALEDIR и GETTEXT_PACKAGE - ваша система сама позаботится об этих объявлениях, однако в нашем примере они помогают понять, что действительно происходит в программе.
    В последней строчке вызывается функция gtk_init(). Вызов этой функции обязателен, при этом ей должны быть переданы аргументы, с которыми запущена программа, а ее вызов должен осуществляться перед тем, как будет сделан вызов любой другой функции GTK+. Если вы забудете осуществить вызов этой функции, то получите несколько десятков ошибок от различных подсистем, которые просто не смогут правильно запуститься.
====Создание виджетов====
В следующих четырех строках осуществляется вызов различных видов функции _new():
Листинг 3. Вызов различных функций _new()&lt;/textarea>&lt;!--/notypo-->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);&lt;br />
vbox = gtk_vbox_new(FALSE, 0);&lt;!--notypo-->&lt;textarea class="code" rows="2" readonly="readonly">&lt;/textarea>&lt;!--/notypo-->(wacko wrapper=box wrapper_width=300) &lt;/div>
&lt;strong>Замечание по&amp;nbsp;использованию TOPLEVEL&lt;/strong>&lt;br />
&lt;hr noshade="noshade" size="1" />
Увидев в&amp;nbsp;функции gtk_window_new параметр TOPLEVEL,  вы, наверное, подумали, что&amp;nbsp;есть и&amp;nbsp;другие типы окон. Без&amp;nbsp;сомнения есть, однако их&amp;nbsp;обычно не&amp;nbsp;используют. Если вы&amp;nbsp;все-таки хотите использовать другой тип, вы&amp;nbsp;должны иметь четкое представление о&amp;nbsp;взаимодействии GTK+ и&amp;nbsp;оконной системы. Так&amp;nbsp;что запомните простое правило: всегда используйте параметр TOPLEVEL.&lt;br />
%%&lt;br />
Как&amp;nbsp;Вы&amp;nbsp;можете предположить, эти&amp;nbsp;функции создают новые виджеты, поэтому они&amp;nbsp;называются конструкторами (constructors) объектов, представляющих собой виджеты. В&amp;nbsp;языке С++ конструкторы обозначаются особым образом и&amp;nbsp;вызываются с&amp;nbsp;использованием специальных служебных слов языка. Однако С&amp;nbsp;не является объектно-ориентированным языком, поэтому в&amp;nbsp;нем нет&amp;nbsp;разницы между вызовом обычной функции и&amp;nbsp;конструктором. Только окончание _new() добавленное к&amp;nbsp;названию функции, свидетельствует о&amp;nbsp;том, что&amp;nbsp;это на&amp;nbsp;самом деле конструктор. Так&amp;nbsp;же&amp;nbsp;есть соглашение, что&amp;nbsp;любой конструктор в&amp;nbsp;пространстве имен gtk_* возвращает указатель на&amp;nbsp;&lt;span class="missingpage">Gtk&amp;nbsp;Widget&lt;/span>&lt;a href="http://gnome.org.ru/wacko/GtkWidget/edit?add=1" title="Создать эту страницу">?&lt;/a>, поэтому, объявляя переменную такого типа, вы&amp;nbsp;можете присвоить ей&amp;nbsp;результат вызова конструктора.&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">Если вы&amp;nbsp;внимательно посмотрите на&amp;nbsp;несколько конструкторов, то&amp;nbsp;увидите, что&amp;nbsp;они вызываются с&amp;nbsp;различными параметрами, набор которых зависит от&amp;nbsp;типа создаваемого виджета. В&amp;nbsp;частности, конструкор gtk_window_new (GTK_WINDOW_TOPLEVEL) создает новое окно типа TOPLEVEL, этот виджет представляет собой обычное окно с&amp;nbsp;заголовком, кнопкой закрыть и&amp;nbsp;другими добавленными оконным менеджером элементами. &lt;br />
&lt;/div>&lt;/div>Вызовы конструкторов для&amp;nbsp;переменных label (метка) и&amp;nbsp;button (кнопка), делают в&amp;nbsp;точности то, что&amp;nbsp;от&amp;nbsp;них ожидается. Обратите внимание на&amp;nbsp;знак подчеркивания и&amp;nbsp;скобки ( _() ), окружающие строку, передаваемую в&amp;nbsp;конструктор кнопки. Этот макрос вызывает подпрограмму gettext() и&amp;nbsp;является основой для&amp;nbsp;перевода интерфейса программы. (Чтобы получить подробную информацию по&amp;nbsp;использованию gettext, посмотрите ссылки.)&lt;br />
&lt;div class="indent">Загадочный конструктор gtk_vbox_new(FALSE, 0) создает вертикальный бокс (Vbox). Хотя этот виджет не&amp;nbsp;отображает даже пикселя на&amp;nbsp;экране, вы&amp;nbsp;вскоре увидите, что&amp;nbsp;он&amp;nbsp;играет решающую роль при&amp;nbsp;расположении элементов управления GTK+.&lt;/div>&lt;/div>
Определение расположения&lt;br />
&lt;div class="indent">&lt;div class="indent">Следующие три&amp;nbsp;строки определяют расположение виджетов на&amp;nbsp;экране:&lt;br />
gtk_container_add(GTK_CONTAINER (window), vbox);&lt;br />
gtk_container_add(GTK_CONTAINER (vbox), label);&lt;br />
gtk_container_add(GTK_CONTAINER (vbox), button);&lt;br />
Эти&amp;nbsp;строки – вызовы объектно-ориентированных методов, относящихся к&amp;nbsp;типу &lt;span class="missingpage">Gtk&amp;nbsp;Container&lt;/span>&lt;a href="http://gnome.org.ru/wacko/GtkContainer/edit?add=1" title="Создать эту страницу">?&lt;/a>. Если вы&amp;nbsp;обратитесь к&amp;nbsp;справочной информации по&amp;nbsp;API, то&amp;nbsp;увидите, что&amp;nbsp;&lt;span class="missingpage">Gtk&amp;nbsp;Container&lt;/span>&lt;a href="http://gnome.org.ru/wacko/GtkContainer/edit?add=1" title="Создать эту страницу">?&lt;/a> является потомком класса &lt;span class="missingpage">Gtk&amp;nbsp;Widget&lt;/span>&lt;a href="http://gnome.org.ru/wacko/GtkWidget/edit?add=1" title="Создать эту страницу">?&lt;/a>, и&amp;nbsp;что всем его&amp;nbsp;методам как&amp;nbsp;первый параметр передается переменная типа &lt;span class="missingpage">Gtk&amp;nbsp;Container&lt;/span>&lt;a href="http://gnome.org.ru/wacko/GtkContainer/edit?add=1" title="Создать эту страницу">?&lt;/a>*. Считается, что&amp;nbsp;&lt;span class="missingpage">Gtk&amp;nbsp;Container&lt;/span>&lt;a href="http://gnome.org.ru/wacko/GtkContainer/edit?add=1" title="Создать эту страницу">?&lt;/a>* &amp;ndash; это&amp;nbsp;экземпляр (instance) объекта, на&amp;nbsp;которой должен действовать метод. По&amp;nbsp;той причине, что&amp;nbsp;все переменные объявлены с&amp;nbsp;типом &lt;span class="missingpage">Gtk&amp;nbsp;Widget&lt;/span>&lt;a href="http://gnome.org.ru/wacko/GtkWidget/edit?add=1" title="Создать эту страницу">?&lt;/a>*, а&amp;nbsp;компилятор C&amp;nbsp;не поддерживает объектно-ориентированное наследование, необходимо убедить компилятор, что&amp;nbsp;безопасно передать эти&amp;nbsp;переменные функции и&amp;nbsp;ждать от&amp;nbsp;них значение типа &lt;span class="missingpage">Gtk&amp;nbsp;Container&lt;/span>&lt;a href="http://gnome.org.ru/wacko/GtkContainer/edit?add=1" title="Создать эту страницу">?&lt;/a>*. Эту&amp;nbsp;работу выполняет макрос GTK_CONTAINER(), в&amp;nbsp;нем реализовано безопасное преобразование к&amp;nbsp;типу &lt;span class="missingpage">Gtk&amp;nbsp;Container&lt;/span>&lt;a href="http://gnome.org.ru/wacko/GtkContainer/edit?add=1" title="Создать эту страницу">?&lt;/a>. Безопасное преобразование к&amp;nbsp;типу (type-safe), означает, что&amp;nbsp;макрос проверяет, может ли&amp;nbsp;быть выполнена необходимая операция над&amp;nbsp;данным типом перед тем, как&amp;nbsp;осуществить преобразование. Если макрос не&amp;nbsp;может выполнить операцию, он&amp;nbsp;выводит предупреждающее сообщение.&lt;br />
Так&amp;nbsp;как в&amp;nbsp;GTK+ используется модель расположения элементов box&amp;nbsp;layout, нет&amp;nbsp;необходимости точно указывать, где&amp;nbsp;на&amp;nbsp;экране будет располагаться виджет. В&amp;nbsp;программе Hello World каждый вызов метода gtk_container_add() говорит программе взять первый параметр или&amp;nbsp;родительский виджет и&amp;nbsp;поместить в&amp;nbsp;него второй параметр или&amp;nbsp;дочерний виджет. Виджет VBox, используемый в&amp;nbsp;нашем примере, – это&amp;nbsp;вид виджета, используемый для&amp;nbsp;расположения дочерних виджетов вертикально в&amp;nbsp;ряд. Так&amp;nbsp;что, когда вы&amp;nbsp;по очереди помещаете внутрь этого виджета метку, а&amp;nbsp;затем кнопку, то&amp;nbsp;кнопка отображается под&amp;nbsp;меткой.&lt;br />
Это&amp;nbsp;все, что&amp;nbsp;вам нужно сделать. Если вы&amp;nbsp;когда-нибудь вздумаете вручную расположить и&amp;nbsp;определить размеры виджетов, используйте зафиксированные позиции (absolute positioning) – модель расположения элементов, используемая в&amp;nbsp;некоторых других инструментариях, например, в&amp;nbsp;&lt;span class="missingpage">Win&amp;nbsp;32&lt;/span>&lt;a href="http://gnome.org.ru/wacko/Win32/edit?add=1" title="Создать эту страницу">?&lt;/a>. В&amp;nbsp;GTK+ вся&amp;nbsp;работа по&amp;nbsp;расположению и&amp;nbsp;изменению размеров виджетов, выполняется за&amp;nbsp;вас автоматически.&lt;/div>&lt;/div>
Подключение сигналов к&amp;nbsp;главному циклу&lt;br />
&lt;div class="indent">&lt;div class="indent">После создания и&amp;nbsp;размещения виджетов наступило время добавить им&amp;nbsp;немного логики. Как&amp;nbsp;в&amp;nbsp;большинстве графических инструментариев, в&amp;nbsp;GTK+ реализована модель с&amp;nbsp;управлением по&amp;nbsp;событиям (event-driven). По&amp;nbsp;существу, она&amp;nbsp;организована вокруг главного цикла(main loop) обработки событий. Главный цикл представляет собой бесконечный цикл, включающий три&amp;nbsp;этапа: проверку наличия событий, их&amp;nbsp;обработку и&amp;nbsp;ожидание. Когда возникает событие, объект, ассоциированный с&amp;nbsp;этим событием посылает сигнал, который сообщает главному циклу о&amp;nbsp;произошедшем событии. Далее главный цикл ищет сигнал во&amp;nbsp;внутренней таблице, где&amp;nbsp;сопоставлены сигналы и&amp;nbsp;обработчики, эти&amp;nbsp;сопоставления иногда называют обратными вызовами (callbacks). В&amp;nbsp;конце-концов главный цикл вызывает найденный обработчик сигнала для&amp;nbsp;сигнала, пришедшего от&amp;nbsp;объекта.&lt;br />
В&amp;nbsp;коде программы &lt;span class="missingpage">Hello&amp;nbsp;World&lt;/span>&lt;a href="http://gnome.org.ru/wacko/HelloWorld/edit?add=1" title="Создать эту страницу">?&lt;/a>, регистрация обратных вызовов выглядит следующим образом:&lt;/div>&lt;/div>
Листинг 4. Регистрация обратных вызовов&lt;br />
&lt;div class="indent">g_signal_connect(G_OBJECT (window),  &amp;#147;delete-event&amp;#148;, &lt;br />
g_signal_connect (G_OBJECT(button), &amp;#147;clicked&amp;#148;, &lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">G_CALLBACK(cb_button_click), label);&lt;br />
&lt;br />
&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>Примечательно, что&amp;nbsp;в&amp;nbsp;GTK+ вы&amp;nbsp;подсоединяете сигналы. Так, в&amp;nbsp;первой строчке функция cb_delete соединена с&amp;nbsp;сигналом delete-event объекта window. Точно так&amp;nbsp;же&amp;nbsp;во второй строчке функция cb_button_click соединена с&amp;nbsp;сигналом clicked объекта button. Обратите внимание на&amp;nbsp;то, что&amp;nbsp;в&amp;nbsp;четвертом параметре второго вызова, передается указатель на&amp;nbsp;нашу метку label, позже вы&amp;nbsp;увидите, как&amp;nbsp;он&amp;nbsp;используется в&amp;nbsp;функции cb_button_click.&lt;/div>&lt;/div>
Ниже представлена функция cb_delete, которая завершает приложение, когда пользователь закрывает окно.&lt;br />
&lt;div class="indent">&lt;/div>
Статический модификатор&lt;br />
В&amp;nbsp;языке C&amp;nbsp;ключевое слово static указывает компилятору, что&amp;nbsp;нужно производить внутреннее связывание функций, это&amp;nbsp;означает, что&amp;nbsp;статические функции не&amp;nbsp;видны за&amp;nbsp;пределами файла, в&amp;nbsp;котором они&amp;nbsp;объявлены. Кроме случая, когда нужно использовать обратные вызовы более чем&amp;nbsp;из&amp;nbsp;одного файла, всегда используйте ключевое слово static при&amp;nbsp;их&amp;nbsp;объявлении. Следуя этому правилу, вы&amp;nbsp;легко избежите путаницы при&amp;nbsp;объявлении новых функций. Так&amp;nbsp;как статические функции видны только в&amp;nbsp;файле, в&amp;nbsp;котором они&amp;nbsp;объявлены, те&amp;nbsp;же названия можно использовать снова.&lt;br />
&lt;div class="indent">&lt;div class="indent">Любой обратный вызов для&amp;nbsp;сигнала &amp;#147;delete-event&amp;#148; обязан соответствовать определенному в&amp;nbsp;API прототипу, потому этой функции передается аргумент типа &lt;span class="missingpage">Gtk&amp;nbsp;Widget&lt;/span>&lt;a href="http://gnome.org.ru/wacko/GtkWidget/edit?add=1" title="Создать эту страницу">?&lt;/a>* и&amp;nbsp;указатель на&amp;nbsp;неопределенный тип&amp;nbsp;data (тип gpointer равноценен типу void*). В&amp;nbsp;нашем случае эти&amp;nbsp;аргументы не&amp;nbsp;нужны, и&amp;nbsp;мы их&amp;nbsp;просто игнорируем. Далее в&amp;nbsp;теле функции вызывается функция gtk_main_quit(), она&amp;nbsp;завершает бесконечный главный цикл. В&amp;nbsp;конце, функция возвращает значение логического типа, снова по&amp;nbsp;той же&amp;nbsp;причине, что&amp;nbsp;в&amp;nbsp;прототипе обратного вызова для&amp;nbsp;сигнала delete-event точно определено: функция должна возвратить логический тип. Возвращаемое логическое значение определяет то, какие действия дальше предпримет GTK+. Если функция возвратит значение TRUE, событие будет считаться обработанным, и&amp;nbsp;обработчик события, который по&amp;nbsp;умолчанию для&amp;nbsp;этого вызова удаляет виджет из&amp;nbsp;оконной системы, не&amp;nbsp;будет вызван. Иногда это&amp;nbsp;бывает нужно, например, если надо спросить у&amp;nbsp;пользователя сохранять данные или&amp;nbsp;нет, возвратив TRUE, можно приостановить закрытие окна.&lt;br />
Ниже приведена функция cb_button_click, ее&amp;nbsp;задача по&amp;nbsp;нажатию кнопки изменить приветственное сообщение:&lt;/div>&lt;/div>
Листинг 5. Функция cb_button_click&lt;br />
&lt;div class="indent">&lt;div class="indent">Как вы&amp;nbsp;можете видеть, эта&amp;nbsp;функция похожа на&amp;nbsp;функцию cb_delete, за&amp;nbsp;исключением того, что&amp;nbsp;она ничего не&amp;nbsp;возвращает и&amp;nbsp;вместо аргумента &lt;span class="missingpage">Gtk&amp;nbsp;Widget&lt;/span>&lt;a href="http://gnome.org.ru/wacko/GtkWidget/edit?add=1" title="Создать эту страницу">?&lt;/a> ей&amp;nbsp;передается &lt;span class="missingpage">Gtk&amp;nbsp;Button&lt;/span>&lt;a href="http://gnome.org.ru/wacko/GtkButton/edit?add=1" title="Создать эту страницу">?&lt;/a>*. В&amp;nbsp;коде функции неопределенный указатель data преобразуется в&amp;nbsp;указатель на&amp;nbsp;&lt;span class="missingpage">Gtk&amp;nbsp;Label&lt;/span>&lt;a href="http://gnome.org.ru/wacko/GtkLabel/edit?add=1" title="Создать эту страницу">?&lt;/a>. Помните четвертый параметр label, на&amp;nbsp;который мы&amp;nbsp;обратили внимание при&amp;nbsp;регистрации обратных вызовов? Теперь при&amp;nbsp;каждом обратном вызове указатель data будет содержать указатель на&amp;nbsp;созданную нами в&amp;nbsp;начале программы метку. Вы&amp;nbsp;можете использовать аргумент data везде, где&amp;nbsp;нужно передать дополнительную информацию функции обратного вызова. Таким же&amp;nbsp;образом, если нужно получить доступ к&amp;nbsp;объекту, пославшему сигнал, можно использовать первый параметр, которому в&amp;nbsp;нашем случае соответствует аргумент button.&lt;br />
После получения указателя на&amp;nbsp;метку, макрос g_assert проверяет не&amp;nbsp;получилось ли&amp;nbsp;так, что&amp;nbsp;наша метка указывает на&amp;nbsp;значение NULL. Макрос g_assert &amp;ndash; это&amp;nbsp;специальная утилита из&amp;nbsp;библиотеки Glib (библиотека полезных типов и&amp;nbsp;программ, активно используемая GTK+), которая прекращает исполнение программы, если не&amp;nbsp;выполняется переданное ей&amp;nbsp;условие, в&amp;nbsp;нашем случае программа остановится, если label будет равно NULL. Поскольку label будет равняться NULL только в&amp;nbsp;случае ошибки программиста, это&amp;nbsp;выражение гарантирует то, что&amp;nbsp;ошибка будет отловлена до&amp;nbsp;того, как&amp;nbsp;программа увидит свет.&lt;/div>&lt;/div>
Отображение окна&lt;br />
&lt;div class="indent">&lt;div class="indent">После регистрации обратных вызовов функция gtk_widget_show_all() показывает окно и&amp;nbsp;все его&amp;nbsp;виджеты на&amp;nbsp;экране (Рисунок 1).&lt;/div>&lt;/div>
Рисунок 1. Программа Hello World на&amp;nbsp;польском и&amp;nbsp;японском&lt;br />
ском&lt;br />
Окно программы &lt;span class="missingpage">Hello&amp;nbsp;World&lt;/span>&lt;a href="http://gnome.org.ru/wacko/HelloWorld/edit?add=1" title="Создать эту страницу">?&lt;/a>&lt;br />
Активация главного цикла&lt;br />
&lt;div class="indent">&lt;div class="indent">После того, как&amp;nbsp;все установлено и&amp;nbsp;отображено на&amp;nbsp;экране, фукция gtk_main() активирует главный цикл. Главный цикл входит в&amp;nbsp;бесконечный цикл ожидания и&amp;nbsp;обработки поступающих сигналов до&amp;nbsp;тех пор, пока кто-нибудь, закрыв окно, не&amp;nbsp;вызовет функцию gtk_main_quit().&lt;/div>&lt;/div>
ПРИМЕЧАНИЕ: Если у&amp;nbsp;вас остались какие-нибудь вопросы по&amp;nbsp;программе, посмотрите код&amp;nbsp;в&amp;nbsp;архиве. Он&amp;nbsp;точно такой же&amp;nbsp;как в&amp;nbsp;статье, но&amp;nbsp;каждой строчке дан&amp;nbsp;подробный комментарий.&lt;br />
Компиляция и&amp;nbsp;запуск&lt;br />
&lt;div class="indent">&lt;div class="indent">Чтобы скомпилировать эту&amp;nbsp;программу, вам&amp;nbsp;понадобится компилятор С&amp;nbsp;и файлы разработчика (файлы заголовков и&amp;nbsp;библиотеки) для&amp;nbsp;GTK+. Информация о&amp;nbsp;том как&amp;nbsp;их&amp;nbsp;получить  приведена в&amp;nbsp;ссылках.&lt;/div>&lt;/div>
После установки этих файлов, разархивируйте исходный код, перейдите в&amp;nbsp;появившейся каталог и&amp;nbsp;запустите make:&lt;br />
$ tar&amp;nbsp;-xzf gtk_hello.tgz&lt;br />
$ cd&amp;nbsp;gtk_hello&lt;br />
$ make&lt;br />
ПРИМЕЧАНИЕ: Если вы&amp;nbsp;используете Microsoft® Windows®, вместо запуска make откройте Microsoft Visual Studio™.NET и&amp;nbsp;запустите проект &amp;#147;hello&amp;#148;.&lt;br />
Использование GTK+ в&amp;nbsp;других языках программирования&lt;br />
&lt;div class="indent">&lt;div class="indent">Вы можете использовать инструментарий GTK+ во&amp;nbsp;множестве языков программирования. Чтобы воспользоваться им, вам&amp;nbsp;понадобятся привязки. Привязки (bindings) &amp;ndash; это&amp;nbsp;специальные пакеты для&amp;nbsp;определенного языка, которые представляют API&amp;nbsp;GTK+ в&amp;nbsp;форме, понятной этому языку.&lt;br />
Например, я&amp;nbsp;переписал код&amp;nbsp;нашего приложения &lt;span class="missingpage">Hello&amp;nbsp;World&lt;/span>&lt;a href="http://gnome.org.ru/wacko/HelloWorld/edit?add=1" title="Создать эту страницу">?&lt;/a> на&amp;nbsp;языки Python и&amp;nbsp;C#. Чтобы запустить GTK+ c&amp;nbsp;этими языками, в&amp;nbsp;дополнение к&amp;nbsp;системам программирования Python и&amp;nbsp;&lt;span class="missingpage">Mono&amp;nbsp;/.NET&lt;/span>&lt;a href="http://gnome.org.ru/wacko/Mono/NET/edit?add=1" title="Создать эту страницу">?&lt;/a> вам&amp;nbsp;соответственно понадобятся привязки &lt;span class="missingpage">Py&amp;nbsp;GTK&lt;/span>&lt;a href="http://gnome.org.ru/wacko/PyGTK/edit?add=1" title="Создать эту страницу">?&lt;/a> и&amp;nbsp;Gtk# (см. ссылки).&lt;/div>&lt;/div>
Hello World и&amp;nbsp;&lt;span class="missingpage">Py&amp;nbsp;GTK&lt;/span>&lt;a href="http://gnome.org.ru/wacko/PyGTK/edit?add=1" title="Создать эту страницу">?&lt;/a>&lt;br />
&lt;div class="indent">&lt;div class="indent">В листинге 6 показан код&amp;nbsp;приложения Hello World, переписанный на&amp;nbsp;язык Python.&lt;/div>&lt;/div>
Листинг 6. Приложение Hello World в&amp;nbsp;&lt;span class="missingpage">Py&amp;nbsp;GTK&lt;/span>&lt;a href="http://gnome.org.ru/wacko/PyGTK/edit?add=1" title="Создать эту страницу">?&lt;/a>&lt;br />
import pygtk&lt;br />
pygtk.require('2.0')&lt;br />
import gtk&lt;br />
import random&lt;br />
greetings = ["Hello World", &amp;laquo;Witaj &amp;#346;wiecie&amp;raquo;, "&amp;#19990;&amp;#30028;&amp;#12395;&amp;#20170;&amp;#26085;&amp;#12399;"]&lt;br />
def&amp;nbsp;choose_greeting (greets):&lt;br />
&lt;div class="indent">&lt;div class="indent">return greets[random.randint (0, len(greets) &amp;ndash; 1)]&lt;/div>&lt;/div>
def&amp;nbsp;cb_clicked(button, label):&lt;br />
&lt;div class="indent">&lt;div class="indent">label.set_text(choose_greeting(greetings))&lt;/div>&lt;/div>
window = gtk.Window ()&lt;br />
vbox = gtk.VBox ()&lt;br />
button = gtk.Button(&amp;laquo;Hello World&amp;raquo;)&lt;br />
label = gtk.Label (choose_greeting (greetings))&lt;br />
window.add(vbox)&lt;br />
vbox.add(label)&lt;br />
vbox.pack_start(button, False, False)&lt;br />
window.connect(&amp;laquo;delete-event&amp;raquo;, lambda a,b: gtk.main_quit())&lt;br />
button.connect(&amp;laquo;clicked&amp;raquo;, cb_clicked, label)&lt;br />
window.show_all()&lt;br />
gtk.main()&lt;br />
&lt;div class="indent">&lt;div class="indent">Благодаря краткости Python, эта&amp;nbsp;версия программы получилась немного короче, чем&amp;nbsp;ее&amp;nbsp;двойник на&amp;nbsp;С. Несмотря на&amp;nbsp;это, выглядит она&amp;nbsp;похоже. Хотя код&amp;nbsp;приложения был&amp;nbsp;переписан с&amp;nbsp;использованием выражений Python, интерфейс программирования (API) остался тот&amp;nbsp;же&amp;nbsp;самый.&lt;/div>&lt;/div>
Hello World и&amp;nbsp;Gtk#&lt;br />
&lt;div class="indent">&lt;div class="indent">Код приложения Hello World с&amp;nbsp;использованием привязки Gtk# занимает чуточку больше места, чем&amp;nbsp;его версия на&amp;nbsp;языке С, это&amp;nbsp;связано с&amp;nbsp;тем, что&amp;nbsp;синтаксис выражений в&amp;nbsp;языке С# достаточно длинный. Поэтому, я&amp;nbsp;не поместил здесь полный исходный код, если нужно, его&amp;nbsp;можно посмотреть в&amp;nbsp;архиве. Здесь кратко рассмотрены несколько моментов при&amp;nbsp;переносе приложения из&amp;nbsp;языка C&amp;nbsp;в C#:&lt;br />
&lt;/div>class &lt;span class="missingpage">Gtk&amp;nbsp;Hello&lt;/span>&lt;a href="http://gnome.org.ru/wacko/GtkHello/edit?add=1" title="Создать эту страницу">?&lt;/a> : &lt;span class="missingpage">Gtk.Window&lt;/span>&lt;a href="http://gnome.org.ru/wacko/Gtk/Window/edit?add=1" title="Создать эту страницу">?&lt;/a>&lt;br />
{&lt;br />
&lt;div class="indent">Вместо создания нового окна и&amp;nbsp;описания его&amp;nbsp;параметров, вы&amp;nbsp;создаете подкласс класса &lt;span class="missingpage">Gtk.Window&lt;/span>&lt;a href="http://gnome.org.ru/wacko/Gtk/Window/edit?add=1" title="Создать эту страницу">?&lt;/a> и&amp;nbsp;помещаете весь код&amp;nbsp;описания параметров в&amp;nbsp;его конструктор. Этот подход не&amp;nbsp;является характерной чертой Gtk#, он&amp;nbsp;часто используется в&amp;nbsp;С-программах, если нужно создать более одной копии окна. В&amp;nbsp;любом случае, создавать подклассы в&amp;nbsp;C# так&amp;nbsp;просто, что&amp;nbsp;имеет смысл объявить новый класс, даже для&amp;nbsp;одного нового окна, тем&amp;nbsp;более, что&amp;nbsp;структура программ на&amp;nbsp;C# требует от&amp;nbsp;вас объявить хотя бы&amp;nbsp;один класс.&lt;br />
&lt;/div>this.DeleteEvent += new&amp;nbsp;&lt;span class="missingpage">Delete&amp;nbsp;Event&amp;nbsp;Handler&lt;/span>&lt;a href="http://gnome.org.ru/wacko/DeleteEventHandler/edit?add=1" title="Создать эту страницу">?&lt;/a>(&lt;span class="missingpage">Delete&amp;nbsp;CB&lt;/span>&lt;a href="http://gnome.org.ru/wacko/DeleteCB/edit?add=1" title="Создать эту страницу">?&lt;/a>);&lt;br />
button.Clicked += new&amp;nbsp;&lt;span class="missingpage">Event&amp;nbsp;Handler&lt;/span>&lt;a href="http://gnome.org.ru/wacko/EventHandler/edit?add=1" title="Создать эту страницу">?&lt;/a>(&lt;span class="missingpage">Button&amp;nbsp;Click&amp;nbsp;CB&lt;/span>&lt;a href="http://gnome.org.ru/wacko/ButtonClickCB/edit?add=1" title="Создать эту страницу">?&lt;/a>);&lt;br />
&lt;div class="indent">Как можно видеть, сигналы GTK+ переведены в&amp;nbsp;родную для&amp;nbsp;C# концепцию событий. Имена немного изменены, чтобы лучше следовать соглашениям именования принятым в&amp;nbsp;C#.&lt;/div>&lt;/div>
Листинг 7. Сигналы GTK+, переведенные в&amp;nbsp;родную для&amp;nbsp;C# концепцию событий&lt;br />
&lt;div class="indent">private void &lt;span class="missingpage">Delete&amp;nbsp;CB&lt;/span>&lt;a href="http://gnome.org.ru/wacko/DeleteCB/edit?add=1" title="Создать эту страницу">?&lt;/a> (object o, &lt;span class="missingpage">Delete&amp;nbsp;Event&amp;nbsp;Args&lt;/span>&lt;a href="http://gnome.org.ru/wacko/DeleteEventArgs/edit?add=1" title="Создать эту страницу">?&lt;/a> args)&lt;br />
{&lt;br />
&lt;div class="indent">&lt;span class="missingpage">Application.Quit&lt;/span>&lt;a href="http://gnome.org.ru/wacko/Application/Quit/edit?add=1" title="Создать эту страницу">?&lt;/a> ();&lt;br />
args.RetVal = true;&lt;br />
&lt;/div>}&lt;br />
&lt;div class="indent">Из-за особенностей модели событий C# прототип для&amp;nbsp;обработчика delete-event немного отличается. Вместо того, чтобы через функцию обратного вызова возвратить значение true, нужно передать его&amp;nbsp;через аргументы args.RetVal. Пара функций gtk_main() и&amp;nbsp;gtk_main_quit() заменены соответственно вызовами методов &lt;span class="missingpage">Application.Run&lt;/span>&lt;a href="http://gnome.org.ru/wacko/Application/Run/edit?add=1" title="Создать эту страницу">?&lt;/a>() и&amp;nbsp;&lt;span class="missingpage">Application.Quit&lt;/span>&lt;a href="http://gnome.org.ru/wacko/Application/Quit/edit?add=1" title="Создать эту страницу">?&lt;/a>().&lt;/div>&lt;/div>
Полезные инструменты&lt;br />
&lt;div class="indent">&lt;div class="indent">Существует несколько инструментов, способных значительно облегчить вам&amp;nbsp;жизнь при&amp;nbsp;разработке программ с&amp;nbsp;использованием GTK+. Наиболее полезными считаются Glade, Libglade и&amp;nbsp;Devhelp.&lt;/div>&lt;/div>
Glade и&amp;nbsp;Libglade&lt;br />
&lt;div class="indent">&lt;div class="indent">Дизайнер интерфейсов Glade помогает графически создавать интерфейс приложения, вместо того, чтобы в&amp;nbsp;исходном коде описывать в&amp;nbsp;отдельности каждый элемент. Но&amp;nbsp;еще более полезным является второй компонент &amp;ndash; библиотека Libglade, она&amp;nbsp;позволяет читать специальный формат XML, который Glade использует при&amp;nbsp;описании интерфейса. С&amp;nbsp;помощью Libglade вы&amp;nbsp;можете создать интерфейс приложения из&amp;nbsp;этого описания, без&amp;nbsp;написания какого-либо кода вообще.&lt;br />
На&amp;nbsp;рисунке 2 показано простое приложение, использующее Libglade для&amp;nbsp;отображения нескольких виджетов.&lt;/div>&lt;/div>
Рисунок 2. Простое приложение, использующее Libglade&lt;br />
Приложение использующее libglade&lt;br />
&lt;div class="indent">&lt;div class="indent">В листинге 8, показан полный исходный код&amp;nbsp;приложения, изображенного на&amp;nbsp;рисунке 2.&lt;/div>&lt;/div>
Листинг 8. Исходный код&amp;nbsp;приложения Libglade&lt;br />
#include &amp;lt;gtk/gtk.h&amp;gt;&lt;br />
#include &amp;lt;glade/glade.h&amp;gt;&lt;br />
&lt;div class="indent">&lt;span class="missingpage">Glade&amp;nbsp;XML&lt;/span>&lt;a href="http://gnome.org.ru/wacko/GladeXML/edit?add=1" title="Создать эту страницу">?&lt;/a> *ui;&lt;br />
/* Чтение описания интерфейса из&amp;nbsp;файла glade */&lt;br />
ui&amp;nbsp;= glade_xml_new (&amp;laquo;glade_hello.glade&amp;raquo;, &amp;#147;main_window&amp;#148;, NULL);&lt;br />
/* Автоматическое подключение сигналов */&lt;br />
glade_xml_signal_autoconnect(ui);&lt;/div>
}    &lt;br />
&lt;div class="indent">&lt;div class="indent">Как видно, весь код&amp;nbsp;занял 17 строчек, включая комментарии и&amp;nbsp;пустые строки. Несмотря на&amp;nbsp;то, что&amp;nbsp;настоящие приложения не&amp;nbsp;будут такими короткими, использование Libglade даст вам&amp;nbsp;огромные преимущества при&amp;nbsp;разработке программ, такие как&amp;nbsp;модульность, понятность и&amp;nbsp;надежность вашего кода.&lt;br />
Если вы&amp;nbsp;хотите более подробно изучить, как&amp;nbsp;построена эта&amp;nbsp;программа, вы&amp;nbsp;можете найти ее, также как&amp;nbsp;все другие примеры из&amp;nbsp;этой статьи, в&amp;nbsp;приложении.&lt;/div>&lt;/div>
Devhelp&lt;br />
&lt;div class="indent">&lt;div class="indent">Браузер документации Devhelp разработан для&amp;nbsp;чтения документации в&amp;nbsp;формате, создаваемом программой gtk-doc (стандартной утилитой для&amp;nbsp;создания документации GTK+), которая так&amp;nbsp;же&amp;nbsp;используется в&amp;nbsp;некоторых других родственных проектах, таких как&amp;nbsp;Pango и&amp;nbsp;GNOME. С&amp;nbsp;помощью Devhelp вы&amp;nbsp;можете быстро найти функцию и&amp;nbsp;посмотреть установленную по&amp;nbsp;ней документацию, он&amp;nbsp;помогает получать необходимую информацию намного быстрее. Devhelp – это&amp;nbsp;приложение GNOME, поэтому чтобы запустить его, вам&amp;nbsp;понадобится POSIX-совместимая операционная система(напр. Linux® или&amp;nbsp;Sun Solaris), на&amp;nbsp;которой будет работать GNOME и&amp;nbsp;его библиотеки. Однако для&amp;nbsp;просмотра документации вам&amp;nbsp;не&amp;nbsp;обязательно запускать сам&amp;nbsp;GNOME.&lt;br />
Если вы&amp;nbsp;используете другую платформу, существует множество других путей чтения документации GTK+.  В&amp;nbsp;проекте Mono, есть навигатор Monodoc, который обычно поставляется вместе со&amp;nbsp;справочной информацией по&amp;nbsp;Gtk#. Установочные пакеты GTK+ для&amp;nbsp;Windows также включают документацию в&amp;nbsp;формате, пригодном для&amp;nbsp;чтения средствами Windows, включая Visual Studio®. В&amp;nbsp;конце концов, всегда существует возможность обратиться к&amp;nbsp;документации в&amp;nbsp;сети с&amp;nbsp;помощью веб-обозревателя, однако использование специального инструмента всегда предпочтительнее, так&amp;nbsp;как он&amp;nbsp;работает быстрее и&amp;nbsp;обладает специальными функциями, полезными при&amp;nbsp;поиске в&amp;nbsp;документации.&lt;/div>&lt;/div>
В&amp;nbsp;следующий раз&lt;br />
&lt;div class="indent">&lt;div class="indent">В этой статье вы&amp;nbsp;изучили основные приемы программирования с&amp;nbsp;использованием GTK+.  Также вы&amp;nbsp;увидели, как&amp;nbsp;использовать GTK+ в&amp;nbsp;разных языках программирования, оперируя выражениями, специфичными для&amp;nbsp;этих языков, но&amp;nbsp;при этом, придерживаясь общей концепции создания приложений с&amp;nbsp;GTK+. И&amp;nbsp;в конце вы&amp;nbsp;ознакомились с&amp;nbsp;несколькими полезными инструментами, которые помогут разрабатывать приложения GTK+ лучшие и&amp;nbsp;быстрее.&lt;br />
В&amp;nbsp;последней статье этого цикла, вы&amp;nbsp;ближе познакомитесь с&amp;nbsp;другим аспектом разработки приложений с&amp;nbsp;использованием GTK+ &amp;ndash; установкой. В&amp;nbsp;ней будут детально проанализированы  возможности в&amp;nbsp;этой области, включая вопросы переносимости и&amp;nbsp;простоты установки. В&amp;nbsp;заключение вы&amp;nbsp;посмотрите на&amp;nbsp;GTK+ с&amp;nbsp;более широкой точки зрения, как&amp;nbsp;на&amp;nbsp;проект с&amp;nbsp;активным сообществом, которое может помочь вам&amp;nbsp;создавать приложения, лучше отвечающие потребностям ваших пользователей. &lt;/div>&lt;/div>&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">%%#include &amp;lt;gtk/gtk.h&amp;gt;&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2006-04-08 18:03:52</title>
<link>http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2/show?time=2006-04-08+18%3A03%3A52</link>
<description>&lt;div class="pageBefore">&lt;img src="http://gnome.org.ru/wacko/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2" class="">/Разработка&amp;nbsp;/&amp;nbsp;Основы&amp;nbsp;GTK&amp;nbsp;/&amp;nbsp;часть&amp;nbsp;2&lt;/a> за &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2?time=2006-04-08+18%3A03%3A52">2006-04-08 18:03:52&lt;/a> и &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2?time=2006-04-08+18%3A04%3A08">2006-04-08 18:04:08&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">%%#include &amp;lt;gtk/gtk.h&amp;gt;&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">%%(C)&lt;br />
#include &amp;lt;gtk/gtk.h&amp;gt;&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2006-04-08 18:01:37</title>
<link>http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2/show?time=2006-04-08+18%3A01%3A37</link>
<description>&lt;div class="pageBefore">&lt;img src="http://gnome.org.ru/wacko/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2" class="">/Разработка&amp;nbsp;/&amp;nbsp;Основы&amp;nbsp;GTK&amp;nbsp;/&amp;nbsp;часть&amp;nbsp;2&lt;/a> за &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2?time=2006-04-08+18%3A01%3A37">2006-04-08 18:01:37&lt;/a> и &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2?time=2006-04-08+18%3A03%3A52">2006-04-08 18:03:52&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">%%(C)&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">%%&lt;br />
&amp;lt;# &amp;lt;input type="text"&amp;gt; #&amp;gt;&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2006-04-08 17:59:46</title>
<link>http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2/show?time=2006-04-08+17%3A59%3A46</link>
<description>&lt;div class="pageBefore">&lt;img src="http://gnome.org.ru/wacko/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2" class="">/Разработка&amp;nbsp;/&amp;nbsp;Основы&amp;nbsp;GTK&amp;nbsp;/&amp;nbsp;часть&amp;nbsp;2&lt;/a> за &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2?time=2006-04-08+17%3A59%3A46">2006-04-08 17:59:46&lt;/a> и &lt;a href="http://gnome.org.ru/wacko/Razrabotka/OsnovyGTK/chast'2?time=2006-04-08+18%3A01%3A37">2006-04-08 18:01:37&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">}%%&lt;br />
&amp;lt;# &amp;lt;input type="text"&amp;gt; #&amp;gt;&lt;/div>&lt;/div>
</description>
</item>
</channel>
</rss>
