{"id":253768,"date":"2015-03-25T17:13:03","date_gmt":"2015-03-25T13:13:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=253768"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=253768","title":{"rendered":"DlangUI \u2014 \u043a\u0440\u043e\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 GUI \u0434\u043b\u044f D (\u0427\u0430\u0441\u0442\u044c 1)"},"content":{"rendered":"<p>     \t\u041c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u044f\u0437\u044b\u043a D. \u0414\u0430\u0432\u043d\u043e \u0441\u043b\u0435\u0436\u0443 \u0437\u0430 \u0435\u0433\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c. \u0414\u043b\u044f D \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e GUI \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u043e\u0432, \u043d\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0437\u043e\u0431\u0440\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434.<br \/>  \u0425\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0441\u0432\u043e\u0451\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <a href=\"https:\/\/github.com\/buggins\/dlangui\">DlangUI<\/a>. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u043e\u043d \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d.<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/54f\/b63\/b5a\/54fb63b5a87749e18bfb6f0777fc2c08.png\"\/><\/p>\n<p>  \u041d\u0430 \u041a\u0414\u041f\u0412 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 DlangIDE \u2014 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 DlangUI.<\/p>\n<h2>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438:<\/h2>\n<ul>\n<li>\u041a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u2014 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f Windows, Linux, Mac OSX; \u043b\u0435\u0433\u043a\u043e\u0441\u0442\u044c \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b<\/li>\n<li>\u041d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 D \u2014 \u043b\u0435\u0433\u043a\u043e\u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u044b\u0439<\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Layouts \u0434\u043b\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430<\/li>\n<li>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0448\u0440\u0438\u0444\u0442\u043e\u0432 \u0438 \u0438\u043a\u043e\u043d\u043e\u043a \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430<\/li>\n<li>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Unicode<\/li>\n<li>\u0418\u043d\u0442\u0435\u0440\u043d\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u2014 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 UI \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f\u0437\u044b\u043a\u043e\u0432<\/li>\n<li>\u0410\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e OpenGL (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/li>\n<li>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u043f\u043e\u0432\u0435\u0440\u0445 OpenGL \u0441\u0446\u0435\u043d\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f UI \u0432 \u0438\u0433\u0440\u0435)<\/li>\n<li>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430<\/li>\n<li>\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0435\u043c (\u0434\u0432\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0442\u0435\u043c\u044b \u2014 \u0441\u0432\u0435\u0442\u043b\u0430\u044f \u0438 \u0442\u0435\u043c\u043d\u0430\u044f)<\/li>\n<li>\u0412\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b<\/li>\n<li>\u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434, \u043f\u043e\u0434 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439 Boost License 1.0<\/li>\n<\/ul>\n<p><a name=\"habracut\"><\/a><\/p>\n<h2>\u0415\u0449\u0435 \u043f\u0430\u0440\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432<\/h2>\n<p>  <\/p>\n<h3>\u0414\u0435\u043c\u043e DlangUI \u2014 example1<\/h3>\n<p><img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/315\/1b2\/83b\/3151b283b1974473b317495b389124a1.png\"\/><\/p>\n<h3>\u0414\u0435\u043c\u043e DlangUI \u2014 Tetris<\/h3>\n<p><img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/683\/1c0\/e4e\/6831c0e4ebe54f00a3f5dbef71be490d.png\"\/><\/p>\n<h1>\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d\u0430 \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 GUI \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430?<\/h1>\n<p>  \u0414\u043b\u044f D \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043d\u0435\u043c\u0430\u043b\u043e GUI \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 <a href=\"http:\/\/wiki.dlang.org\/Libraries_and_Frameworks#GUI_Libraries\">wiki.dlang.org<\/a><br \/>  \u0415\u0441\u043b\u0438 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0438 \u043a GTK, Qt, wxWidgets, FLTK, \u0438 \u0434\u0430\u0436\u0435 \u043f\u043e\u0440\u0442 SWT \u0441 Java \u043d\u0430 D (DWT).\u041d\u043e \u043e\u043d\u0438 \u0442\u044f\u043d\u0443\u0442 \u0441 \u0441\u043e\u0431\u043e\u0439 \u043c\u043d\u043e\u0433\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0441\u043b\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432, \u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0445 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434.<br \/>  \u041d\u0430\u0442\u0438\u0432\u043d\u044b\u0435, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 D, DFL \u0438 DGUI \u2014 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434 Windows.<br \/>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0433\u043e GUI \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u0430 \u043d\u0435 \u0442\u0430\u043a\u0430\u044f \u0443\u0436 \u0438 \u0433\u043b\u0443\u043f\u0430\u044f \u0437\u0430\u0442\u0435\u044f.<\/p>\n<h1>\u041d\u0430\u0447\u043d\u0435\u043c \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 Hello, World<\/h1>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 DlangUI, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 D (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"http:\/\/dlang.org\/download.html\">dmd<\/a>) \u0438 DUB (build tool \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439). \u0421\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0438\u0445, \u0435\u0441\u043b\u0438 \u0438\u0445 \u0435\u0449\u0435 \u043d\u0435\u0442.<br \/>  \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0432 \u043d\u0435\u0439 \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043b\u044f DUB \u2014 dub.json  <\/p>\n<pre><code class=\"javascript\">{     &quot;name&quot;: &quot;helloworld&quot;,     &quot;targetPath&quot;: &quot;bin&quot;,     &quot;targetName&quot;: &quot;helloworld&quot;,     &quot;targetType&quot;: &quot;executable&quot;,      &quot;dependencies&quot;: {         &quot;dlangui&quot;: &quot;~master&quot;,     } } <\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435, \u0432 \u043f\u043e\u0434\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 src \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0444\u0430\u0439\u043b src\/helloworld.d \u0441 \u0442\u0430\u043a\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<pre><code>module app; \/\/ \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 dlangui import dlangui;  \/\/ \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 main \u0438\u043b\u0438 WinMain \u0432 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b mixin APP_ENTRY_POINT; \/\/ \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 DlangUI - \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 main \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 extern (C) int UIAppMain(string[] args) {     \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043a\u043d\u043e     Window window = Platform.instance.createWindow(&quot;DlangUI example - HelloWorld&quot;, null);     \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0435\u0435 \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u0438\u0434\u0436\u0435\u0442 \u043e\u043a\u043d\u0430     window.mainWidget = (new Button()).text(&quot;Hello, world!&quot;d).margins(Rect(20,20,20,20));     \/\/ \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u043a\u043d\u043e     window.show();     \/\/ \u0446\u0438\u043a\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439     return Platform.instance.enterMessageLoop(); } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0412 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 dub.json \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"bash\">dub run <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f. \u041e\u043a\u043d\u043e \u0441 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439:<br \/>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/60b\/863\/627\/60b863627c244ca79d28a868b4518638.png\"\/><\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0437 dlangui (\u0434\u0435\u043c\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 example1 \u0438 \u0438\u0433\u0440\u0430 tetris):<\/p>\n<pre><code class=\"bash\">dub fetch dlangui dub run dlangui:example1 dub run dlangui:tetris <\/code><\/pre>\n<p>  \u0415\u0449\u0435 \u043e\u0434\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u2014 DlangIDE:<\/p>\n<pre><code class=\"bash\">dub fetch dlangide dub run dlangide <\/code><\/pre>\n<h1>Widgets &#038; Layouts<\/h1>\n<p>  \u0423\u0441\u043b\u043e\u0436\u043d\u0438\u043c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432.<\/p>\n<p>  \u0411\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b:<\/p>\n<ul>\n<li>TextWidget \u2014 \u0442\u0435\u043a\u0441\u0442<\/li>\n<li>Button \u2014 \u043a\u043d\u043e\u043f\u043a\u0430 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c<\/li>\n<li>ImageButton \u2014 \u043a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439<\/li>\n<li>ImageTextButton \u2014 \u043a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439 \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u043c<\/li>\n<li>CheckBox \u2014 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f<\/li>\n<li>RadioButton \u2014 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f<\/li>\n<li>ImageWidget \u2014 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430<\/li>\n<li>EditLine \u2014 \u043e\u0434\u043d\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440<\/li>\n<li>ComboBox \u2014 \u043a\u043e\u043c\u0431\u043e\u0431\u043e\u043a\u0441 \u2014 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430<\/li>\n<\/ul>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438:<\/p>\n<pre><code>auto btn = new Button(&quot;btn1&quot;, &quot;Button 1&quot;d); <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u00abbtn1\u00bb \u2014 \u044d\u0442\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0432\u0438\u0434\u0436\u0435\u0442\u0430, \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0435\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u0432\u0438\u0434\u0436\u0435\u0442\u0435 \u0438\u043b\u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0432\u0438\u0434\u0436\u0435\u0442 \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0432 \u043e\u0431\u0449\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<p>  \u00abButton 1\u00bbd \u2014 \u0442\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u0443\u0444\u0444\u0438\u043a\u0441 d \u2014 \u044d\u0442\u043e utf32 \u2014 dstring. \u041e\u0431\u044b\u0447\u043d\u043e \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 DlangUI \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0430\u043c \u0442\u0435\u043a\u0441\u0442 \u2014 \u043a\u0430\u043a utf32 dstring, \u0438\u043b\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 string \u2014 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f\u0437\u044b\u043a\u043e\u0432.<\/p>\n<p>  \u0412\u0438\u0434\u0436\u0435\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b.<br \/>  Layouts \u2014 \u0432\u0438\u0434\u0436\u0435\u0442\u044b-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0434\u043b\u044f \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432. \u041f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 Android UI:<\/p>\n<ul>\n<li>VerticalLayout \u2014 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438<\/li>\n<li>HorizontalLayout \u2014 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438<\/li>\n<li>TableLayout \u2014 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432, \u043a\u0430\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435<\/li>\n<\/ul>\n<p>  \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 VerticalLayout \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043d\u0435\u0433\u043e \u043f\u0430\u0440\u044b \u043a\u043d\u043e\u043f\u043e\u043a:<\/p>\n<pre><code>    auto vlayout = new VerticalLayout(); \/\/ \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438     vlayout.addChild(new RadioButton(&quot;radio1&quot;, &quot;Radio Button 1&quot;d));     vlayout.addChild(new RadioButton(&quot;radio2&quot;, &quot;Radio Button 2&quot;d)); <\/code><\/pre>\n<p>  \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u043d\u0430\u0448 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0444\u043e\u0440\u043c\u0443 \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439.  <\/p>\n<pre><code>module app; \/\/ \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 dlangui import dlangui;  \/\/ \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 main \u0438\u043b\u0438 WinMain \u0432 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b mixin APP_ENTRY_POINT; \/\/ \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 DlangUI - \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 main \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 extern (C) int UIAppMain(string[] args) {     \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043a\u043d\u043e     Window window = Platform.instance.createWindow(&quot;DlangUI example - HelloWorld&quot;, null);      \/\/ \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u0438\u0434\u0436\u0435\u0442 \u043e\u043a\u043d\u0430 - \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438     auto mainWidget = new VerticalLayout();      mainWidget.addChild(new TextWidget(null, &quot;\u043f\u0440\u0438\u043c\u0435\u0440 HorizontalLayout:&quot;d)); \/\/ \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a      auto hlayout = new HorizontalLayout(); \/\/ \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438     hlayout.addChild(new Button(&quot;btn1&quot;, &quot;\u041a\u043d\u043e\u043f\u043a\u0430 1&quot;d));     hlayout.addChild(new Button(&quot;btn2&quot;, &quot;\u041a\u043d\u043e\u043f\u043a\u0430 2&quot;d));     hlayout.addChild(new Button(&quot;btn3&quot;, &quot;\u041a\u043d\u043e\u043f\u043a\u0430 3&quot;d));     hlayout.addChild(new CheckBox(&quot;btn4&quot;, &quot;\u041f\u0440\u0438\u043c\u0435\u0440 CheckBox&quot;d));     mainWidget.addChild(hlayout);      mainWidget.addChild(new TextWidget(null, &quot;\u043f\u0440\u0438\u043c\u0435\u0440 VerticalLayout:&quot;d)); \/\/ \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a      auto vlayout = new VerticalLayout(); \/\/ \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438     vlayout.addChild(new RadioButton(&quot;radio1&quot;, &quot;Radio Button 1&quot;d));     vlayout.addChild(new RadioButton(&quot;radio2&quot;, &quot;Radio Button 2&quot;d));     vlayout.addChild(new RadioButton(&quot;radio3&quot;, &quot;Radio Button 3&quot;d));     mainWidget.addChild(vlayout);      mainWidget.addChild(new TextWidget(null, &quot;\u043f\u0440\u0438\u043c\u0435\u0440 TableLayout - \u0444\u043e\u0440\u043c\u0430 \u0441 2 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c\u0438:&quot;d)); \/\/ \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a      auto tlayout = new TableLayout(); \/\/ \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \/ \u0444\u043e\u0440\u043c\u0430     tlayout.colCount = 2;     tlayout.addChild(new TextWidget(null, &quot;\u0421\u0442\u0440\u043e\u043a\u0430 \u0432\u0432\u043e\u0434\u0430&quot;d));     tlayout.addChild(new EditLine(&quot;edit1&quot;, &quot;\u041a\u0430\u043a\u043e\u0439-\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f&quot;d));     tlayout.addChild(new TextWidget(null, &quot;ComboBox&quot;d));     tlayout.addChild((new ComboBox(&quot;combo1&quot;, [&quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1&quot;d, &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 2&quot;d, &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 3&quot;d])).selectedItemIndex(0));     tlayout.addChild(new TextWidget(null, &quot;\u0413\u0440\u0443\u043f\u043f\u0430 RadioButton&quot;d));     \/\/ \u0432\u043d\u0443\u0442\u0440\u0438 Layout \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 Layout:     auto radiogroup = new VerticalLayout();     radiogroup.addChild(new RadioButton(&quot;rb1&quot;, &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1&quot;d));     radiogroup.addChild(new RadioButton(&quot;rb2&quot;, &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 2&quot;d));     radiogroup.addChild(new RadioButton(&quot;rb3&quot;, &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 3&quot;d));     tlayout.addChild(radiogroup);     tlayout.addChild(new TextWidget(null, &quot;\u041a\u043d\u043e\u043f\u043a\u0430 ImageTextButton&quot;d));     tlayout.addChild(new ImageTextButton(&quot;btn_ok&quot;, &quot;dialog-ok-apply&quot;, &quot;\u0422\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438&quot;d));      mainWidget.addChild(tlayout);      \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0435\u0435 \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u0438\u0434\u0436\u0435\u0442 \u043e\u043a\u043d\u0430     window.mainWidget = mainWidget;     \/\/ \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u043a\u043d\u043e     window.show();     \/\/ \u0446\u0438\u043a\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439     return Platform.instance.enterMessageLoop(); } <\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<br \/>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/f49\/998\/598\/f499985982d8441eaab772d2c70b9cac.png\"\/><\/p>\n<h1>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 (\u0441\u043e\u0431\u044b\u0442\u0438\u0439) \u043e\u0442 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432<\/h1>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 onClick<\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u2014 \u043f\u0443\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0442\u0435\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<p>  \u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u0435\u043d\u044f\u0435\u043c \u043a\u0443\u0441\u043e\u043a \u043a\u043e\u0434\u0430 \u0441 RadioButton \u0432 VerticalLayout.<\/p>\n<pre><code>    mainWidget.addChild(new TextWidget(null, &quot;\u0412\u044b\u0431\u043e\u0440 \u0442\u0435\u043c\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430:&quot;d));      auto vlayout = new VerticalLayout();     \/\/ addChild() \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432\u0438\u0436\u0435\u0442, \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0441\u0430\u043c \u0432\u0438\u0434\u0436\u0435\u0442,      \/\/ \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435.     vlayout.addChild(new RadioButton(&quot;radio1&quot;, &quot;\u041e\u0431\u044b\u0447\u043d\u0430\u044f&quot;d)).checked(true).onClickListener = delegate(Widget src) {         platform.instance.uiTheme = &quot;theme_default&quot;;         return true;     };     vlayout.addChild(new RadioButton(&quot;radio2&quot;, &quot;\u0422\u0451\u043c\u043d\u0430\u044f&quot;d)).onClickListener = delegate(Widget src) {         platform.instance.uiTheme = &quot;theme_dark&quot;;         return true;     };     mainWidget.addChild(vlayout); <\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<br \/>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/33f\/f7d\/af4\/33ff7daf4782497595b84569bb81ca25.png\"\/><\/p>\n<p>  \u041f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f:<\/p>\n<p>  onClickListener \u2014 \u0441\u0438\u0433\u043d\u0430\u043b, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0432 \u043b\u044e\u0431\u043e\u043c \u0432\u0438\u0434\u0436\u0435\u0442\u0435.\u0412\u043e\u0442 \u043a\u0430\u043a \u043e\u043d \u043e\u043f\u0438\u0441\u0430\u043d:<\/p>\n<pre><code>\/\/\/ interface - slot for onClick interface OnClickHandler {     bool onClick(Widget source); } \/\/..... class Widget { \/\/...     Signal!OnClickHandler onClickListener; \/\/... } <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0436\u0438\u0442\u044c \u0434\u0435\u043b\u0435\u0433\u0430\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0442\u0438\u043f\u0430.<\/p>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e \u0440\u0430\u0437\u043d\u043e\u043c\u0443.<br \/>  \u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0447\u0438\u043a\u0430 onClick \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0434\u0435\u043b\u0435\u0433\u0430\u0442  <\/p>\n<pre><code>    auto button1 = new Button(&quot;btn1&quot;, &quot;\u041a\u043d\u043e\u043f\u043a\u0430 1&quot;d);     button1.onClickListener = delegate(Widget src) {         window.showMessageBox(UIString(&quot;\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a onClick&quot;d), UIString(&quot;\u0412\u044b\u0437\u0432\u0430\u043d\\ndelegate&quot;d));         return true;     }; <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0447\u0438\u043a\u0430 onClick \u2014 \u043c\u0435\u0442\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430  <\/p>\n<pre><code>    class MyOnClickHandler1 {         bool onButtonClick(Widget src) {             src.window.showMessageBox(UIString(&quot;\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a onClick&quot;d),                  UIString(&quot;\u0412\u044b\u0437\u0432\u0430\u043d MyOnClickHandler1.onClick\\n\u0438\u0437 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0441 id=&quot;d ~ to!dstring(src.id)));             return true;         }     }     auto memberFunctionHandler = new MyOnClickHandler1();     auto button2 = new Button(&quot;btn2&quot;, &quot;\u041a\u043d\u043e\u043f\u043a\u0430 2&quot;d);     button2.onClickListener = &memberFunctionHandler.onButtonClick;     hlayout.addChild(button2); <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0447\u0438\u043a\u0430 onClick \u2014 \u043a\u043b\u0430\u0441\u0441, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430  <\/p>\n<pre><code>    \/\/ \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0447\u0438\u043a\u0430 onClick - \u043a\u043b\u0430\u0441\u0441, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0438\u0433\u043d\u0430\u043b\u0430     class MyOnClickHandler2 : OnClickHandler {         override bool onClick(Widget src) {             src.window.showMessageBox(UIString(&quot;\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a onClick&quot;d),                        UIString(&quot;\u0412\u044b\u0437\u0432\u0430\u043d MyOnClickHandler2.onClick\\n\u0438\u0437 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0441 id=&quot;d ~ to!dstring(src.id)));             return true;         }     }     auto interfaceHandler = new MyOnClickHandler2();     auto button4 = new Button(&quot;btn4&quot;, &quot;\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 4&quot;d);     button2.onClickListener = interfaceHandler; \/\/ \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 onClick \u0431\u0443\u0434\u0435\u0442 \u0432\u0437\u044f\u0442 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 OnClickHandler <\/code><\/pre>\n<p>  \u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 Widget:  <\/p>\n<ul>\n<li>onCheckChangeListener \u2014 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 checked \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f CheckBox, RadioButton)<\/li>\n<li>onFocusChangeListener \u2014 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0444\u043e\u043a\u0443\u0441\u0430 \u044d\u0442\u043e\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u0430<\/li>\n<li>onKeyListener \u2014 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b<\/li>\n<li>onMouseListener \u2014 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043c\u044b\u0448\u0438<\/li>\n<\/ul>\n<p>  <\/p>\n<h1>\u0427\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u0430<\/h1>\n<p>  <\/p>\n<ul>\n<li>margins \u2014 \u043e\u0442\u0441\u0442\u0443\u043f \u043e\u0442 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u0438\u043b\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 (\u0444\u043e\u043d \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0440\u0438\u0441\u0443\u0435\u0442\u0441\u044f \u0441 \u043e\u0442\u0441\u0442\u0443\u043f\u043e\u043c \u043d\u0430 margins)<\/li>\n<li>padding \u2014 \u043e\u0442\u0441\u0442\u0443\u043f \u043e\u0442 \u0433\u0440\u0430\u043d\u0438\u0446 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0434\u043e \u0435\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432<\/li>\n<li>backgroundColor \u2014 \u0446\u0432\u0435\u0442 \u0444\u043e\u043d\u0430 (32 bit uint, 0xAARRGGBB)<\/li>\n<li>backgroundImageId \u2014 \u0444\u043e\u043d\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u2014 id \u0440\u0435\u0441\u0443\u0440\u0441\u0430<\/li>\n<li>textColor \u2014 \u0446\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430 (32 bit uint, 0xAARRGGBB)<\/li>\n<li>fontSize \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430<\/li>\n<\/ul>\n<p>  \u042d\u0442\u0438 \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0442\u0430\u043a \u0438 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0438\u043b\u0435\u0439 (\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 \u2014 \u0442\u0435\u043c\u0435).<br \/>  \u041d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 styleId. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u043c \u0441\u0442\u0438\u043b\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0443 \u0432\u044b\u0431\u043e\u0440\u0430 \u0442\u0435\u043c\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.  <\/p>\n<pre><code>    mainWidget.addChild(new TextWidget(null, &quot;\u0412\u044b\u0431\u043e\u0440 \u0442\u0435\u043c\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430:&quot;d)).styleId(&quot;POPUP_MENU&quot;); <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440: \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u0442\u0441\u0442\u0443\u043f\u043e\u0432 \u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0436\u0435\u0442\u0443 \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0435\u043c\u0443 \u043f\u043e\u043b\u0443\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439 \u0436\u0435\u043b\u0442\u044b\u0439 \u0444\u043e\u043d.  <\/p>\n<pre><code>    \/\/ \u043e\u0442\u0441\u0442\u0443\u043f \u043e\u0442 \u0433\u0440\u0430\u043d\u0438\u0446 \u043e\u043a\u043d\u0430 \u043d\u0430 10 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u0442\u0441\u0442\u0443\u043f\u043e\u043c 15 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439     mainWidget.margins(Rect(10, 10, 10, 10)).padding(Rect(15, 15, 15, 15));     mainWidget.backgroundColor(0xC0FFFF00); \/\/ \u043f\u043e\u043b\u0443\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439 \u0436\u0435\u043b\u0442\u044b\u0439 \u0444\u043e\u043d <\/code><\/pre>\n<p>  \u0423 TableLayout \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u043c \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439 \u00abbtn_default.png\u00bb. Id \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u2014 \u044d\u0442\u043e \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0431\u0435\u0437 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f. \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f .9.png \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 nine-patch \u2014 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u0438\u0437\u043b\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043a\u0430\u043a \u0432 <a href=\"http:\/\/habrahabr.ru\/post\/113623\/\">Android<\/a>.<br \/>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0430\u043a\u0436\u0435 padding \u2014 \u043e\u0442\u0441\u0442\u0443\u043f \u0434\u043b\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432.  <\/p>\n<pre><code>    tlayout.backgroundImageId(&quot;btn_default&quot;); \/\/ \u0444\u043e\u043d \u043e\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 - btn_default.9.png \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432     tlayout.padding(Rect(5, 5, 5, 5)); \/\/ \u043e\u0442\u0441\u0442\u0443\u043f \u0434\u043b\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 - 5 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 <\/code><\/pre>\n<p>  \u0412 TextWidget \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0434\u043b\u044f TableLayout \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0438 \u0446\u0432\u0435\u0442 \u0448\u0440\u0438\u0444\u0442\u0430.  <\/p>\n<pre><code>    tlayout.backgroundImageId(&quot;btn_default&quot;); \/\/ \u0444\u043e\u043d \u043e\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 - btn_default.9.png \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432     tlayout.padding(Rect(5, 5, 5, 5)); \/\/ \u043e\u0442\u0441\u0442\u0443\u043f \u0434\u043b\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 - 5 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 <\/code><\/pre>\n<p>  \u0412\u043e\u0442, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<br \/>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/d4c\/a20\/9b1\/d4ca209b1c03498d8c38ba456e2e7307.png\"\/>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043e\u0434 helloworld.d:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>module app; \/\/ \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 dlangui import dlangui;  \/\/ \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 main \u0438\u043b\u0438 WinMain \u0432 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b mixin APP_ENTRY_POINT; \/\/ \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 DlangUI - \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 main \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 extern (C) int UIAppMain(string[] args) {     \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u0441 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c, \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 - 800x600     Window window = Platform.instance.createWindow(&quot;DlangUI example - HelloWorld&quot;, null, WindowFlag.Resizable, 600, 400);      \/\/ \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u0438\u0434\u0436\u0435\u0442 \u043e\u043a\u043d\u0430 - \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438     auto mainWidget = new VerticalLayout();     \/\/ \u043e\u0442\u0441\u0442\u0443\u043f \u043e\u0442 \u0433\u0440\u0430\u043d\u0438\u0446 \u043e\u043a\u043d\u0430 \u043d\u0430 10 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u0442\u0441\u0442\u0443\u043f\u043e\u043c 15 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439     mainWidget.margins(Rect(10, 10, 10, 10)).padding(Rect(15, 15, 15, 15));     mainWidget.backgroundColor(0xC0FFFF00); \/\/ \u043f\u043e\u043b\u0443\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439 \u0436\u0435\u043b\u0442\u044b\u0439 \u0444\u043e\u043d      mainWidget.addChild(new TextWidget(null, &quot;\u043f\u0440\u0438\u043c\u0435\u0440 HorizontalLayout:&quot;d)); \/\/ \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a      auto hlayout = new HorizontalLayout(); \/\/ \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438     \/\/ \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0447\u0438\u043a\u0430 onClick - \u0434\u0435\u043b\u0435\u0433\u0430\u0442     auto button1 = new Button(&quot;btn1&quot;, &quot;\u041a\u043d\u043e\u043f\u043a\u0430 1&quot;d);     button1.onClickListener = delegate(Widget src) {         window.showMessageBox(UIString(&quot;\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a onClick&quot;d), UIString(&quot;\u0412\u044b\u0437\u0432\u0430\u043d\\ndelegate&quot;d));         return true;     };     hlayout.addChild(button1);         \/\/ \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0447\u0438\u043a\u0430 onClick - \u043c\u0435\u0442\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430     class MyOnClickHandler1 {         bool onButtonClick(Widget src) {             src.window.showMessageBox(UIString(&quot;\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a onClick&quot;d),                  UIString(&quot;\u0412\u044b\u0437\u0432\u0430\u043d MyOnClickHandler1.onClick\\n\u0438\u0437 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0441 id=&quot;d ~ to!dstring(src.id)));             return true;         }     }     auto memberFunctionHandler = new MyOnClickHandler1();     auto button2 = new Button(&quot;btn2&quot;, &quot;\u041a\u043d\u043e\u043f\u043a\u0430 2&quot;d);     button2.onClickListener = &memberFunctionHandler.onButtonClick;     hlayout.addChild(button2);      \/\/ \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432     hlayout.addChild(new Button(&quot;btn3&quot;, &quot;\u041a\u043d\u043e\u043f\u043a\u0430 3&quot;d)).onClickListener = &memberFunctionHandler.onButtonClick;      \/\/ \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0447\u0438\u043a\u0430 onClick - \u043a\u043b\u0430\u0441\u0441, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0438\u0433\u043d\u0430\u043b\u0430     class MyOnClickHandler2 : OnClickHandler {         override bool onClick(Widget src) {             src.window.showMessageBox(UIString(&quot;\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a onClick&quot;d),                  UIString(&quot;\u0412\u044b\u0437\u0432\u0430\u043d MyOnClickHandler2.onClick\\n\u0438\u0437 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0441 id=&quot;d ~ to!dstring(src.id)));             return true;         }     }     auto interfaceHandler = new MyOnClickHandler2();     auto button4 = new Button(&quot;btn4&quot;, &quot;\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 4&quot;d);     button2.onClickListener = interfaceHandler; \/\/ \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 onClick \u0431\u0443\u0434\u0435\u0442 \u0432\u0437\u044f\u0442 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 OnClickHandler     hlayout.addChild(button4);          mainWidget.addChild(hlayout);      mainWidget.addChild(new TextWidget(null, &quot;\u0412\u044b\u0431\u043e\u0440 \u0442\u0435\u043c\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430:&quot;d)).styleId(&quot;POPUP_MENU&quot;);      auto vlayout = new VerticalLayout();     vlayout.addChild(new RadioButton(&quot;radio1&quot;, &quot;\u041e\u0431\u044b\u0447\u043d\u0430\u044f&quot;d)).checked(true).onClickListener = delegate(Widget src) {         platform.instance.uiTheme = &quot;theme_default&quot;;         return true;     };     vlayout.addChild(new RadioButton(&quot;radio2&quot;, &quot;\u0422\u0451\u043c\u043d\u0430\u044f&quot;d)).onClickListener = delegate(Widget src) {         platform.instance.uiTheme = &quot;theme_dark&quot;;         return true;     };     mainWidget.addChild(vlayout);      \/\/ \u0432 \u044d\u0442\u043e\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u043c \u0446\u0432\u0435\u0442 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430, \u0438 \u0432\u044b\u0440\u043e\u0432\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438 \u0432\u043f\u0440\u0430\u0432\u043e     mainWidget.addChild(new TextWidget(null, &quot;\u043f\u0440\u0438\u043c\u0435\u0440 TableLayout - \u0444\u043e\u0440\u043c\u0430 \u0441 2 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c\u0438:&quot;d)).textColor(0xC00000).fontSize(26).alignment(Align.Right);      auto tlayout = new TableLayout(); \/\/ \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \/ \u0444\u043e\u0440\u043c\u0430     tlayout.backgroundImageId(&quot;btn_default&quot;); \/\/ \u0444\u043e\u043d \u043e\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 - btn_default.9.png \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432     tlayout.padding(Rect(5, 5, 5, 5)); \/\/ \u043e\u0442\u0441\u0442\u0443\u043f \u0434\u043b\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 - 5 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439     tlayout.colCount = 2;     tlayout.addChild(new TextWidget(null, &quot;\u0421\u0442\u0440\u043e\u043a\u0430 \u0432\u0432\u043e\u0434\u0430&quot;d));     tlayout.addChild(new EditLine(&quot;edit1&quot;, &quot;\u041a\u0430\u043a\u043e\u0439-\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f&quot;d));     tlayout.addChild(new TextWidget(null, &quot;ComboBox&quot;d));     tlayout.addChild((new ComboBox(&quot;combo1&quot;, [&quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1&quot;d, &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 2&quot;d, &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 3&quot;d])).selectedItemIndex(0));     tlayout.addChild(new TextWidget(null, &quot;\u0413\u0440\u0443\u043f\u043f\u0430 RadioButton&quot;d));     \/\/ \u0432\u043d\u0443\u0442\u0440\u0438 Layout \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 Layout:     auto radiogroup = new VerticalLayout();     radiogroup.addChild(new RadioButton(&quot;rb1&quot;, &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1&quot;d));     radiogroup.addChild(new RadioButton(&quot;rb2&quot;, &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 2&quot;d));     radiogroup.addChild(new RadioButton(&quot;rb3&quot;, &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 3&quot;d));     tlayout.addChild(radiogroup);     tlayout.addChild(new TextWidget(null, &quot;\u041a\u043d\u043e\u043f\u043a\u0430 ImageTextButton&quot;d));     tlayout.addChild(new ImageTextButton(&quot;btn_ok&quot;, &quot;dialog-ok-apply&quot;, &quot;\u0422\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438&quot;d));      mainWidget.addChild(tlayout);      \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0435\u0435 \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u0438\u0434\u0436\u0435\u0442 \u043e\u043a\u043d\u0430     window.mainWidget = mainWidget;     \/\/ \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u043a\u043d\u043e     window.show();     \/\/ \u0446\u0438\u043a\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439     return Platform.instance.enterMessageLoop(); } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u042d\u0442\u0430 \u0436\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u0430\u044f \u043d\u0430 Ubuntu: \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u043c\u043a\u0430 \u043e\u043a\u043d\u0430 \u0438 \u0448\u0440\u0438\u0444\u0442\u044b.<br \/>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/cec\/bc4\/ce0\/cecbc4ce03df4dfba26fad3eef886363.png\"\/><\/p>\n<p>  \u0420\u0430\u0437\u043c\u0435\u0440 helloworld.exe, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e dmd2 \u043f\u043e\u0434 windows (dub build &#8212;build=release) \u2014 1.4Mb, \u0438\u0437 \u043d\u0438\u0445 200K \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b.<br \/>  \u041f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 libfreetype-6.dll (700K) \u0438 zlib1.dll (84K) \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f DUB \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e bin \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 FreeType \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0448\u0440\u0438\u0444\u0442\u043e\u0432, \u0438\u043d\u0430\u0447\u0435 \u2014 win32 API.<\/p>\n<p>  \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432 Ubuntu x64 c \u043f\u043e\u043c\u043e\u0449\u044c\u044e dmd \u2014 4Mb.<\/p>\n<h1>\u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b<\/h1>\n<p>  <\/p>\n<ul>\n<li>EditBox \u2014 \u043c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440<\/li>\n<li>TreeWidget \u2014 \u0434\u0435\u0440\u0435\u0432\u043e<\/li>\n<li>StringGrid \u2014 \u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043f\u043e\u0445\u043e\u0436\u0430\u044f \u043d\u0430 Excel<\/li>\n<li>TabWidget \u2014 \u0442\u0430\u0431\u044b \u2014 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446<\/li>\n<li>AppFrame \u2014 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u043e\u043a\u043d\u0430 \u0441 \u043c\u0435\u043d\u044e, \u0442\u0443\u043b\u0431\u0430\u0440\u0430\u043c\u0438 \u0438 \u0441\u0442\u0441\u0442\u0443\u0441-\u0441\u0442\u0440\u043e\u043a\u043e\u0439, \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/li>\n<li>ScrollBar<\/li>\n<li>ToolBar<\/li>\n<li>StatusLine<\/li>\n<li>ScrollWidget \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u0430, \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u044e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e<\/li>\n<li>DockHost, DockWidget \u2014 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u0434\u043e\u043a-\u0432\u0438\u0434\u0436\u0435\u0442\u0430\u043c\u0438 \u043f\u043e \u043a\u0440\u0430\u044f\u043c \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u043e\u043a\u043d\u0430 (\u043a\u0430\u043a \u0432 IDE)<\/li>\n<\/ul>\n<h1>\u0421\u0441\u044b\u043b\u043a\u0438<\/h1>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/buggins\/dlangui\">\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 GitHub<\/a><\/li>\n<li><a href=\"http:\/\/buggins.github.io\/dlangui\/ddox\/\">\u041e\u043d\u043b\u0430\u0439\u043d \u2014 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/buggins\/dlangui\/issues\">\u0411\u0430\u0433\u0442\u0440\u0435\u043a\u0435\u0440<\/a><\/li>\n<li><a href=\"http:\/\/buggins.github.io\/dlangui\/screenshots.html\">\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/buggins\/dlangide\">\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 DlangIDE \u043d\u0430 GitHub<\/a><\/li>\n<li><a href=\"https:\/\/gitter.im\/buggins\/dlangui\">\u0427\u0430\u0442 \u0432 Gitter<\/a><\/li>\n<\/ul>\n<h1>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442&#8230;<\/h1>\n<p>  \u041d\u0443\u0436\u043d\u0430 \u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0447\u0430\u0441\u0442\u044c? \u041e \u0447\u0435\u043c \u0435\u0449\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c? \u041f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0445\u2026<\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/253923\/\"> http:\/\/habrahabr.ru\/post\/253923\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>     \t\u041c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u044f\u0437\u044b\u043a D. \u0414\u0430\u0432\u043d\u043e \u0441\u043b\u0435\u0436\u0443 \u0437\u0430 \u0435\u0433\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c. \u0414\u043b\u044f D \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e GUI \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u043e\u0432, \u043d\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0437\u043e\u0431\u0440\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434.<br \/>  \u0425\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0441\u0432\u043e\u0451\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <a href=\"https:\/\/github.com\/buggins\/dlangui\">DlangUI<\/a>. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u043e\u043d \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d.<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/54f\/b63\/b5a\/54fb63b5a87749e18bfb6f0777fc2c08.png\"\/><\/p>\n<p>  \u041d\u0430 \u041a\u0414\u041f\u0412 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 DlangIDE \u2014 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 DlangUI.<\/p>\n<h2>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438:<\/h2>\n<ul>\n<li>\u041a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u2014 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f Windows, Linux, Mac OSX; \u043b\u0435\u0433\u043a\u043e\u0441\u0442\u044c \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b<\/li>\n<li>\u041d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 D \u2014 \u043b\u0435\u0433\u043a\u043e\u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u044b\u0439<\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Layouts \u0434\u043b\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430<\/li>\n<li>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0448\u0440\u0438\u0444\u0442\u043e\u0432 \u0438 \u0438\u043a\u043e\u043d\u043e\u043a \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430<\/li>\n<li>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Unicode<\/li>\n<li>\u0418\u043d\u0442\u0435\u0440\u043d\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u2014 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 UI \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f\u0437\u044b\u043a\u043e\u0432<\/li>\n<li>\u0410\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e OpenGL (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/li>\n<li>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u043f\u043e\u0432\u0435\u0440\u0445 OpenGL \u0441\u0446\u0435\u043d\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f UI \u0432 \u0438\u0433\u0440\u0435)<\/li>\n<li>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430<\/li>\n<li>\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0435\u043c (\u0434\u0432\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0442\u0435\u043c\u044b \u2014 \u0441\u0432\u0435\u0442\u043b\u0430\u044f \u0438 \u0442\u0435\u043c\u043d\u0430\u044f)<\/li>\n<li>\u0412\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b<\/li>\n<li>\u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434, \u043f\u043e\u0434 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439 Boost License 1.0<\/li>\n<\/ul>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-253768","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/253768","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=253768"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/253768\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=253768"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=253768"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=253768"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}