<?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>LXF98:wxWidgets - История изменений</title>
		<link>http://wiki2.linuxformat.ru/index.php?title=LXF98:wxWidgets&amp;action=history</link>
		<description>История изменений этой страницы в вики</description>
		<language>ru</language>
		<generator>MediaWiki 1.11.1</generator>
		<lastBuildDate>Wed, 13 May 2026 22:23:34 GMT</lastBuildDate>
		<item>
			<title>Yaleks: шаблон</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF98:wxWidgets&amp;diff=4957&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;Версия 11:11, 2 июля 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&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;{{Цикл/wxWidgets}}&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 class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;==wxWidgets: живая история==&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;==wxWidgets: живая история==&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;/table&gt;</description>
			<pubDate>Wed, 02 Jul 2008 11:11:15 GMT</pubDate>			<dc:creator>Yaleks</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:LXF98:wxWidgets</comments>		</item>
		<item>
			<title>Yaleks: «LXF98:wxWidgets1» переименована в «LXF98:wxWidgets»: унификация</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF98:wxWidgets&amp;diff=4954&amp;oldid=prev</link>
			<description>&lt;p&gt;«&lt;a href=&quot;/index.php/LXF98:wxWidgets1&quot; title=&quot;LXF98:wxWidgets1&quot;&gt;LXF98:wxWidgets1»&lt;/a&gt; переименована в «&lt;a href=&quot;/index.php/LXF98:wxWidgets&quot; title=&quot;LXF98:wxWidgets&quot;&gt;LXF98:wxWidgets»&lt;/a&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;Версия 11:08, 2 июля 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;/table&gt;</description>
			<pubDate>Wed, 02 Jul 2008 11:08:17 GMT</pubDate>			<dc:creator>Yaleks</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:LXF98:wxWidgets</comments>		</item>
		<item>
			<title>Lockal: восстановление кавычек в коде  AWB</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF98:wxWidgets&amp;diff=4536&amp;oldid=prev</link>
			<description>&lt;p&gt;восстановление кавычек в коде  &lt;a href=&quot;/index.php?title=Linuxformat:AutoWikiBrowser&amp;amp;action=edit&quot; class=&quot;new&quot; title=&quot;Linuxformat:AutoWikiBrowser&quot;&gt;AWB&lt;/a&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:53, 27 апреля 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 4:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 4:&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;Что такое ''wxWidgets''? Для многих разработчиков это просто набор виджетов, занимающий на платформе Linux почетное третье место после вечных соперников ''Qt'' и ''GTK'', и не все знают, что ''wxWidgets'' – это еще и история открытых графических интерфейсов. Набор визуальных элементов управления ''wxWidget'' появился на свет в 1992 году, тогда же, когда и XFree86. Все началось с того, что сотруднику Университета Эдинбурга Джулиану Смарту [Julian Smart] потребовалась кросс-платформенная библиотека для создания графических интерфейсов на платформах Sun и PC. У университета не нашлось средств на покупку кросс-платформенной библиотеки виджетов (да, были и такие времена), и тогда Смарт поступил так, как и подобает настоящему хакеру – он начал писать собственную библиотеку, которую назвал ''wxWindows''. Проект бесплатной кросс-платформенной библиотеки быстро привлек внимание других программистов в университете, а вскоре – и за его пределами. Первая версия ''wxWindows'' поддерживала ''XView'' (набор виджетов, созданный Sun Microsystems) и MFC&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;Что такое ''wxWidgets''? Для многих разработчиков это просто набор виджетов, занимающий на платформе Linux почетное третье место после вечных соперников ''Qt'' и ''GTK'', и не все знают, что ''wxWidgets'' – это еще и история открытых графических интерфейсов. Набор визуальных элементов управления ''wxWidget'' появился на свет в 1992 году, тогда же, когда и XFree86. Все началось с того, что сотруднику Университета Эдинбурга Джулиану Смарту [Julian Smart] потребовалась кросс-платформенная библиотека для создания графических интерфейсов на платформах Sun и PC. У университета не нашлось средств на покупку кросс-платформенной библиотеки виджетов (да, были и такие времена), и тогда Смарт поступил так, как и подобает настоящему хакеру – он начал писать собственную библиотеку, которую назвал ''wxWindows''. Проект бесплатной кросс-платформенной библиотеки быстро привлек внимание других программистов в университете, а вскоре – и за его пределами. Первая версия ''wxWindows'' поддерживала ''XView'' (набор виджетов, созданный Sun Microsystems) и MFC&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;1.0. В 2003 году представители компании Microsoft обратили внимание на wxWindows и вежливо попросили Дж. Смарта изменить название (слово &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Windows” &lt;/del&gt;является зарегистрированной торговой маркой Microsoft в Великобритании) &amp;lt;font color=darkblue&amp;gt;[подобные просьбы высказывались и в адрес закрытых проектов, в частности, Windows Commander, – прим. ред.]&amp;lt;/font&amp;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;1.0. В 2003 году представители компании Microsoft обратили внимание на wxWindows и вежливо попросили Дж. Смарта изменить название (слово &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Windows&amp;quot; &lt;/ins&gt;является зарегистрированной торговой маркой Microsoft в Великобритании) &amp;lt;font color=darkblue&amp;gt;[подобные просьбы высказывались и в адрес закрытых проектов, в частности, Windows Commander, – прим. ред.]&amp;lt;/font&amp;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;(полученные от Microsoft деньги было решено потратить на развитие проекта), и в августе 2004 года библиотека ''wxWindows'' была официально переименована в ''wxWidgets''.&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;(полученные от Microsoft деньги было решено потратить на развитие проекта), и в августе 2004 года библиотека ''wxWindows'' была официально переименована в ''wxWidgets''.&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 colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 49:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 49:&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;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;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;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;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; #include &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“wx&lt;/del&gt;/wx.&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;h”&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; #include &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;wx&lt;/ins&gt;/wx.&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;h&amp;quot;&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;div&gt; class HWFrame: public wxFrame&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; class HWFrame: public wxFrame&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; public:&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; public:&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;       HWFrame() : wxFrame(NULL, wxID_ANY, &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“First &lt;/del&gt;wxWidgets&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;       HWFrame() : wxFrame(NULL, wxID_ANY, &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;First &lt;/ins&gt;wxWidgets&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;Application”&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;Application&amp;quot;&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;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: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;             label = new wxStaticText(this, wxID_STATIC, &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Hello World”&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;             label = new wxStaticText(this, wxID_STATIC, &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Hello World&amp;quot;&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;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;       virtual ~HWFrame()&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;       virtual ~HWFrame()&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 76:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 76:&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; IMPLEMENT_APP(HWApp);&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; IMPLEMENT_APP(HWApp);&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;&amp;lt;/source&amp;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;&amp;lt;/source&amp;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;“Hello World” &lt;/del&gt;в главном окне. Тем не менее, программа ''hwapp'' демонстрирует важнейшие особенности структуры приложения ''wxWidgets''. Объявления всех классов, функций и макросов библиотеки виджетов становятся доступны нам в результате включения в текст программы одного-единственного заголовочного&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;«Hello World» &lt;/ins&gt;в главном окне. Тем не менее, программа ''hwapp'' демонстрирует важнейшие особенности структуры приложения ''wxWidgets''. Объявления всех классов, функций и макросов библиотеки виджетов становятся доступны нам в результате включения в текст программы одного-единственного заголовочного&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;файла – '''wx/wx.h'''. В отличие от ''Qt'' и ''GTKmm'', в ''wxWidgets'', даже при написании простого приложения нам приходится объявлять сразу два собственных класса. Класс &amp;lt;font color=darkred&amp;gt;HWApp&amp;gt;&amp;lt;/font&amp;gt;, который является потомком класса библиотечного &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt;, представляет собой главный класс приложения. Этот класс можно рассматривать как аналог класса &amp;lt;font color=darkred&amp;gt;QApplication&amp;lt;/font&amp;gt; в ''Qt'', с той разницей, что в ''Qt'' нам редко приходится создавать собственный класс, производный от &amp;lt;font color=darkred&amp;gt;QApplication&amp;lt;/font&amp;gt;. Класс &amp;lt;font color=darkred&amp;gt;HWFrame&amp;lt;/font&amp;gt;, который происходит от класса &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;, реализует главное окно нашей программы. Обратите внимание, что имена всех классов &amp;lt;font color=darkred&amp;gt;wxWidgets&amp;lt;/font&amp;gt; начинаются с префикса &amp;lt;font color=darkred&amp;gt;wx&amp;lt;/font&amp;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;файла – '''wx/wx.h'''. В отличие от ''Qt'' и ''GTKmm'', в ''wxWidgets'', даже при написании простого приложения нам приходится объявлять сразу два собственных класса. Класс &amp;lt;font color=darkred&amp;gt;HWApp&amp;gt;&amp;lt;/font&amp;gt;, который является потомком класса библиотечного &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt;, представляет собой главный класс приложения. Этот класс можно рассматривать как аналог класса &amp;lt;font color=darkred&amp;gt;QApplication&amp;lt;/font&amp;gt; в ''Qt'', с той разницей, что в ''Qt'' нам редко приходится создавать собственный класс, производный от &amp;lt;font color=darkred&amp;gt;QApplication&amp;lt;/font&amp;gt;. Класс &amp;lt;font color=darkred&amp;gt;HWFrame&amp;lt;/font&amp;gt;, который происходит от класса &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;, реализует главное окно нашей программы. Обратите внимание, что имена всех классов &amp;lt;font color=darkred&amp;gt;wxWidgets&amp;lt;/font&amp;gt; начинаются с префикса &amp;lt;font color=darkred&amp;gt;wx&amp;lt;/font&amp;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;/table&gt;</description>
			<pubDate>Sun, 27 Apr 2008 14:53:04 GMT</pubDate>			<dc:creator>Lockal</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:LXF98:wxWidgets</comments>		</item>
		<item>
			<title>Belogorie: /* Полезные ссылки */</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF98:wxWidgets&amp;diff=3576&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;Версия 12:12, 27 марта 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 110:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 110:&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;*Викифицированный справочник по всем классам, переменным, функциям и макросам библиотеки ''wxWidgets'' можно найти на сайте проекта по адресу: [http://wiki.wxwidgets.org/docbrowse.html wiki.wxwidgets.org/docbrowse.html].&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;*Викифицированный справочник по всем классам, переменным, функциям и макросам библиотеки ''wxWidgets'' можно найти на сайте проекта по адресу: [http://wiki.wxwidgets.org/docbrowse.html wiki.wxwidgets.org/docbrowse.html].&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;*Хорошим источником информации о программировании в wxWidgets может служить книга «''Cross-Platform GUI Programming with wxWidgets''», написанная Джулианом Смартом [Julian Smart], Кевином Хоком [Kevin Hock] и Стефаном Шомором [Stefan Csomor]. Книга вышла в 2005 году, но не утратила актуальности до сих пор. Правила серии Bruce Perens Open Source Series, к которой принадлежит это издание, позволяют абсолютно легально загрузить его электронную версию (на английском языке) с сайта [http://www.phptr.com/perens www.phptr.com/perens&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;}&lt;/del&gt;. Бумажный вариант можно приобрести на [http://www.amazon.com Amazon.com] по весьма умеренной цене.&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;*Хорошим источником информации о программировании в wxWidgets может служить книга «''Cross-Platform GUI Programming with wxWidgets''», написанная Джулианом Смартом [Julian Smart], Кевином Хоком [Kevin Hock] и Стефаном Шомором [Stefan Csomor]. Книга вышла в 2005 году, но не утратила актуальности до сих пор. Правила серии Bruce Perens Open Source Series, к которой принадлежит это издание, позволяют абсолютно легально загрузить его электронную версию (на английском языке) с сайта [http://www.phptr.com/perens www.phptr.com/perens&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/ins&gt;. Бумажный вариант можно приобрести на [http://www.amazon.com Amazon.com] по весьма умеренной цене.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Thu, 27 Mar 2008 12:12:55 GMT</pubDate>			<dc:creator>Belogorie</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:LXF98:wxWidgets</comments>		</item>
		<item>
			<title>Belogorie в 12:12, 27 марта 2008</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF98:wxWidgets&amp;diff=3575&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;Версия 12:12, 27 марта 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 79:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 79:&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;файла – '''wx/wx.h'''. В отличие от ''Qt'' и ''GTKmm'', в ''wxWidgets'', даже при написании простого приложения нам приходится объявлять сразу два собственных класса. Класс &amp;lt;font color=darkred&amp;gt;HWApp&amp;gt;&amp;lt;/font&amp;gt;, который является потомком класса библиотечного &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt;, представляет собой главный класс приложения. Этот класс можно рассматривать как аналог класса &amp;lt;font color=darkred&amp;gt;QApplication&amp;lt;/font&amp;gt; в ''Qt'', с той разницей, что в ''Qt'' нам редко приходится создавать собственный класс, производный от &amp;lt;font color=darkred&amp;gt;QApplication&amp;lt;/font&amp;gt;. Класс &amp;lt;font color=darkred&amp;gt;HWFrame&amp;lt;/font&amp;gt;, который происходит от класса &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;, реализует главное окно нашей программы. Обратите внимание, что имена всех классов &amp;lt;font color=darkred&amp;gt;wxWidgets&amp;lt;/font&amp;gt; начинаются с префикса &amp;lt;font color=darkred&amp;gt;wx&amp;lt;/font&amp;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;файла – '''wx/wx.h'''. В отличие от ''Qt'' и ''GTKmm'', в ''wxWidgets'', даже при написании простого приложения нам приходится объявлять сразу два собственных класса. Класс &amp;lt;font color=darkred&amp;gt;HWApp&amp;gt;&amp;lt;/font&amp;gt;, который является потомком класса библиотечного &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt;, представляет собой главный класс приложения. Этот класс можно рассматривать как аналог класса &amp;lt;font color=darkred&amp;gt;QApplication&amp;lt;/font&amp;gt; в ''Qt'', с той разницей, что в ''Qt'' нам редко приходится создавать собственный класс, производный от &amp;lt;font color=darkred&amp;gt;QApplication&amp;lt;/font&amp;gt;. Класс &amp;lt;font color=darkred&amp;gt;HWFrame&amp;lt;/font&amp;gt;, который происходит от класса &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;, реализует главное окно нашей программы. Обратите внимание, что имена всех классов &amp;lt;font color=darkred&amp;gt;wxWidgets&amp;lt;/font&amp;gt; начинаются с префикса &amp;lt;font color=darkred&amp;gt;wx&amp;lt;/font&amp;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;В потомке класса &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt; нам требуется переопределить только один базовый метод – &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt;. Этот виртуальный метод вызывается базовым классом в самом начале работы программы и именно на него возложена задача по созданию и отображению главного окна. Если метод &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt; возвращает значение &amp;lt;font color=darkred&amp;gt;'''false''&amp;lt;/font&amp;gt;, выполнение программы сразу же завершается. Если вам необходимо выполнить какие-либо специальные действия в процессе завершения программы (например, высвободить занятые программой ресурсы), вы можете переопределить метод &amp;lt;font color=darkred&amp;gt;OnExit()&amp;lt;/font&amp;gt; класса &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;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;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt; нам требуется переопределить только один базовый метод – &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt;. Этот виртуальный метод вызывается базовым классом в самом начале работы программы и именно на него возложена задача по созданию и отображению главного окна. Если метод &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt; возвращает значение &amp;lt;font color=darkred&amp;gt;'''false&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'&lt;/ins&gt;''&amp;lt;/font&amp;gt;, выполнение программы сразу же завершается. Если вам необходимо выполнить какие-либо специальные действия в процессе завершения программы (например, высвободить занятые программой ресурсы), вы можете переопределить метод &amp;lt;font color=darkred&amp;gt;OnExit()&amp;lt;/font&amp;gt; класса &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;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;В методе &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt; мы создаем объект класса-потомка &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; и вызываем его метод &amp;lt;font color=darkred&amp;gt;Show()&amp;lt;/font&amp;gt;, для того чтобы окно, созданное этим объектом, стало видимым. В классе &amp;lt;font color=darkred&amp;gt;HWFrame&amp;lt;/font&amp;gt; мы переопределяем конструктор и деструктор класса &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. Наша задача – добавить в окно &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; визуальный элемент со статическим текстом (метку) и вывести в нем текст приветствия. Рассмотрим сначала базовый конструктор &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. Первый параметр конструктора – указатель на класс родительского окна. Мы передаем в этом параметре значение &amp;lt;font color=darkred&amp;gt;'''NULL'''&amp;lt;/font&amp;gt;, так как главное окно не имеет родителя. Во втором параметре конструктора передается идентификатор окна. Идентификатор представляет собой целое число, которое идентифицирует окно в процессе обработки сообщений. Все окна, использующие один и тот же цикл обработки сообщений (например, главное окно и его дочерние виджеты), должны иметь уникальные идентификаторы (это не относится к некоторым типам окон, не предназначенных для получения «персональных» сообщений). В программе ''hwApp'' мы не обрабатываем сообщения, поэтому нам все равно, какой будет идентификатор у главного окна программы. В конструкторе &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; мы передаем константу &amp;lt;font color=darkred&amp;gt;wxID_ANY&amp;lt;/font&amp;gt;, которая указывает, что конструктор может сам выбрать идентификатор для создаваемого окна (константой &amp;lt;font color=darkred&amp;gt;wxID_ANY&amp;lt;/font&amp;gt; можно пользоваться всякий раз, когда идентификатор окна вас не интересует). В последнем задействованном нами параметре конструктора передается заголовок создаваемого окна (у конструктора &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; есть и другие параметры, для которых мы оставляем значения по умолчанию). В самом конструкторе мы создаем объект &amp;lt;font color=darkred&amp;gt;label&amp;lt;/font&amp;gt; класса &amp;lt;font color=darkred&amp;gt;wxStaticText&amp;lt;/font&amp;gt; (метка). Первые два параметра конструктора &amp;lt;font color=darkred&amp;gt;wxStaticText&amp;lt;/font&amp;gt; имеют тот же смысл, что и первые параметры конструктора &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. В третьем параметре мы передаем строку текста для отображения. Обратите внимание, что в качестве идентификатора окна визуального элемента «метка» мы воспользовались константой &amp;lt;font color=darkred&amp;gt;wxID_STATIC&amp;lt;/font&amp;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;В методе &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt; мы создаем объект класса-потомка &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; и вызываем его метод &amp;lt;font color=darkred&amp;gt;Show()&amp;lt;/font&amp;gt;, для того чтобы окно, созданное этим объектом, стало видимым. В классе &amp;lt;font color=darkred&amp;gt;HWFrame&amp;lt;/font&amp;gt; мы переопределяем конструктор и деструктор класса &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. Наша задача – добавить в окно &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; визуальный элемент со статическим текстом (метку) и вывести в нем текст приветствия. Рассмотрим сначала базовый конструктор &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. Первый параметр конструктора – указатель на класс родительского окна. Мы передаем в этом параметре значение &amp;lt;font color=darkred&amp;gt;'''NULL'''&amp;lt;/font&amp;gt;, так как главное окно не имеет родителя. Во втором параметре конструктора передается идентификатор окна. Идентификатор представляет собой целое число, которое идентифицирует окно в процессе обработки сообщений. Все окна, использующие один и тот же цикл обработки сообщений (например, главное окно и его дочерние виджеты), должны иметь уникальные идентификаторы (это не относится к некоторым типам окон, не предназначенных для получения «персональных» сообщений). В программе ''hwApp'' мы не обрабатываем сообщения, поэтому нам все равно, какой будет идентификатор у главного окна программы. В конструкторе &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; мы передаем константу &amp;lt;font color=darkred&amp;gt;wxID_ANY&amp;lt;/font&amp;gt;, которая указывает, что конструктор может сам выбрать идентификатор для создаваемого окна (константой &amp;lt;font color=darkred&amp;gt;wxID_ANY&amp;lt;/font&amp;gt; можно пользоваться всякий раз, когда идентификатор окна вас не интересует). В последнем задействованном нами параметре конструктора передается заголовок создаваемого окна (у конструктора &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; есть и другие параметры, для которых мы оставляем значения по умолчанию). В самом конструкторе мы создаем объект &amp;lt;font color=darkred&amp;gt;label&amp;lt;/font&amp;gt; класса &amp;lt;font color=darkred&amp;gt;wxStaticText&amp;lt;/font&amp;gt; (метка). Первые два параметра конструктора &amp;lt;font color=darkred&amp;gt;wxStaticText&amp;lt;/font&amp;gt; имеют тот же смысл, что и первые параметры конструктора &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. В третьем параметре мы передаем строку текста для отображения. Обратите внимание, что в качестве идентификатора окна визуального элемента «метка» мы воспользовались константой &amp;lt;font color=darkred&amp;gt;wxID_STATIC&amp;lt;/font&amp;gt;. Этот  идентификатор используется при создании статических визуальных элементов, которые не обрабатывают пользовательский ввод.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Thu, 27 Mar 2008 12:12:25 GMT</pubDate>			<dc:creator>Belogorie</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:LXF98:wxWidgets</comments>		</item>
		<item>
			<title>Belogorie: Новая: ==wxWidgets: живая история==  ''&lt;font color=darkred&gt;'''ЧАСТЬ 1'''&lt;/font&gt; Что объединяет Audacity, poEdit и FlameRobin? Все они работают на ...</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF98:wxWidgets&amp;diff=3574&amp;oldid=prev</link>
			<description>&lt;p&gt;Новая: ==wxWidgets: живая история==  ''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 1'''&amp;lt;/font&amp;gt; Что объединяет Audacity, poEdit и FlameRobin? Все они работают на ...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==wxWidgets: живая история==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 1'''&amp;lt;/font&amp;gt; Что объединяет Audacity, poEdit и FlameRobin? Все они работают на нескольких платформах, используя wxWidgets – и вы тоже так сможете, если прочтете учебник '''Андрея Боровского'''!''&lt;br /&gt;
&lt;br /&gt;
Что такое ''wxWidgets''? Для многих разработчиков это просто набор виджетов, занимающий на платформе Linux почетное третье место после вечных соперников ''Qt'' и ''GTK'', и не все знают, что ''wxWidgets'' – это еще и история открытых графических интерфейсов. Набор визуальных элементов управления ''wxWidget'' появился на свет в 1992 году, тогда же, когда и XFree86. Все началось с того, что сотруднику Университета Эдинбурга Джулиану Смарту [Julian Smart] потребовалась кросс-платформенная библиотека для создания графических интерфейсов на платформах Sun и PC. У университета не нашлось средств на покупку кросс-платформенной библиотеки виджетов (да, были и такие времена), и тогда Смарт поступил так, как и подобает настоящему хакеру – он начал писать собственную библиотеку, которую назвал ''wxWindows''. Проект бесплатной кросс-платформенной библиотеки быстро привлек внимание других программистов в университете, а вскоре – и за его пределами. Первая версия ''wxWindows'' поддерживала ''XView'' (набор виджетов, созданный Sun Microsystems) и MFC&lt;br /&gt;
1.0. В 2003 году представители компании Microsoft обратили внимание на wxWindows и вежливо попросили Дж. Смарта изменить название (слово “Windows” является зарегистрированной торговой маркой Microsoft в Великобритании) &amp;lt;font color=darkblue&amp;gt;[подобные просьбы высказывались и в адрес закрытых проектов, в частности, Windows Commander, – прим. ред.]&amp;lt;/font&amp;gt;. Переговоры продолжались долго; в качестве ответной уступки американская компания предложила материальную компенсацию&lt;br /&gt;
(полученные от Microsoft деньги было решено потратить на развитие проекта), и в августе 2004 года библиотека ''wxWindows'' была официально переименована в ''wxWidgets''.&lt;br /&gt;
&lt;br /&gt;
Почему же ''wxWidgets'' не стала предпочтительным выбором для Linux-программистов? Причина проста: в те далекие времена, когда решалась судьба графических оболочек для Linux, ''wxWidgets'' (тогда еще ''wxWindows'') не поддерживала X11. На платформе Unix/Linux ''wxWidgets'' использовала виджеты Motif/Lesstif, а позднее – ''GTK''. Версия библиотеки, способная работать с X11 без посторонней помощи, появилась только в 2002 году, когда территорию графических оболочек для Linux уже застолбили другие библиотеки.&lt;br /&gt;
&lt;br /&gt;
Библиотека ''wxWidgets'' распространяется на условиях ''wxWindows License'' (которую должна заменить ''wxWidgets License'', отличающаяся от первой только названием). По сути своей, ''wxWindows License'' – это «смягченный вариант» LGPL, позволяющий распространять производные продукты wxWidgets в бинарной форме на ваших собственных условиях без отчислений разработчикам ''wxWidgets''. Фактически, лицензия wxWindows предоставляет разработчику больше возможностей, чем лицензия ''GTK+'', которая обязывает разработчика распространять производные библиотеки на условиях LGPL, и лицензия ''Qt'', которая требует платить за коммерческое использование библиотеки. Приложения, использующие ''wxWidgets'', можно программировать не только на родном для этой библиотеки – C++, но и на других языках программирования (Java, Perl, Python). Существуют также интерфейсы wxWidgets для Microsoft .NET и Mono. На основе ''wxWidgets'' создано немало программ, самой известной из которых является, пожалуй, аудиоредактор Audacity.&lt;br /&gt;
&lt;br /&gt;
Список платформ, поддерживаемых ''wxWidgets'', внушает уважение. Вы можете использовать библиотеку вместе с ''GTK'' (Unix/Linux/MinGW), Lesstif/Motif (Unix/Linux) X11 (Unix/Linux/MinGW), Win32 (Windows, Windows CE), Carbon (Mac OS), Cocoa (Mac OS X, GNUstep), Protein (Palm OS), PM (OS/2), MGL (Unix/DOS). Само это перечисление демонстрирует важную особенность ''wxWidgets'' – «вертикальную» организацию набора виджетов. В отличие от ''Qt'' и ''GTK'', которые ориентированы на платформы, библиотека ''wxWidgets'' ориентирована на интерфейсы. Если какой-либо из поддерживаемых ''wxWidgets'' интерфейсов переносится на новую платформу, перенос ''wxWidgets'' на эту платформу не должен представлять особых проблем. По традиции, версии ''wxWidgets'' для каждой платформы обозначаются добавлением префикса wx к сокращенному названию платформы. Например, ''wxWidgets'' для Windows обозначается как ''wxMSW'', ''wxWidgets'' для ''GTK'' – как ''wxGTK'', ''wxWidgets'' для X11 – как ''wxX11'', и т. д. Еще одна интересная возможность, связанная с многоплатформенностью ''wxWidgets'' – кросскомпиляция. На сайте проекта можно найти инструкции по компиляции ''wxWidgets''-программ для Windows из-под Linux.&lt;br /&gt;
&lt;br /&gt;
Выбирая между ''wxWidgets'' для ''GTK'' и ''wxWidgets'' для X11, следует помнить, что, несмотря на все усилия разработчиков, эти два набора визуальных компонентов все еще неравноценны. На сайтах некоторых проектов, использующих ''wxWidgets'', вы найдете указания, что проект компилируется с ''wxGTK'', но не с ''wxX11''. Объясняется это тем, что набор виджетов ''wxUniversal'', который использует ''wxX11'', все еще не дотягивает по функциональности до набора ''GTK'', на котором основана ''wxGTK''. Разработанный с нуля ''wxUniversal'' представляет собой сравнительно недавнее добавление в ''wxWidgets''. Этот набор виджетов предназначен,&lt;br /&gt;
в перспективе, для тех платформ, у которых собственные наборы виджетов отсутствуют (хотя вряд ли такую можно сейчас найти). Список виджетов и функций, которые присутствуют в ''wxGTK'' и ''wxMSW'', но все еще не реализованы в ''wxX11'', приведен на сайте проекта. В качестве довода в пользу ''wxX11'' можно указать то, что этот набор виджетов не нуждается в «прослойке» ''GTK'' и может работать в системе, где библиотека ''GTK'' не установлена или не настроена должным образом.&lt;br /&gt;
Окончательное решение при выборе между ''wxGTK'' и ''wxX11'' следует принимать, исходя из требований создаваемого приложения (есть ли в ''wxX11'' все необходимые виджеты) и параметров ''GTK'' в целевой системе. При этом, в случае необходимости, базовую платформу можно будет сменить и на ходу (по крайней мере, переход с ''wxX11'' на ''wxGTK'' не вызовет проблем).&lt;br /&gt;
&lt;br /&gt;
Помимо собственно визуальных компонентов, ''wxWidgets'' предоставляет в распоряжение программиста классы для работы с базами данных (поддерживаются интерфейсы ODBC, XBase, SQLite), классы для работы с сокетами и популярными сетевыми протоколами, а также специальные классы для работы с HTML. Есть у ''wxWidgets'' и собственные классы, реализующие распространенные структуры данных (списки, очереди и т. п.), которые были введены в проект еще до появления&lt;br /&gt;
в С++ стандартной библиотеки шаблонов. Поскольку сейчас использование шаблонов стандартной библиотеки представляется более целесообразным, вы можете сконфигурировать ''wxWidgets'' таким образом, чтобы библиотека использовала STL, а не собственные реализации этих структур данных.&lt;br /&gt;
&lt;br /&gt;
В ''wxWidgets'' реализованы сразу два способа определения обработчиков событий. Более старый способ, разработанный под влиянием MFC, основан на статических таблицах событий (event tables). Однако, он не позволяет манипулировать обработчиками событий во время выполнения программы. Второй (более новый) вариант основан на использовании метода &amp;lt;font color=darkred&amp;gt;connect()&amp;lt;/font&amp;gt; и больше похож на динамический способ определения обработчиков событий, используемый в ''Qt''.&lt;br /&gt;
&lt;br /&gt;
===Инструменты разработчика===&lt;br /&gt;
&lt;br /&gt;
Сегодня практически каждый набор виджетов сопровождается средствами визуального программирования и другими вспомогательными инструментами. Библиотека ''wxWidgets'' не является исключением из этого правила. Вспомогательных средств разработки для ''wxWidgets'' существует немало, больше, пожалуй, чем для ''Qt'' и ''GTK'', но при близком знакомстве с этими средствами заядлый линуксоид может испытать разочарование. Мы привыкли к тому, что базовые средства разработки для библиотек виджетов доступны нам на тех же условиях, что и сами библиотеки, однако с ''wxWidgets'' дело обстоит иначе. Наиболее функциональные системы визуального программирования для ''wxWidgets'' либо являются полностью коммерческими продуктами, либо распространяются бесплатно, но без исходных текстов.&lt;br /&gt;
&lt;br /&gt;
Интегрированная среда разработки DialogBlocks, доступная на сайте [http://www.anthemion.co.uk/dialogblocks www.anthemion.co.uk/dialogblocks], претендует на роль официального средства разработки приложений ''wxWidgets'' на C++.&lt;br /&gt;
&lt;br /&gt;
''DialogBlocks'' включает визуальный редактор окон ''wxWidgets'', многооконный текстовый редактор, встроенную справочную систему. Интегрированная среда умеет генерировать Make-файлы для проектов ''wxWidgets'' и пересобирать саму библиотеку. Поддерживается и интерактивная отладка приложений (с использованием внешнего отладчика). Среда ''DialogBlocks'' – коммерческий продукт, который фактически распространяется как shareware. Вы можете работать с программой бесплатно, однако, до тех пор, пока вы не оплатите регистрацию, функциональность ''DialogBlocks'' будет ограничена. Диалоговые окна в незарегистрированной версии могут включать не более 30 визуальных элементов, специальное окно периодически напоминает вам о необходимости регистрации, а многие визуальные элементы оказываются недоступны. При весьма солидных расценках (за новейшую версию разработчик требует $85, «студенческий» вариант обойдется вам на $40 дешевле) ''DialogBlocks'' отнюдь не поражает воображение работы. Редактор исходных текстов лишен тех приятных мелочей (вроде автоматического завершения кода и подсказок для заголовков вызываемых функций), к которым мы давно привыкли в других коммерческих IDE. При первой попытке собрать проект система предлагает указать место расположения компилятора, но ввести путь к файлу gcc в открытом для этого диалоговом окне не удается (окно просто не реагирует на нажатие клавиш). Конечно, пользователя Linux такими мелочами не испугаешь, я тут же полез в окно настроек, где вручную сконфигурировал проект для сборки под ''wxX11''. Далее выяснилось, что для того, чтобы собрать тестовое приложение надо сначала пересобрать ''wxWidgets'', при этом некоторые поддиректории ''wxWidgets'' пришлось переименовывать вручную. После всех этих доработок тестовое приложение скомпилировалось и запустилось. Впрочем, и разочарования на этом не кончились. В текстовом редакторе ''DialogBlocks'' отсутствуют функции быстрого перехода между реализацией функции и ее объявлением, перехода к выбранному заголовочному файлу и им подобные. Фактически встроенный редактор ''DialogBlocks'' не намного лучше, чем ''KWrite''.&lt;br /&gt;
&lt;br /&gt;
Те, кто готов платить за средство разработки для ''wxWidgets'', могут обратить внимание на еще одну коммерческую IDE – ''wxDesigner''.&lt;br /&gt;
&lt;br /&gt;
Среда разработки ''wxDesigner'' – полностью коммерческий продукт (вы можете бесплатно скачать пакет дистрибутива с сайта программы – [http://www.roebling.de www.roebling.de], но незарегистрированная версия не позволит вам сохранять проекты). Работает ''wxDesigner'' не очень стабильно, попытка создать диалоговое окно в режиме визуального программирования несколько раз заканчивалась ошибкой сегментации и аварийным завершением программы. Учитывая, что сам проект ''wxDesigner'' давно не обновлялся, я не рекомендовал бы вам тратить на него свои деньги. В общем и целом следует признать, что по уровню функциональности и удобства коммерческие IDE для ''wxWidgets'' не только не опережают, но даже несколько отстают от открытых IDE, предназначенных для других библиотек. Так, по крайней мере, обстоит дело на платформе Linux. Для тех, кто ведет разработку приложений ''wxWidgets'' на платформе Windows, ситуация складывается более благоприятно. Библиотека ''wxWidgets'' давно уже умеет интегрироваться с Microsoft Visual Studio, а с недавнего времени – и с Borland/CodeGear C++Builder. При этом для «билдера» есть специальный мастер создания форм ''wxWidgets''. Некоторые разработчики нашли выход из положения благодаря кроссплатформенности ''wxWidgets'' – они ведут разработку приложений в одной из Windows IDE, а конечный продукт компилируют в Linux (не рассказывайте об этом фанатам ''Emacs'' и ''Eclipse'', они побьют вас камнями, если узнают).&lt;br /&gt;
&lt;br /&gt;
На платформе Linux частичная (без средств визуального редактирования) поддержка ''wxWidgets'' интегрирована в ''KDevelop'' и ''Anjuta''. Эти интегрированные среды разработки умеют создавать заготовки приложений ''wxWidgets'' а также генерировать скрипты configure и make. Специально для редактирования графических интерфейсов ''wxWidgets'' создается программа ''wxGlade''. Название проекта говорит само за себя – ''wxGlade'' претендует на роль ''Glade'' для ''wxWidgets''. Редактор ''wxGlade'' написан на языке Python и в настоящем своем виде (версия 0.6) подходит больше для тех, кто пишет программы, используя именно этот язык (хотя поддержка C++ и Perl также присутствует).&lt;br /&gt;
&lt;br /&gt;
Собственно говоря, все вышесказанное не должно вселять в вас пессимизм. Если вы можете обойтись без визуального программирования и интерактивных подсказок, для написания приложений ''wxWidgets'' подойдет любой текстовый редактор, хоть тот же ''KWrite''.&lt;br /&gt;
&lt;br /&gt;
===Приступаем к работе===&lt;br /&gt;
&lt;br /&gt;
Хотя в вашем дистрибутиве Linux наверняка есть пакет разработчика для ''wxWidgets'', я рекомендую собрать библиотеку из исходных текстов, доступных на сайте проекта ([http://wxwidgets.org wxwidgets.org] – просто на всякий случай). Скомпилировав ''wxWidgets'', вы не только получаете новейшую версию библиотеки, но и более гибкие средства конфигурирования. Например, для этих статей я решил использовать ''wxX11'', тогда как пакет ''wxWidgets'' из моего дистрибутива (OpenSUSE) сконфигурирован для ''GTK+''. Скрипт '''configure wxwidgets''' позволяет настраивать многие параметры библиотеки с помощью ключей. Например, для того, чтобы скомпилировать ''wxWidgets'' с поддержкой X11, командуем:&lt;br /&gt;
&lt;br /&gt;
 ./configure --with-x11&lt;br /&gt;
&lt;br /&gt;
Ключ &amp;lt;font color=darkred&amp;gt;--enable-stl&amp;lt;/font&amp;gt; указывает, что вместо классов структур данных ''wxWidgets'' следует использовать контейнеры STL. Полное описание ключей &amp;lt;font color=darkred&amp;gt;configure&amp;lt;/font&amp;gt; вы можете получить, как обычно, с помощью ключа &amp;lt;font color=darkred&amp;gt;--help&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Знакомство с программированием в ''wxWidgets'' мы начнем, как всегда, с простейшего приложения (файл '''hwapp.cpp'''):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 #include “wx/wx.h”&lt;br /&gt;
 class HWFrame: public wxFrame&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
       HWFrame() : wxFrame(NULL, wxID_ANY, “First wxWidgets&lt;br /&gt;
 Application”)&lt;br /&gt;
       {&lt;br /&gt;
             label = new wxStaticText(this, wxID_STATIC, “Hello World”);&lt;br /&gt;
       }&lt;br /&gt;
       virtual ~HWFrame()&lt;br /&gt;
       {&lt;br /&gt;
             delete label;&lt;br /&gt;
       }&lt;br /&gt;
 private:&lt;br /&gt;
       wxStaticText * label;&lt;br /&gt;
 };&lt;br /&gt;
 class HWApp: public wxApp&lt;br /&gt;
 {&lt;br /&gt;
       virtual bool OnInit()&lt;br /&gt;
       {&lt;br /&gt;
             HWFrame * myFrame = new HWFrame();&lt;br /&gt;
             myFrame-&amp;gt;Show();&lt;br /&gt;
             return true;&lt;br /&gt;
       }&lt;br /&gt;
 };&lt;br /&gt;
 IMPLEMENT_APP(HWApp);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Эта программа действительно очень проста. Она не обрабатывает события, не содержит сложных элементов интерфейса; все, что она делает – выводит надпись “Hello World” в главном окне. Тем не менее, программа ''hwapp'' демонстрирует важнейшие особенности структуры приложения ''wxWidgets''. Объявления всех классов, функций и макросов библиотеки виджетов становятся доступны нам в результате включения в текст программы одного-единственного заголовочного&lt;br /&gt;
файла – '''wx/wx.h'''. В отличие от ''Qt'' и ''GTKmm'', в ''wxWidgets'', даже при написании простого приложения нам приходится объявлять сразу два собственных класса. Класс &amp;lt;font color=darkred&amp;gt;HWApp&amp;gt;&amp;lt;/font&amp;gt;, который является потомком класса библиотечного &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt;, представляет собой главный класс приложения. Этот класс можно рассматривать как аналог класса &amp;lt;font color=darkred&amp;gt;QApplication&amp;lt;/font&amp;gt; в ''Qt'', с той разницей, что в ''Qt'' нам редко приходится создавать собственный класс, производный от &amp;lt;font color=darkred&amp;gt;QApplication&amp;lt;/font&amp;gt;. Класс &amp;lt;font color=darkred&amp;gt;HWFrame&amp;lt;/font&amp;gt;, который происходит от класса &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;, реализует главное окно нашей программы. Обратите внимание, что имена всех классов &amp;lt;font color=darkred&amp;gt;wxWidgets&amp;lt;/font&amp;gt; начинаются с префикса &amp;lt;font color=darkred&amp;gt;wx&amp;lt;/font&amp;gt;, а имена методов классов – с заглавной буквы.&lt;br /&gt;
&lt;br /&gt;
В потомке класса &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt; нам требуется переопределить только один базовый метод – &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt;. Этот виртуальный метод вызывается базовым классом в самом начале работы программы и именно на него возложена задача по созданию и отображению главного окна. Если метод &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt; возвращает значение &amp;lt;font color=darkred&amp;gt;'''false''&amp;lt;/font&amp;gt;, выполнение программы сразу же завершается. Если вам необходимо выполнить какие-либо специальные действия в процессе завершения программы (например, высвободить занятые программой ресурсы), вы можете переопределить метод &amp;lt;font color=darkred&amp;gt;OnExit()&amp;lt;/font&amp;gt; класса &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В методе &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt; мы создаем объект класса-потомка &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; и вызываем его метод &amp;lt;font color=darkred&amp;gt;Show()&amp;lt;/font&amp;gt;, для того чтобы окно, созданное этим объектом, стало видимым. В классе &amp;lt;font color=darkred&amp;gt;HWFrame&amp;lt;/font&amp;gt; мы переопределяем конструктор и деструктор класса &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. Наша задача – добавить в окно &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; визуальный элемент со статическим текстом (метку) и вывести в нем текст приветствия. Рассмотрим сначала базовый конструктор &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. Первый параметр конструктора – указатель на класс родительского окна. Мы передаем в этом параметре значение &amp;lt;font color=darkred&amp;gt;'''NULL'''&amp;lt;/font&amp;gt;, так как главное окно не имеет родителя. Во втором параметре конструктора передается идентификатор окна. Идентификатор представляет собой целое число, которое идентифицирует окно в процессе обработки сообщений. Все окна, использующие один и тот же цикл обработки сообщений (например, главное окно и его дочерние виджеты), должны иметь уникальные идентификаторы (это не относится к некоторым типам окон, не предназначенных для получения «персональных» сообщений). В программе ''hwApp'' мы не обрабатываем сообщения, поэтому нам все равно, какой будет идентификатор у главного окна программы. В конструкторе &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; мы передаем константу &amp;lt;font color=darkred&amp;gt;wxID_ANY&amp;lt;/font&amp;gt;, которая указывает, что конструктор может сам выбрать идентификатор для создаваемого окна (константой &amp;lt;font color=darkred&amp;gt;wxID_ANY&amp;lt;/font&amp;gt; можно пользоваться всякий раз, когда идентификатор окна вас не интересует). В последнем задействованном нами параметре конструктора передается заголовок создаваемого окна (у конструктора &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; есть и другие параметры, для которых мы оставляем значения по умолчанию). В самом конструкторе мы создаем объект &amp;lt;font color=darkred&amp;gt;label&amp;lt;/font&amp;gt; класса &amp;lt;font color=darkred&amp;gt;wxStaticText&amp;lt;/font&amp;gt; (метка). Первые два параметра конструктора &amp;lt;font color=darkred&amp;gt;wxStaticText&amp;lt;/font&amp;gt; имеют тот же смысл, что и первые параметры конструктора &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. В третьем параметре мы передаем строку текста для отображения. Обратите внимание, что в качестве идентификатора окна визуального элемента «метка» мы воспользовались константой &amp;lt;font color=darkred&amp;gt;wxID_STATIC&amp;lt;/font&amp;gt;. Этот  идентификатор используется при создании статических визуальных элементов, которые не обрабатывают пользовательский ввод.&lt;br /&gt;
&lt;br /&gt;
Вот, собственно, и все. Ах, да, вы, наверное, обратили внимание, что в программе не определена функция &amp;lt;font color=darkred&amp;gt;main()&amp;lt;/font&amp;gt;. Дело в том, что разработчики ''wxWidgets'' избавили нас от хлопот по написанию главной функции программы. Все необходимые определения содержит макрос &amp;lt;font color=darkred&amp;gt;IMPLEMENT_App()&amp;lt;/font&amp;gt;, которому мы передаем имя класса приложения в качестве параметра. Теперь программу можно скомпилировать, воспользовавшись вспомогательной утилитой ''wx-config'':&lt;br /&gt;
&lt;br /&gt;
 g++ hwApp.cpp `wx-config --libs` `wx-config --cxxflags` -o hwApp&lt;br /&gt;
&lt;br /&gt;
Трудно представить себе программу проще той, что мы написали. В продолжении серии мы рассмотрим процесс создания «настоящего» приложения – программы для записи разговоров ''Skype''.&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Как должны выглядеть ваши программы?===&lt;br /&gt;
&lt;br /&gt;
Разработчиков кроссплатформенных наборов виджетов можно разделить на два лагеря: одни стремятся к тому, чтобы визуальные компоненты выглядели по возможности одинаково на всех платформах (обычно это люди с твердыми убеждениями относительно того, каким должен быть правильный графический интерфейс). Наборы визуальных компонентов этого типа радуют глаз единством фирменного стиля. Разработчики из другого лагеря настаивают на том, чтобы на каждой платформе внешний вид графических элементов управления максимально соответствовал тому, что принято на данной платформе. К достоинствам этого подхода относят то, что единообразие внешнего вида приложений упрощает, якобы, освоение новых программ. Лично я с этим аргументом не согласен. На мой взгляд, кнопки в стиле Aqua нисколько не мешают освоению ''Safari'' для Windows.&lt;br /&gt;
&lt;br /&gt;
Самое сложное в освоении новой программы – согласовать подход разработчиков к решению поставленной задачи со своим собственным видением. Как бы там ни было, ''wxWidgets'' придерживается второго подхода, причем следует ему в гораздо большей степени, чем, скажем, Qt. Визуальные элементы ''wxWidgets'' не только выглядят на каждой платформе «как родные» (фактически, во многих случаях, классы ''wxWidgets'' – это просто обертки вокруг фирменных элементов управления), но и используют специфические возможности каждой платформы. Например, на платформе Win32 ''wxWidgets'' поддерживает метафайлы, которые отсутствуют в GTK. Если вы программируете интерфейсы с помощью ''wxWidgets'', вы должны сами устанавливать баланс использования платформо-специфичных и кроссплатформенных возможностей библиотеки.&lt;br /&gt;
&lt;br /&gt;
===Центральная проблема GUI-программирования===&lt;br /&gt;
&lt;br /&gt;
Проблема обработки сообщений возникает во всех объектно-ориентированных графических библиотеках, написанных на C++. Представьте себе объект, реализующий кнопку (пусть это будет объект класса &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;). Во время выполнения программы кнопка – объект &amp;lt;font color=darkred&amp;gt;button1&amp;lt;/font&amp;gt; класса &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt; получает информацию о событиях графической системы (например, о щелчке мышью). В ответ на щелчок мышью для объекта &amp;lt;font color=darkred&amp;gt;button1&amp;lt;/font&amp;gt; вызывается метод класса &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt; (назовем его &amp;lt;font color=darkred&amp;gt;OnClick()&amp;lt;/font&amp;gt;), который должен оповестить остальные компоненты программы о внешнем событии.&lt;br /&gt;
&lt;br /&gt;
Как заставить кнопку делать именно то, что нам нужно? Можно создать класс-потомок &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;, например, &amp;lt;font color=darkred&amp;gt;MyButton&amp;lt;/font&amp;gt;, и переопределить в нем метод &amp;lt;font color=darkred&amp;gt;OnClick()&amp;lt;/font&amp;gt; базового класса. Этот способ прост, но неудобен. В вашей программе наверняка будет несколько кнопок и при таком подходе вам придется создавать собственный класс для каждой из них. Необходимость создавать собственный класс для каждой кнопки не только сделает ваш код громоздким и трудным в управлении (представьте себе, что вы сначала использовали для создания кнопок базовый класс &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;, а потом захотели воспользоваться другой реализацией&lt;br /&gt;
кнопки), но и, в некотором смысле, противоречит принципам ООП. Ведь кнопка остается кнопкой, независимо от того, как она реагирует на события. Зачем же создавать новый класс для каждой конкретной кнопки?&lt;br /&gt;
&lt;br /&gt;
Разработчики библиотек визуальных элементов отдают предпочтение модели, в которой для задания собственных обработчиков событий&lt;br /&gt;
необходимо переопределить только один класс. Предположим, что в нашем гипотетическом наборе виджетов есть класс &amp;lt;font color=darkred&amp;gt;Window&amp;lt;/font&amp;gt;, который реализует главное окно. Мы определяем класс-потомок класса &amp;lt;font color=darkred&amp;gt;Window&amp;lt;/font&amp;gt; (например, &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt;) и определяем обработчики всех событий всех дочерних элементов главного окна как методы этого класса. Все кнопки, используемые в окне класса &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt;, могут быть объектами класса &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;. Обработчиком события &amp;lt;font color=darkred&amp;gt;OnClick&amp;lt;/font&amp;gt; каждой кнопки будет один из методов &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt;. Нам остается только сообщить каждому объекту &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;, какой из методов объекта класса &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt; является обработчиком его события. Тут-то и возникает проблема. Мы должны «прикрепить» методы &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt; к объектам &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt; (при этом класс &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt; ничего не знает о классе &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt;). В некоторых языках программирования (Objective-C, C#) эта проблема была решена на уровне самого языка. В C++ стандартного решения не существует, и разработчики наборов виджетов реализуют механизмы обработки сообщений по своему разумению. Все используемые сегодня решения основаны, так или иначе, на функциях обратного вызова. Фактически, разные библиотеки виджетов различаются только способами оформления этого подхода.&lt;br /&gt;
&lt;br /&gt;
===Полезные ссылки===&lt;br /&gt;
&lt;br /&gt;
*Викифицированный справочник по всем классам, переменным, функциям и макросам библиотеки ''wxWidgets'' можно найти на сайте проекта по адресу: [http://wiki.wxwidgets.org/docbrowse.html wiki.wxwidgets.org/docbrowse.html].&lt;br /&gt;
*Хорошим источником информации о программировании в wxWidgets может служить книга «''Cross-Platform GUI Programming with wxWidgets''», написанная Джулианом Смартом [Julian Smart], Кевином Хоком [Kevin Hock] и Стефаном Шомором [Stefan Csomor]. Книга вышла в 2005 году, но не утратила актуальности до сих пор. Правила серии Bruce Perens Open Source Series, к которой принадлежит это издание, позволяют абсолютно легально загрузить его электронную версию (на английском языке) с сайта [http://www.phptr.com/perens www.phptr.com/perens}. Бумажный вариант можно приобрести на [http://www.amazon.com Amazon.com] по весьма умеренной цене.&lt;/div&gt;</description>
			<pubDate>Thu, 27 Mar 2008 12:11:16 GMT</pubDate>			<dc:creator>Belogorie</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:LXF98:wxWidgets</comments>		</item>
	</channel>
</rss>