<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>LXF91:GTK+ - История изменений</title>
		<link>http://wiki2.linuxformat.ru/index.php?title=LXF91:GTK%2B&amp;action=history</link>
		<description>История изменений этой страницы в вики</description>
		<language>ru</language>
		<generator>MediaWiki 1.11.1</generator>
		<lastBuildDate>Thu, 14 May 2026 01:19:26 GMT</lastBuildDate>
		<item>
			<title>Ewgen: Исправлена ошибка в тексте</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF91:GTK%2B&amp;diff=12093&amp;oldid=prev</link>
			<description>&lt;p&gt;Исправлена ошибка в тексте&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 14:31, 11 июня 2011&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 39:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 39:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Для того, чтобы понять, как работает библиотека ''libglade'', необходимо сначала разобраться, что представляет собой проект ''Glade.''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Для того, чтобы понять, как работает библиотека ''libglade'', необходимо сначала разобраться, что представляет собой проект ''Glade.''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Разбираться, как вы уже поняли, мы будем на примере &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;программымикрокалькулятора &lt;/del&gt;(Рис. 1).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Разбираться, как вы уже поняли, мы будем на примере &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;программы микрокалькулятора &lt;/ins&gt;(Рис. 1).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Изображение:LXF91_GTK1.png|Рис. 1]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Изображение:LXF91_GTK1.png|Рис. 1]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Sat, 11 Jun 2011 14:31:15 GMT</pubDate>			<dc:creator>Ewgen</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF91:GTK%2B</comments>		</item>
		<item>
			<title>Crazy Rebel: /* Приступим к проектированию */</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF91:GTK%2B&amp;diff=5718&amp;oldid=prev</link>
			<description>&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Приступим к проектированию&lt;/span&gt;&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 08:48, 1 декабря 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 65:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 65:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Изображение:LXF91_GTK2.png|Рис. 2]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Изображение:LXF91_GTK2.png|Рис. 2]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Окно просмотра структуры элементов интерфейса.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;Окно просмотра структуры элементов интерфейса.&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Объекты-контейнеры являются внутренними узлами дерева, а элементы управления – его «листьями». Если мы теперь сохраним проект&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Объекты-контейнеры являются внутренними узлами дерева, а элементы управления – его «листьями». Если мы теперь сохраним проект&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Mon, 01 Dec 2008 08:48:03 GMT</pubDate>			<dc:creator>Crazy Rebel</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF91:GTK%2B</comments>		</item>
		<item>
			<title>Crazy Rebel: викификация, оформление</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF91:GTK%2B&amp;diff=5713&amp;oldid=prev</link>
			<description>&lt;p&gt;викификация, оформление&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 08:44, 1 декабря 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 250:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 250:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;интерфейса.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;интерфейса.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;     &lt;/del&gt;В обработчике on_numeric_button_clicked() нам необходимо &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;полу-&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В обработчике &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;on_numeric_button_clicked()&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;''' &lt;/ins&gt;нам необходимо &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;получить &lt;/ins&gt;цифру, соответствующую нажатой кнопке. Мы не можем &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;передавать &lt;/ins&gt;цифру в дополнительном параметре обработчика, поскольку этот&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;чить &lt;/del&gt;цифру, соответствующую нажатой кнопке. Мы не можем &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;переда-&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;параметр уже занят объектом entry1. Вместо этого мы просто &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;считываем &lt;/ins&gt;цифру, являющуюся меткой нажатой кнопки, с помощью функции &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;gtk_button_get_label()&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;. Текст элемента ввода entry1 устанавливается с&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;вать &lt;/del&gt;цифру в дополнительном параметре обработчика, поскольку этот&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;помощью функции &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;gtk_entry_set_text()&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;параметр уже занят объектом entry1. Вместо этого мы просто &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;считыва-&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;ем &lt;/del&gt;цифру, являющуюся меткой нажатой кнопки, с помощью функции&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Хотя мы и создали обработчики всех сигналов, но если бы мы &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;скомпилировали &lt;/ins&gt;программу на данном этапе, ее элементы управления все равно ничего бы не делали. Для того чтобы наладить в программе &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;обработку &lt;/ins&gt;сигналов, недостаточно написать их обработчики. Необходимо решить еще одну проблему, которая в явном или неявном виде &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;возникает &lt;/ins&gt;во всех средах визуального программирования. В описании &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;интерфейса &lt;/ins&gt;программы мы указали, например, что обработчиком события&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;gtk_button_get_label(). Текст элемента ввода entry1 устанавливается с&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;clicked&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;''' &lt;/ins&gt;для кнопки &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;operation_button_minus&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;''' &lt;/ins&gt;является нечто по имени&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;помощью функции gtk_entry_set_text().&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;on_operation_button_minus_clicked()&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;. На этапе визуального &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;программирования &lt;/ins&gt;строка &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;on_operation_button_minus_clicked()&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;''' &lt;/ins&gt;не является &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;именем &lt;/ins&gt;функции, поскольку никакой функции еще нет. Фактически мы&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;     &lt;/del&gt;Хотя мы и создали обработчики всех сигналов, но если бы мы &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;ском-&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;пилировали &lt;/del&gt;программу на данном этапе, ее элементы управления все&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;равно ничего бы не делали. Для того чтобы наладить в программе &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;обра-&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;ботку &lt;/del&gt;сигналов, недостаточно написать их обработчики. Необходимо&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;решить еще одну проблему, которая в явном или неявном виде &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;возни-&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;кает &lt;/del&gt;во всех средах визуального программирования. В описании &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;интер-&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;фейса &lt;/del&gt;программы мы указали, например, что обработчиком события&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;clicked для кнопки operation_button_minus является нечто по имени&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;on_operation_button_minus_clicked(). На этапе визуального &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;программи-&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;рования &lt;/del&gt;строка on_operation_button_minus_clicked() не является &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;име-&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;нем &lt;/del&gt;функции, поскольку никакой функции еще нет. Фактически мы&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;просто добавили в описание интерфейса программы имя обработчика&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;просто добавили в описание интерфейса программы имя обработчика&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;сигнала. Если бы связывание сигнала и обработчика выполнялось на&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;сигнала. Если бы связывание сигнала и обработчика выполнялось на&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;этапе компоновки программы (как это происходит в «настоящих» IDE),&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;этапе компоновки программы (как это происходит в «настоящих» IDE),&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;компоновщик нашел бы функцию on_operation_button_minus_clicked()&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;компоновщик нашел бы функцию &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;on_operation_button_minus_clicked()&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;и связал бы ее с сигналом. Но в GTK+ связывание сигналов и &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;обработ-&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;и связал бы ее с сигналом. Но в &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;''&lt;/ins&gt;GTK+&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'' &lt;/ins&gt;связывание сигналов и &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;обработчиков &lt;/ins&gt;происходит во время выполнения программы. Каким же образом&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;чиков &lt;/del&gt;происходит во время выполнения программы. Каким же образом&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;программа находит функцию, соответствующую имени обработчика?&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;программа находит функцию, соответствующую имени обработчика?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Ведь на этапе выполнения программы система ''libglade'' не знает имен &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;функций (а знает только их адреса) и не может сопоставить функцию с &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;именем обработчика. Для решения этой проблемы мы должны явным&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;образом указать, что функция '''on_operation_button_minus_clicked()''',&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;определенная нами в файле '''calculator-2.c''', является «тем самым» &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;обработчиком '''on_operation_button_minus_clicked()'''. Мы делаем это &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;с помощью функции '''glade_xml_signal_connect()'''. Первым параметром '''glade_xml_signal_connect()''' должен быть указатель на структуру &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;''GladeXML''. Вторым параметром функции является имя обработчика,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;заданное при описании интерфейса в среде ''Glade'', а третьим параметром – адрес определенной нами функции-обработчика. Из сказанного &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;следует, между прочим, что функция-обработчик сигнала не обязана &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;иметь то же имя, что и обработчик, назначенный сигналу в файле описания интерфейса. Важно лишь установить соответствие между двумя &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;именами (точнее, между именем обработчика и адресом функции).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Таким образом, в функцию '''main()''' файла '''calculator-2.c''' нужно добавить &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;следующие строки, в которых устанавливается соответствие между &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;именами обработчиков, заданными в файле '''calculator.glade''', и функциями-обработчиками, определенными в программе:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=c&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; glade_xml_signal_connect(xml, “gtk_main_quit”, G_CALLBACK(gtk_main_quit));&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    glade_xml_signal_connect(xml, “on_numeric_button_clicked”, G_CALLBACK(on_numeric_button_clicked));&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    glade_xml_signal_connect(xml, “on_operation_button_plus_clicked”, G_CALLBACK(on_operation_button_plus_clicked));&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    glade_xml_signal_connect(xml, “on_operation_button_minus_clicked”, G_CALLBACK(on_operation_button_minus_clicked));&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    glade_xml_signal_connect(xml, “on_operation_button_equal_clicked”, G_CALLBACK(on_operation_button_equal_clicked));&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    glade_xml_signal_connect(xml, “on_operation_button_cancel_clicked”, G_CALLBACK(on_operation_button_cancel_clicked));&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Теперь вы можете скомпилировать программу и убедиться, что все&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;кнопки (включая кнопку закрытия окна, завершающую приложение)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;работают как надо.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Помимо функции '''glade_xml_signal_connect()''', библиотека ''libglade'' &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;экспортирует функцию '''glade_xml_signal_connect_data()'''. От '''glade_xml_signal_connect()''' эта функция отличается тем, что позволяет указать &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;объект, который будет передаваться обработчику сигнала в качестве &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;дополнительного параметра. В нашей программе мы определили передачу объекта '''entry1''' обработчикам сигналов еще на этапе визуального программирования. Однако может случиться так, что объект, который&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;следует передать обработчику сигнала, станет известен только во время выполнения программы. В этой ситуации функция '''glade_xml_signal_connect_data()''' окажется более полезной.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;API ''libglade'' предоставляет нам еще несколько функций, связанных с обработкой сигналов. Функция '''glade_xml_signal_autoconnect()'''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;сканирует файл '''*.glade''' в поисках сигналов и функций-обработчиков, автоматически связывая сигналы с назначенными им обработчиками, если обработчики являются функциями API ''GTK+'' (например,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;эта функция может связать сигнал '''destroy''' и функцию-обработчик&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''gtk_main_quit()'''. Неудобство, связанное с использованием '''glade_xml_signal_autoconnect()''' (простите за невольный каламбур) заключается&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;в том, что эта функция будет выдавать предупреждающее сообщение&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;всякий раз, когда ей встретится функция-обработчик, не являющаяся&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;частью API ''GTK+''. Определенный интерес представляют также функции '''glade_xml_signal_connect_full()''' и '''glade_xml_signal_autoconnect_full()'''. Первым параметром каждой из этих функций служит, как обычно,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;указатель на структуру ''GladeXML''. Вторым параметром обеих функций&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;должен быть указатель на определенную программистом функцию&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;''GladeXMLConnectFunc()'', которая будет осуществлять связывание сигналов с обработчиками. Таким образом, связывание сигналов и обработчиков как бы делегируется другой функции, не являющейся частью&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;API ''Glade XML''. Такое делегирование может быть полезно при интеграции API ''Glade XML'' с другими языками программирования.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В примере из предыдущей статьи в нашем распоряжении имелась&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;удобная функция ''lookup_widget()'', которая позволяла найти указатель&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;на объект визуального элемента по его имени. Эта функция не является частью API ''GTK+'', система генерации кода ''Glade 2.x'' сама создала&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;ее для нас. Рад сообщить вам, что при работе с библиотекой ''libglade''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;у нас есть возможность использовать похожую функцию '''glade_xml_get_widget()'''. Эта функция возвращает указатель на визуальный объект, заданный своим именем. Первым аргументом '''glade_xml_get_widget()'''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;должен быть указатель на структуру ''GladeXML'', вторым аргументом –&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;имя искомого объекта. Конечно, для того, чтобы мы могли воспользо-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;ваться функцией ''glade_xml_get_widget()'' в обработчике сигнала, переменная-указатель на структуру ''GladeXML'' должна быть в области видимости процедуры-обработчика. Эту проблему можно решить, объявив&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;переменную-указатель на ''GladeXML'' как статическую. Этот метод, однако, неудобен, если обработчик сигнала расположен не в том же файле, что и функция '''main()'''. В общем случае указатель на структуру ''GladeXML''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;можно получить другим способом. Если у нас есть указатель на один из&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;визуальных элементов, образующих интерфейс (а в обработчике сигнала как минимум один такой указатель есть всегда), мы можем воспользоваться функцией '''glade_get_widget_tree()'''. Аргументом функции&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''glade_get_widget_tree()''' должен быть указатель на объект, представляющий элемент интерфейса, а ее возвращаемым значением будет указатель на структуру ''GladeXML''. Вот как, например, можно получить доступ&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;к этой структуре в некотором обработчике '''on_button_clicked()''':&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=c&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; void on_button_clicked(GtkButton *button)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    GladeXML *xml = glade_get_widget_tree(GTK_WIDGET(button));&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;...&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Материал, рассмотренный в этой, равно как и в четырех предыдущих статьях, не охватывает всего многообразия программирования&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;''GTK+''. Но, я надеюсь, что эти статьи создали нечто вроде стартовой&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;площадки, которая поможет вам вознестись к настоящим высотам,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;если программирование ''GTK+'' вас заинтересует. Мы же перейдем к&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;освоению премудростей программирования для основанной на ''GTK+''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;среды GNOME. '''LXF'''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Mon, 01 Dec 2008 08:44:09 GMT</pubDate>			<dc:creator>Crazy Rebel</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF91:GTK%2B</comments>		</item>
		<item>
			<title>Crazy Rebel: викификация, оформление</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF91:GTK%2B&amp;diff=5712&amp;oldid=prev</link>
			<description>&lt;p&gt;викификация, оформление&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: '''GTK+''' Разработка переносимых приложений с графическим интерфейсом пользователя&lt;br /&gt;
[[Категория:Учебники]]&lt;br /&gt;
{{Цикл/GTK+}}&lt;br /&gt;
&lt;br /&gt;
=Glade на новый лад=&lt;br /&gt;
&lt;br /&gt;
'''ЧАСТЬ 5''' Описать интерфейс программы в XML и подгрузить его на лету? Совершенно необязательно покупать ''Visual Studio'' и устанавливать ''.NET 3.0'' – '''Андрей Боровский''' покажет, как решить задачу средствами ''Glade''!&lt;br /&gt;
&lt;br /&gt;
:::''Компьютеры бесполезны, ибо они дают только ответы.''&lt;br /&gt;
&lt;br /&gt;
::::::::'''Сальвадор Дали'''&lt;br /&gt;
&lt;br /&gt;
Если бы великий художник лучше разбирался в компьютерах, он сумел бы найти в них гораздо больше недостатков. Чем занимаются большую часть времени настольные компьютеры? Они&lt;br /&gt;
выполняют работу более примитивных устройств. Компьютер может&lt;br /&gt;
быть видеомагнитофоном, радиоприемником, будильником и, конечно,&lt;br /&gt;
конечно, пишущей машинкой. Ну а кроме всего прочего, любая операционная система на любой платформе предлагает программу, выполняющую функции простейшего микрокалькулятора. Непреложный&lt;br /&gt;
факт – микрокалькулятор обязательно будет сэмулирован на любой&lt;br /&gt;
системе, достаточно мощной доля того, чтобы его эмулировать. Нет, я,&lt;br /&gt;
конечно, понимаю, что компьютерные проигрыватели, компьютерные&lt;br /&gt;
будильники и компьютерные микрокалькуляторы полезны. Я и сам с&lt;br /&gt;
удовольствием ими пользуюсь. Я лишь хочу сказать, что компьютеры&lt;br /&gt;
все еще по-настоящему не революционизировали нашу жизнь. Ну а в&lt;br /&gt;
ожидании революции, после которой все будет не так, как было, мы,&lt;br /&gt;
уважаемый читатель, тоже напишем простейшую программу-калькулятор, и воспользуемся для этого, естественно, инструментарием ''GTK+''.&lt;br /&gt;
&lt;br /&gt;
В предыдущей статье мы научились создавать проекты графических приложений с помощью ''Glade''. Используя ''Glade 2.x'', мы сгенерировали не только описание интерфейса программы, но и заготовку ее&lt;br /&gt;
исходного кода, включая вспомогательные функции и обработчики&lt;br /&gt;
событий. Сегодня мы рассмотрим другой способ работы с ''Glade''. При&lt;br /&gt;
новом подходе ''Glade'' используется исключительно для проектирования интерфейса, а исходный код приложения пишется программистом с помощью других средств (по-видимому, этот способ работы станет&lt;br /&gt;
единственно возможным в ''Glade 3.x'').&lt;br /&gt;
&lt;br /&gt;
Описание интерфейса, созданное ''Glade'' в формате XML, и исходный код программы связываются между собой с помощью функций&lt;br /&gt;
библиотеки ''libglade''. Все это немного похоже на систему ''XMLGUI'', реализованную в KDE. Разница заключается в том, что в ''XMLGUI'' внешний&lt;br /&gt;
XML-документ описывает лишь отдельные&lt;br /&gt;
элементы интерфейса программы, тогда как&lt;br /&gt;
при работе с ''libglade'' все описание интерфейса загружается из XML-файла ['''Это не означает, что в ''Qt/KDE'' нет технологии, аналогичной ''libglade''. Интерфейсы, созданные в Qt Designer, также можно загружать и обрабатывать на лету, – прим. ред.'''].&lt;br /&gt;
&lt;br /&gt;
==Приступим к проектированию==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы понять, как работает библиотека ''libglade'', необходимо сначала разобраться, что представляет собой проект ''Glade.''&lt;br /&gt;
Разбираться, как вы уже поняли, мы будем на примере программымикрокалькулятора (Рис. 1).&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF91_GTK1.png|Рис. 1]]&lt;br /&gt;
&lt;br /&gt;
'''Программа-микрокалькулятор.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как можно заметить, наш калькулятор довольно примитивен.&lt;br /&gt;
Поддерживаются только операции сложения и вычитания, причем над&lt;br /&gt;
целыми числами. Отсутствует контроль переполнения при выполнении&lt;br /&gt;
арифметических действий. При желании вы можете нарастить функциональность нашего микрокалькулятора сами – добавить поддержку&lt;br /&gt;
чисел с плавающей точкой, тригонометрические функции, встроенный&lt;br /&gt;
язык программирования... Нет пределов совершенству. Мы же сосредоточимся на программировании интерфейса калькулятора средствами ''GTK+, Glade'' и ''libglade''.&lt;br /&gt;
&lt;br /&gt;
Как это обычно бывает при работе со средствами визуального&lt;br /&gt;
программирования, проектирование программы начинается с пользовательского интерфейса. В главном окне приложения мы размещаем&lt;br /&gt;
несколько контейнеров для более удобной упаковки элементов калькулятора – индикаторной панели и кнопок.&lt;br /&gt;
&lt;br /&gt;
Свойству '''«Имя»''' объекта главного окна мы присваиваем значение&lt;br /&gt;
'''rootwnd'''. Это имя нам нужно запомнить, так как оно будет играть важную роль при взаимодействии с библиотекой ''libglade''. В верхней части&lt;br /&gt;
главного окна расположено текстовое поле '''GtkEntry''', которое будет служить индикаторной панелью калькулятора. Кнопки калькулятора – это объекты '''GtkButton'''. Вот, собственно, и все, других элементов управления наш виртуальный калькулятор (как и его «железный» собрат) не предполагает.&lt;br /&gt;
&lt;br /&gt;
Иерархию объектов-контейнеров и элементов управления, из которых состоит калькулятор, проще (и полезнее) показать, нежели описать. Для этого нужно всего лишь открыть окно '''«Дерево эл. управления»''' среды ''Glade'' (Рис. 2). Перед вами появится древовидный список всех визуальных элементов.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF91_GTK2.png|Рис. 2]]&lt;br /&gt;
&lt;br /&gt;
Окно просмотра структуры элементов интерфейса.&lt;br /&gt;
&lt;br /&gt;
Объекты-контейнеры являются внутренними узлами дерева, а элементы управления – его «листьями». Если мы теперь сохраним проект&lt;br /&gt;
''Glade'' под именем '''calculator''', на диске появится файл '''calculator.glade'''.&lt;br /&gt;
Именно этот файл содержит описание спроектированного нами графического интерфейса программы. Если мы откроем файл '''calculator.glade''' в текстовом редакторе, то увидим примерно следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=”1.0” standalone=”no”?&amp;gt; &amp;lt;!--*- mode: xml -*--&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE glade-interface SYSTEM “http://glade.gnome.org/glade-2.0.dtd”&amp;gt;&lt;br /&gt;
&amp;lt;glade-interface&amp;gt;&lt;br /&gt;
&amp;lt;widget class=”GtkWindow” id=”rootwnd”&amp;gt;&lt;br /&gt;
  &amp;lt;property name=”visible”&amp;gt;True&amp;lt;/property&amp;gt;&lt;br /&gt;
  &amp;lt;property name=”title” translatable=”yes”&amp;gt;Калькулятор&amp;lt;/property&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
    &amp;lt;signal name=”destroy” handler=”gtk_main_quit” last_modification_&lt;br /&gt;
 time=”Tue, 13 Mar 2007 21:18:21 GMT”/&amp;gt;&lt;br /&gt;
    &amp;lt;child&amp;gt;&lt;br /&gt;
     &amp;lt;widget class=”GtkVBox” id=”vbox1”&amp;gt;&lt;br /&gt;
       &amp;lt;property name=”visible”&amp;gt;True&amp;lt;/property&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
       &amp;lt;child&amp;gt;&lt;br /&gt;
              &amp;lt;widget class=”GtkEntry” id=”entry1”&amp;gt;&lt;br /&gt;
                &amp;lt;property name=”visible”&amp;gt;True&amp;lt;/property&amp;gt;&lt;br /&gt;
                 ...&lt;br /&gt;
       &amp;lt;/child&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, файл '''*.glade''' представляет собой XML-документ, в&lt;br /&gt;
котором содержатся списки значений свойств каждого объекта интерфейса, а иерархия интерфейса реализована при помощи иерархии&lt;br /&gt;
вложенных тегов.&lt;br /&gt;
&lt;br /&gt;
==Немного кода==&lt;br /&gt;
&lt;br /&gt;
Теперь, когда у нас есть описание графического интерфейса, созданное ''Glade'', нам будет очень просто написать демонстрирующую его&lt;br /&gt;
программу. Открою небольшой секрет – функциональность ''libglade''&lt;br /&gt;
используется самой средой ''Glade'', которая должна отображать создаваемый интерфейс в отдельном окне. Исходный код программы, загружающей и отображающей графический интерфейс, описанный в файле '''calculator.glade''', состоит примерно из десяти строк (вы найдете его на диске в файле '''calculator-1.c''').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;gtk/gtk.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;glade/glade.h&amp;gt;&lt;br /&gt;
 int main (int argc, char **argv)&lt;br /&gt;
 {&lt;br /&gt;
   GladeXML *xml;&lt;br /&gt;
    gtk_init(&amp;amp;argc, &amp;amp;argv);&lt;br /&gt;
    glade_init();&lt;br /&gt;
    xml = glade_xml_new(“calculator.glade”, “rootwnd”, NULL);&lt;br /&gt;
    if (!xml) {&lt;br /&gt;
             g_warning(“Failed to create the interface”);&lt;br /&gt;
             return 1;&lt;br /&gt;
    }&lt;br /&gt;
    gtk_main();&lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что теперь, помимо заголовочного файла '''gtk/gtk.h''' мы включаем в программу файл '''glade/glade.h'''. Он содержит объявления функций и типов данных библиотеки ''libglade'', а именно она&lt;br /&gt;
будет служить рабочей лошадкой нашей программы. Собственно программа начинается с вызова знакомой нам функции '''gtk_init()'''. Далее&lt;br /&gt;
мы вызываем новую функцию '''glade_init()'''. Ее задача заключается в&lt;br /&gt;
том, чтобы инициализировать систему ''libglade''. Связывание программы с XML-файлом, описывающим ее интерфейс, выполняется функцией '''glade_xml_new()'''. Первым аргументом этой функции должен быть&lt;br /&gt;
файл, созданный в ''Glade'', вторым – имя корневого элемента иерархии графических объектов интерфейса, определенного в этом файле.&lt;br /&gt;
&lt;br /&gt;
Третий параметр '''glade_xml_new()''' описывает домен перевода приложения ('''translation domain'''). В качестве значения этого параметра мы можем передать '''NULL'''. Функция '''glade_xml_new()''' возвращает указатель на структуру&lt;br /&gt;
'''GladeXML''', который мы сохраняем в переменной '''xml'''. Структура '''GladeXML''' инкапсулирует описание интерфейса, созданного ''Glade''.&lt;br /&gt;
Библиотека ''libglade'' экспортирует несколько&lt;br /&gt;
функций, имена которых начинаются с префикса '''glade_xml_'''. Эти функции позволяют&lt;br /&gt;
управлять элементами интерфейса, созданного с помощью ''Glade'', и каждой из них в&lt;br /&gt;
качестве одного из параметров следует передавать указатель на структуру '''GladeXML'''.&lt;br /&gt;
&lt;br /&gt;
Впрочем, в версии '''calculator-1.c''' значение&lt;br /&gt;
переменной '''xml''' еще не востребовано. Вызов&lt;br /&gt;
'''glade_xml_new()''' приводит к загрузке файла&lt;br /&gt;
описания интерфейса в программу, а библиотека ''libglade'' позаботится о его правильном&lt;br /&gt;
отображении. Нам остается только запустить&lt;br /&gt;
цикл обработки сообщений с помощью функции '''gtk_main()'''. Скомпилируем нашу программу, используя следующую команду:&lt;br /&gt;
&lt;br /&gt;
  gcc calculator-1.c -o calculator `pkg-config -- cflags --libs libglade-2.0`&lt;br /&gt;
&lt;br /&gt;
На этот раз в качестве аргумента утилиты ''pkg-config'' мы используем имя пакета ''libglade-2.0''. Теперь можно запустить программу ''calculator''. Вы, конечно, сразу&lt;br /&gt;
заметите, что хотя программа правильно отображает все элементы&lt;br /&gt;
пользовательского интерфейса, она ничего не делает (даже завершиться как следует не умеет). Это вполне естественно, ведь мы еще не определили ни одного обработчика сигнала.&lt;br /&gt;
&lt;br /&gt;
Снова откройте (если, вдруг, вы его закрыли) проект '''calculator'''&lt;br /&gt;
в среде ''Glade''. Прежде всего, выделим в редакторе свойств объект&lt;br /&gt;
'''rootwnd''', перейдем на вкладку '''«Сигналы»''' редактора свойств и создадим обработчик сигнала '''destroy'''. В качестве процедуры обработчика из&lt;br /&gt;
раскрывающегося списка «Обработчик» выберем функцию '''gtk_main_quit()'''. Вот так просто можно связать обработчик сигнала закрытия окна&lt;br /&gt;
и функцию завершения работы программы. Далее выделим в редакторе форм одну из цифровых кнопок калькулятора (Рис. 3).&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF91_GTK3.png|Рис. 3]]&lt;br /&gt;
&lt;br /&gt;
'''Окно редактора формы с выделенной кнопкой.'''&lt;br /&gt;
&lt;br /&gt;
Всем цифровым кнопкам присвоены имена вида '''numeric_button_x''', где '''x''' – число от 0 до 9. Перейдем на вкладку '''«Сигналы»''' редактора свойств и создадим&lt;br /&gt;
для выбранной кнопки обработчик сигнала&lt;br /&gt;
'''clicked'''. Процедура обработчика получит имя&lt;br /&gt;
'''on_numeric_button_x_clicked()'''. Переименуем&lt;br /&gt;
обработчик в '''on_numeric_button_clicked()'''. При&lt;br /&gt;
назначении обработчика каждой кнопке в поле&lt;br /&gt;
ввода '''«Объект»''' укажем значение '''entry1''' (Рис. 4).&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF91_GTK4.png|Рис. 4]]&lt;br /&gt;
&lt;br /&gt;
'''Окно редактора свойств в режиме создания обработчика сигнала.'''&lt;br /&gt;
&lt;br /&gt;
Напомню, что поле ввода '''«Объект»''' позволяет задать имя объекта, указатель на который будет передан процедуре обработчика в качестве дополнительного параметра. Объект '''entry1''' – это объект класса '''GtkEntry''' – '''«индикаторная панель»''' нашего калькулятора. Вполне естественно, что обработчики событий '''clicked'''&lt;br /&gt;
цифровых кнопок должны иметь доступ к объекту, представляющему индикаторную панель. Мы переименовали обработчик сигнала '''clicked''' в '''on_numeric_button_clicked()''', чтобы подчеркнуть, что у нас будет один&lt;br /&gt;
обработчик сигнала '''clicked''' для всех цифровых кнопок.&lt;br /&gt;
&lt;br /&gt;
Назначим теперь обработчик '''on_numeric_button_clicked()''' сигналам '''clicked''' всех кнопок с цифрами (не забудем указать объект '''entry1''' в качестве дополнительного параметра обработчика каждой кнопки).&lt;br /&gt;
Кнопки '''+, –, =''' и '''C''' имеют имена '''operation_button_plus''', '''operation_button_minus''', '''operation_button_equal''' и '''operation_button_cancel''' соответственно.&lt;br /&gt;
В среде ''Glade'' создадим для каждой кнопки свой обработчик события&lt;br /&gt;
'''clicked''' (соответственно функции '''on_operation_button_plus_clicked()''',&lt;br /&gt;
'''on_operation_button_minus_clicked()''', '''on_operation_button_equal_clicked()''' и '''on_operation_button_cancel_clicked()'''). Обработчикам '''on_operation_button_equal_clicked()''' и '''on_operation_button_cancel_clicked()'''&lt;br /&gt;
в качестве дополнительного параметра должен быть передан объект&lt;br /&gt;
'''entry1'''. Сохраним проект ''Glade''. На этом визуальное программирование&lt;br /&gt;
калькулятора закончено, и нам остается довершить воплощение наших&lt;br /&gt;
идей в коде. Вариант программы с обработчиками сигналов вы найдете&lt;br /&gt;
в файле '''calculator-2.c''', основанном на файле '''calculator-1.c'''.&lt;br /&gt;
&lt;br /&gt;
==Доведем до совершенства!==&lt;br /&gt;
&lt;br /&gt;
Прежде всего нам нужно написать функции-обработчики сигналов:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 void on_numeric_button_clicked(gpointer user_data, GtkButton *button)&lt;br /&gt;
 {&lt;br /&gt;
   int i = atoi(gtk_button_get_label(button));&lt;br /&gt;
   if (mode == COPY_MODE) {&lt;br /&gt;
     bgvalue = fgvalue;&lt;br /&gt;
     fgvalue = 0;&lt;br /&gt;
     mode = INPUT_MODE;&lt;br /&gt;
   }&lt;br /&gt;
   fgvalue = fgvalue*10 + i;&lt;br /&gt;
   sprintf(screen, “%li\0”, fgvalue);&lt;br /&gt;
   gtk_entry_set_text(GTK_ENTRY(user_data), screen);&lt;br /&gt;
 }&lt;br /&gt;
 void on_operation_button_plus_clicked(GtkButton *button)&lt;br /&gt;
 {&lt;br /&gt;
   mode = COPY_MODE;&lt;br /&gt;
   op_state = OP_PLUS;&lt;br /&gt;
 }&lt;br /&gt;
 void on_operation_button_minus_clicked(GtkButton *button)&lt;br /&gt;
 {&lt;br /&gt;
   mode = COPY_MODE;&lt;br /&gt;
   op_state = OP_MINUS;&lt;br /&gt;
 }&lt;br /&gt;
 void on_operation_button_equal_clicked(gpointer user_data, GtkButton *button)&lt;br /&gt;
 {&lt;br /&gt;
   switch (op_state) {&lt;br /&gt;
     case OP_PLUS:&lt;br /&gt;
      fgvalue += bgvalue;&lt;br /&gt;
      break;&lt;br /&gt;
     case OP_MINUS:&lt;br /&gt;
      fgvalue = bgvalue - fgvalue;&lt;br /&gt;
     default:;&lt;br /&gt;
   }&lt;br /&gt;
   sprintf(screen, “%li\0”, fgvalue);&lt;br /&gt;
   gtk_entry_set_text(GTK_ENTRY(user_data), screen);&lt;br /&gt;
   mode = COPY_MODE;&lt;br /&gt;
 }&lt;br /&gt;
 void on_operation_button_cancel_clicked(gpointer user_data, GtkButton *button)&lt;br /&gt;
 {&lt;br /&gt;
   bgvalue = fgvalue = 0;&lt;br /&gt;
   mode = COPY_MODE;&lt;br /&gt;
   op_state = OP_NONE;&lt;br /&gt;
   sprintf(screen, “%li\0”, fgvalue);&lt;br /&gt;
   gtk_entry_set_text(GTK_ENTRY(user_data), screen);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Необходимо указать одну особенность взаимодействия программы ''libglade'' с обработчиками сигналов. Если при связывании сигнала с обработчиком указывается дополнительный параметр, этот параметр&lt;br /&gt;
будет первым аргументом функции-обработчика. Вторым аргументом&lt;br /&gt;
будет указатель на объект-источник сигнала. Например, в обработчике '''on_numeric_button_clicked()''' первый аргумент указывает на объект&lt;br /&gt;
'''entry1''', а второй аргумент – на объект '''numeric_button_x''', для которого&lt;br /&gt;
вызван обработчик. Если же при связывании обработчика с сигналом&lt;br /&gt;
дополнительные параметры не указываются, первым (и единственным)&lt;br /&gt;
аргументом функции-обработчика будет указатель на объект-источник&lt;br /&gt;
сигнала. Например, в обработчике '''on_operation_button_plus_clicked()'''&lt;br /&gt;
первым аргументом является указатель на объект '''operation_button_plus''', для которого вызван обработчик.&lt;br /&gt;
&lt;br /&gt;
Вдаваться в подробности работы калькулятора мы не будем. Во-первых, они очевидны. Во-вторых, наша статья посвящена не написанию калькуляторов, а использованию ''libglade'', так что мы рассмотрим&lt;br /&gt;
лишь некоторые аспекты взаимодействия обработчиков с элементами&lt;br /&gt;
интерфейса.&lt;br /&gt;
&lt;br /&gt;
     В обработчике on_numeric_button_clicked() нам необходимо полу-&lt;br /&gt;
чить цифру, соответствующую нажатой кнопке. Мы не можем переда-&lt;br /&gt;
вать цифру в дополнительном параметре обработчика, поскольку этот&lt;br /&gt;
параметр уже занят объектом entry1. Вместо этого мы просто считыва-&lt;br /&gt;
ем цифру, являющуюся меткой нажатой кнопки, с помощью функции&lt;br /&gt;
gtk_button_get_label(). Текст элемента ввода entry1 устанавливается с&lt;br /&gt;
помощью функции gtk_entry_set_text().&lt;br /&gt;
     Хотя мы и создали обработчики всех сигналов, но если бы мы ском-&lt;br /&gt;
пилировали программу на данном этапе, ее элементы управления все&lt;br /&gt;
равно ничего бы не делали. Для того чтобы наладить в программе обра-&lt;br /&gt;
ботку сигналов, недостаточно написать их обработчики. Необходимо&lt;br /&gt;
решить еще одну проблему, которая в явном или неявном виде возни-&lt;br /&gt;
кает во всех средах визуального программирования. В описании интер-&lt;br /&gt;
фейса программы мы указали, например, что обработчиком события&lt;br /&gt;
clicked для кнопки operation_button_minus является нечто по имени&lt;br /&gt;
on_operation_button_minus_clicked(). На этапе визуального программи-&lt;br /&gt;
рования строка on_operation_button_minus_clicked() не является име-&lt;br /&gt;
нем функции, поскольку никакой функции еще нет. Фактически мы&lt;br /&gt;
просто добавили в описание интерфейса программы имя обработчика&lt;br /&gt;
сигнала. Если бы связывание сигнала и обработчика выполнялось на&lt;br /&gt;
этапе компоновки программы (как это происходит в «настоящих» IDE),&lt;br /&gt;
компоновщик нашел бы функцию on_operation_button_minus_clicked()&lt;br /&gt;
и связал бы ее с сигналом. Но в GTK+ связывание сигналов и обработ-&lt;br /&gt;
чиков происходит во время выполнения программы. Каким же образом&lt;br /&gt;
программа находит функцию, соответствующую имени обработчика?&lt;/div&gt;</description>
			<pubDate>Mon, 01 Dec 2008 07:04:13 GMT</pubDate>			<dc:creator>Crazy Rebel</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF91:GTK%2B</comments>		</item>
	</channel>
</rss>