WinBinder PHP. Создаём GUI-интерфейс за 2 клика::Журнал СА 1.2009
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Подписка
Архив номеров
Где купить
Наука и технологии
Авторам
Рекламодателям
Контакты
   

  Опросы
  Статьи

Событие  

В банке рассола ждет сисадмина с полей фрактал-кукумбер

Читайте впечатления о слете ДСА 2024, рассказанные волонтером и участником слета

 Читать далее...

Организация бесперебойной работы  

Бесперебойная работа ИТ-инфраструктуры в режиме 24/7 Как обеспечить ее в нынешних условиях?

Год назад ИТ-компания «Крок» провела исследование «Ключевые тренды сервисного рынка 2023». Результаты

 Читать далее...

Книжная полка  

Читайте и познавайте мир технологий!

Издательство «БХВ» продолжает радовать выпуском интересных и полезных, к тому же прекрасно

 Читать далее...

СУБД PostgreSQL  

СУБД Postgres Pro

Сертификация по новым требованиям ФСТЭК и роль администратора без доступа к данным

 Читать далее...

Критическая инфраструктура  

КИИ для оператора связи. Готовы ли компании к повышению уровня кибербезопасности?

Похоже, что провайдеры и операторы связи начали забывать о требованиях законодательства

 Читать далее...

Архитектура ПО  

Архитектурные метрики. Качество архитектуры и способность системы к эволюционированию

Обычно соответствие программного продукта требованиям мы проверяем через скоуп вполне себе понятных

 Читать далее...

Как хорошо вы это знаете  

Что вам известно о разработках компании ARinteg?

Компания ARinteg (ООО «АРинтег») – системный интегратор на российском рынке ИБ –

 Читать далее...

Графические редакторы  

Рисование абстрактных гор в стиле Paper Cut

Векторный графический редактор Inkscape – яркий представитель той прослойки open source, с

 Читать далее...

День сисадмина  

Учите матчасть! Или как стать системным администратором

Лето – время не только отпусков, но и хорошая возможность определиться с профессией

 Читать далее...

День сисадмина  

Живой айтишник – это всегда движение. Остановка смерти подобна

Наши авторы рассказывают о своем опыте и дают советы начинающим системным администраторам.

 Читать далее...

Виртуализация  

Рынок решений для виртуализации

По данным «Обзора российского рынка инфраструктурного ПО и перспектив его развития», сделанного

 Читать далее...

Книжная полка  

Как стать креативным и востребованным

Издательский дом «Питер» предлагает новинки компьютерной литературы, а также книги по бизнесу

 Читать далее...

Книжная полка  

От создания сайтов до разработки и реализации API

В издательстве «БХВ» недавно вышли книги, которые будут интересны системным администраторам, создателям

 Читать далее...

Разбор полетов  

Ошибок опыт трудный

Как часто мы легко повторяем, что не надо бояться совершать ошибки, мол,

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 6195
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 6903
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

12.03.2018г.
Просмотров: 4188
Комментарии: 0
Глубокое обучение с точки зрения практика

 Читать далее...

12.03.2018г.
Просмотров: 2989
Комментарии: 0
Изучаем pandas

 Читать далее...

12.03.2018г.
Просмотров: 3795
Комментарии: 0
Программирование на языке Rust (Цветное издание)

 Читать далее...

19.12.2017г.
Просмотров: 3805
Комментарии: 0
Глубокое обучение

 Читать далее...

19.12.2017г.
Просмотров: 6299
Комментарии: 0
Анализ социальных медиа на Python

 Читать далее...

19.12.2017г.
Просмотров: 3152
Комментарии: 0
Основы блокчейна

 Читать далее...

19.12.2017г.
Просмотров: 3446
Комментарии: 0
Java 9. Полный обзор нововведений

 Читать далее...

16.02.2017г.
Просмотров: 7263
Комментарии: 0
Опоздавших не бывает, или книга о стеке

 Читать далее...

17.05.2016г.
Просмотров: 10628
Комментарии: 0
Теория вычислений для программистов

 Читать далее...

30.03.2015г.
Просмотров: 12352
Комментарии: 0
От математики к обобщенному программированию

 Читать далее...

18.02.2014г.
Просмотров: 13982
Комментарии: 0
Рецензия на книгу «Читаем Тьюринга»

 Читать далее...

13.02.2014г.
Просмотров: 9110
Комментарии: 0
Читайте, размышляйте, действуйте

 Читать далее...

12.02.2014г.
Просмотров: 7064
Комментарии: 0
Рисуем наши мысли

 Читать далее...

10.02.2014г.
Просмотров: 5375
Комментарии: 3
Страна в цифрах

 Читать далее...

18.12.2013г.
Просмотров: 4604
Комментарии: 0
Большие данные меняют нашу жизнь

 Читать далее...

18.12.2013г.
Просмотров: 3414
Комментарии: 0
Компьютерные технологии – корень зла для точки роста

 Читать далее...

04.12.2013г.
Просмотров: 3145
Комментарии: 0
Паутина в облаках

 Читать далее...

03.12.2013г.
Просмотров: 3392
Комментарии: 0
Рецензия на книгу «MongoDB в действии»

 Читать далее...

02.12.2013г.
Просмотров: 3013
Комментарии: 0
Не думай о минутах свысока

 Читать далее...

Друзья сайта  

 WinBinder PHP. Создаём GUI-интерфейс за 2 клика

Архив номеров / 2009 / Выпуск №1 (74) / WinBinder PHP. Создаём GUI-интерфейс за 2 клика

Рубрика: Программирование /  Программирование

Александр Майоров АЛЕКСАНДР МАЙОРОВ

WinBinder PHP
Создаём GUI-интерфейс за 2 клика

Сегодня уже никого не удивить инструментами для создания приложений с GUI-интерфейсом на скриптовых языках. PHP не исключение, и об этом были статьи, в частности, про PHP-GTK. Но не все знают, что кроме PHP-GTK существуют другие библиотеки, одна из которых – WinBinder.

Что это?

WinBinder – это библиотека для создания приложений с графическим интерфейсом на языке программирования PHP. Наверное, не стоит говорить о том, какое большое распространение получил этот язык в настоящее время. PHP является очень популярным языком сценариев, который используется главным образом для веб-разработок, но также набирает популярность как язык скриптов общего назначения. Надёжно укрепив свои позиции на серверах, теперь переходит в другие секторы, и десктопы не исключение. Об этом свидетельствует появление таких библиотек, как PHP-GTK, PHP-Qt и собственно WinBinder, о котором мы собрались поговорить.

Препарируем WinBinder

Давайте теперь детально рассмотрим, что из себя представляет фреймворк WinBinder. Это расширение для PHP с открытым исходным кодом. Оно позволяет PHP-программистам быстро и легко разрабатывать Windows-приложения. Среди основных особенностей WinBinder можно упомянуть непосредственное взаимодействие с программным интерфейсом операционной системы Microsoft Windows, небольшой размер конечных файлов приложений (при компиляции скриптов с помощью утилиты bamcompile), обширную базу всевозможных PHP-функций, возможность как объектноориентированного, так и процедурного программирования, а также удобство использования.

WinBinder состоит из DLL-библиотеки, которая фактически является PHP-расширением небольшого набора вспомогательных скриптов и файлов. На рис. 1 представлена схема работы приложения, написанного с использованием данного расширения.

Рисунок 1. Схема взаимодействия компонентов в приложении на WinBinder

Рисунок 1. Схема взаимодействия компонентов в приложении на WinBinder

Связь между компонентами в WinBinder реализована через механизм обратных вызовов. Windows-сообщения, генерируемые контроллерами и таймерами, транслируются в одиночные callback-события, которые можно легко перехватить в PHP-программе. Каждое сообщение имеет свой целочисленный идентификатор, по которому его можно идентифицировать.

Библиотека WinBinder фактически состоит из двух слоев, взаимодействующих между собой. Первый слой – это нижний уровень, называемый API-слоем. Данный слой напрямую связан с Windows API и предоставляет единый интерфейс для более высокоуровневого слоя – слоя PHP. Хотя функции на нижнем уровне представляют из себя обертки для Windows API вызовов, большинство из них являются больше чем просто обертки вокруг API. Они инкапсулируют работу Windows-функций и упрощают доступ к ним.

Например, Windows использует различные сообщения для установки числовых значений для таких компонент, как progress-bar, scroll-bar и т. д. И хотя существует явное сходство между этими элементами управления при генерации сообщений, их аргументы различны. Примеры генерации сообщений (см. таблицу).

Примеры генерации сообщений

Scroll bars SendMessage(hCtrl, SBM_SETPOS, (WPARAM)dwValue, TRUE);
Track bars SendMessage(hCtrl, TBM_SETPOS, TRUE, (LPARAM)(LONG)dwValue);
Progress bars SendMessage(hCtrl, PBM_SETPOS, (WPARAM)dwValue, 0);
Up/down controls SendMessage(hCtrl, UDM_SETPOS, 0, (LPARAM)MAKELONG((short)dwValue, 0));

Одна из целей WinBinder как раз заключается в том, чтобы изолировать программиста от всех этих сложностей, предоставляя функционал библиотеки. API-слой выполняет всю работу через единую функцию wbSetValue(), которая имеет единый интерфейс для управления всеми объектами. Эта функция, кстати, применима ко всем без исключения компонентам Windows, начиная от простых лэйблов и полей ввода и заканчивая такими сложными компонентами, как компоненты для форматированного вывода текста, пунктов меню и прочего, устраняя тем самым необходимость использовать функции для каждого класса (к примеру, это были бы функции wbSelect, wbCheck и т. д.).

Собственно второй слой, который мы уже упоминали выше, – это слой PHP, который эффективно связывает Windows API с Zend Engine, создавая новый набор пользовательских функций PHP. Многие из этих функций имеют префикс wb_, например, wb_set_value(), которую вам придется часто использовать для установки значения объектам.

Результатом двухслойной архитектуры WinBinder является набор простых и удобных в использовании функций, упрощающих работу с Windows API-интерфейсом. Например, чтобы присвоить иконку для окна приложения, нужно вызвать функцию wb_set_image(). Её прототип выглядит следующим образом:

bool wb_set_image (int wbobject, mixed source, int transparentcolor, int index, int param)

Достаточно передать идентификатор объекта и ресурс. В качестве ресурса может быть как графический файл, так и DLL-библиотека или исполняемый файл, содержащие в себе графические ресурсы (для этого указывается индекс ресурса внутри бинарного файла – index). Та же функция используется и для растровых изображений, применяемых к любому объекту, хоть списки, хоть проводник с деревом. Таким образом, программист освобождается от всех тонкостей работы с Windows API, с его множеством функций и сообщений, которые скрыты от глаз PHP-программиста.

Еще одним преимуществом такой архитектуры WinBinder является то, что можно создавать переплеты с другими скриптовыми языками программирования, заменив слой PHP на какой-то другой. В этом случае WinBinder будет действовать как основа, каркас, связывающий разнородные компоненты воедино.

Возможна даже замена Windows API-слоя, что позволит делать приложения для других операционных систем, отличных от Windows, но это только в теории. На практике вопросом на данный момент никто не занимается и это не входит в рамки развития проекта. Хотя никто не мешает вам подумать над этим, может быть, кто-то и заинтересуется. Все в ваших руках.

И опять, и снова да здравствует мир во всём мире!

Ну что же, мы разобрали, что такое WinBinder, давайте перейдем теперь к практической части. Библиотеку и нужные компоненты можно скачать с официального сайта http://winbinder.org. Этого достаточно, чтобы писать приложения, но есть одно «но». Как и в случае с PHP-GTK, на компьютере должен быть интепретатор PHP. И что же? Меняем шило на мыло? Не совсем. Да, WinBinder не кроссплатформенный, в отличие от того же PHP-GTK, но он более легок в освоении и программировании. В WinBinder есть графический редактор форм, который позволяет экспортировать их сразу в нативный PHP-код.

Но WinBinder мало чем отличался бы от аналогов, если бы не одна разработка от eXvision. Называется она miniPHP Studio. Эта студия представляет собой простой, но тем не менее удобный редактор PHP-кода, редактор ресурсов и компилятор кода в исполняемый файл. В качестве компилятора в ней используется bamcompile (http://www.bambalam.se/bamcompile). Это очень удобный и наиболее распространенный компилятор PHP в исполняемые exe-файлы. Скомпилированные бинарники сжимаются утилитой UPX (Ultimate Packer for eXecutables – упаковщик исполняемых файлов, поддерживающий несколько различных платформ и форматов файлов). На выходе получается компактная программка с графическим интерфейсом, написанная на PHP. Она готова к распространению, а главное, на компьютере пользователя не нужно что-то дополнительно устанавливать. Все необходимое уже будет включено в бинарный файл и готово к использованию. Также miniPHP Studio позволяет включать в исполняемый файл любой ресурс, будь то графический файл или текстовый, а также включать DLL-библиотеки и расширения PHP.

Теперь заходим на http://exvision.net. Качаем оттуда студию. Установка делается в 2 клика, так что нет смысла её расписывать. Запускаем студию и получаем главное окно – рабочий стол. Жмете в меню «Project -> New», задаете имя проекта, пусть у нас будет это Samag. После создания проекта будет сгенерирован главный файл MAIN. Слева вы увидите его. Надо заметить сразу, что это не обозреватель файлов, а проводник ресурсов. Все, что отображается в этом списке, будет скомпилировано в исполняемый файл. Имена ресурсов автоматически генерируются на основе реальных имен файлов. Из имени исключается все лишнее (точки, пробелы, прочее), и оно приводится к верхнему регистру.

Итак. С чего начнем? Банальный «Привет, мир!» нам стоит написать, чтобы быстро показать идеологию проектирования на WinBinder. Сделаем простое окно с текстом и кнопкой Show message (см. рис. 2).

Рисунок 2. Рабочий стол студии

Рисунок 2. Рабочий стол студии

Как и в PHP-GTK, чтобы создать форму, нужно описать ее, инициализировать библиотеку и прочее. Но WinBinder тем и хорош, что он позволяет создать форму за два клика. Открываем редактор форм (WinBinder Form Editor). Создаем форму, какую захотим. Давайте кинем на форму кнопку. Назовите её как-нибудь. Теперь выберите из пункта меню File: Export PHP Code. Сохраните форму в файл, к примеру, mainform.php. Далее можно пойти несколькими путями. Самый простой, но не самый правильный – это скопировать содержимое файла mainform.php в нашу открытую рабочую область (файл MAIN). У вас должно получиться:

<?php

 

/********************************************************

 

WINBINDER - form editor PHP file (generated automatically)

 

********************************************************/

 

// Control identifiers

if(!defined('IDC_PUSHBUTTON1002')) define('IDC_PUSHBUTTON1002', 1002);

 

// Create window

$winmain = wb_create_window(null, AppWindow, 'www.samag.ru', WBC_CENTER, WBC_CENTER, 317, 179, ?

0x00000000, 0);

 

// Insert controls

wb_create_control($winmain, PushButton, 'Show message', 105, 65, 90, 25, IDC_PUSHBUTTON1002, 0x00000000, 0, 0);

 

// End controls

?>

Этого, правда, недостаточно для запуска. Теперь нам надо инициализировать саму библиотеку, вызвав функцию wb_init() в самом начале файла. Далее нам надо написать и зарегистрировать функцию-обработчик для сообщений Windows. Выглядеть она может так:

// Main Window's processor

function main_events_handler($Sender, $id)

{

    switch($id)

    {

           case IDC_PUSHBUTTON1002:

                 wb_message_box($Sender, "Hello world!", "My first test programm");

                 break;

 

           case IDCLOSE:

                 wb_destroy_window($Sender);

                 break;

    }

}

Теперь регистрируем функцию через следующий вызов:

wb_set_handler($winmain, "main_events_handler");

И вызываем функцию wb_main_loop(), она создает главный цикл программы. Собственно все. Теперь запускаем программу кнопкой Preview project. Есть, правда, маленькое «но». Программа miniPHP Studio написана без разделения на потоки, поэтому при предварительной компиляции будет казаться, что студия повисла. На самом деле это не так. Кстати при компиляции всегда выскакивает окно с сообщением, что студия не может быть активна до окончания процесса компиляции. Делается это не очень быстро, но терпимо. Процесс сборки может достигать минуты, так что не спешите убивать процесс. Итак, делайте предварительную сборку приложения и смотрите, что у вас получилось. Если возникнут ошибки, то студия вам сообщит о них.

Полный исходный код нашего тестового приложения выглядит так (см. рис. 3):

<?php

 

wb_init();

 

/********************************************************

 

WINBINDER - form editor PHP file (generated automatically)

 

********************************************************/

 

// Control identifiers

if(!defined('IDC_PUSHBUTTON1002')) define('IDC_PUSHBUTTON1002', 1002);

 

// Create window

$winmain = wb_create_window(null, AppWindow, 'www.samag.ru', WBC_CENTER, WBC_CENTER, 317, 179, 0x00000000, 0);

wb_set_handler($winmain, "main_events_handler");

 

// Insert controls

wb_create_control($winmain, PushButton, 'Show message', 105, 65, 90, 25, IDC_PUSHBUTTON1002, 0x00000000, 0, 0);

 

// End controls

 

wb_main_loop();

 

// Main Window's processor

function main_events_handler($Sender, $id)

{

    switch($id)

    {

           case IDC_PUSHBUTTON1002:

                 wb_message_box($Sender, "Hello world!", "My first test programm");

                 break;

 

           case IDCLOSE:

                 wb_destroy_window($Sender);

                 break;

    }

}

 

?>

Проведем краткий разбор приложения. Вначале мы инициализировали библиотеку, вызвав wb_init(). Затем объявили константу IDC_PUSHBUTTON1002, присвоив ей значение 1002. Это целочисленный идентификатор нашей кнопки. В WinBinder ко всем ресурсам и компонентам доступ происходит через целочисленные идентификаторы, будь то окно, контроллер или сообщение. После мы создали окно с заголовком www.samag.ru. Далее идет регистрация нашего обработчика сообщений wb_set_handler($winmain, "main_events_handler"). В качестве аргументов передается идентификатор окна и название функции обратного вызова. Функция принимает идентификатор объекта-родителя и целочисленный идентификатор сообщения. Внутри функции мы обрабатываем эти сообщения по номерам в конструкции switch. Вы видите нашу объявленную константу IDC_PUSHBUTTON1002 и неизвестную IDCLOSE. Вторая константа – это стандартная константа библиотеки. Подробнее оних можно прочесть в справке, которая идет в комплекте со студией. Ну и, наконец, происходит запуск бесконечного цикла функцией wb_main_loop(). Все. Теперь вы можете скомпилировать вашу программу и распространять ее на любом компьютере с операционной системой Windows.

Рисунок 3. Пример работы нашего приложения

Рисунок 3. Пример работы нашего приложения

После сборки на выходе получите исполняемый файл размером примерно полтора мегабайта, готовый к работе и включающий в себя все необходимые библиотеки и ресурсы.

Тестер регулярных выражений

Давайте теперь напишем более полезную программу и немного больше разберемся с WinBinder. Напишем утилиту, с помощью которой можно будет быстро протестировать регулярное выражение на пригодность. Итак, приступим.

Для начала накидаем простейший класс-отладчик, ибо без отладки немыслима разработка. Вся отладочная информация будет кидаться в текстовый лог-файл, так как это лучший способ отладки. Код нашего отладчика будет следующим:

<?php

 

class Debug

{

public static $dumpFile = 'dump.log';

 

public static function var_dump()

{

$args = func_get_args();

ob_start();

call_user_func_array('var_dump', $args);

error_log(ob_get_clean(), 3, self::$dumpFile);

}

 

public static function var_export()

{

$args = func_get_args();

error_log(var_export($args,true), 3, self::$dumpFile);

}

}

?>

Ресурсы WinBinder

Прежде чем продолжить, я должен рассказать вам про ресурсы WinBinder и как с ними работать. Любой ресурс, импортированный в проект, будет храниться внутри бинарного файла. PHP-скрипты также являются текстовыми ресурсами. Чтобы обратиться к внутреннему ресурсу надо использовать схему res://. Общий прототип именования выглядит следующим образом:

"res:///RESOURCETYPE/RESOURCENAME"

Это описание внутреннего адреса включенного файла. Тогда, чтобы подключить наш файл debug.php, который стал ресурсом по имени DEBUG, нужно написать следующую строчку:

include "res:///PHP/DEBUG";

Таким образом, мы подключили внутренний файл. Мы могли этот файл оставить внешним, и тогда его подключать приходилось бы через указание пути к этому файлу. Этого достаточно для нашего приложения. Более подробно обо всех видах ресурсов написано в справке к библиотеке.

Создаем каркас

Кинем на форму два текстовых поля, две кнопки и компонент для рендеринга HTML кода. Наша форма должна выглядеть примерно так (см. рис. 4).

Рисунок 4. Форма будущей программы

Рисунок 4. Форма будущей программы

Теперь давайте напишем каркас нашего будущего приложения. Лучше всего его оформить один раз в виде класса и впоследствии использовать во всех ваших приложениях с WinBinder. Каркас будет выглядеть так:

<?php

 

class WBMain

{

    public static $signalsBind = array();

    public static $components = array();

 

    public static function main()

    {

        wb_init();

        include "res:///PHP/MAINFORMFORM";

 

        self::$signalsBind =

           array

           (

               IDCLOSE => 'close'

           ,   IDC_PUSHBUTTON1004 => 'pushButton1'

           ,   IDC_PUSHBUTTON1005 => 'pushButton2'

           );

 

        wb_set_handler($winmain, 'WBMain::callSignalHandler');

        wb_main_loop();

    }

 

    public static function ?

           callSignalHandler($Window, $signal)

    {

        if (isset(self::$signalsBind[$signal]) && is_callable($foo = 'WBMain::signal_' . self::$signalsBind[$signal]))

           call_user_func($foo, $Window);

    }

 

    public static function signal_pushButton1($Window)

    {

        wb_message_box($Window, __METHOD__, '');

    }

 

    public static function signal_pushButton2($Window)

    {

        wb_message_box($Window, __METHOD__, '');

    }

 

    public static function signal_close($Window)

    {

        wb_destroy_window($Window);

    }

 

}

 

WBMain::main();

 

?>

Здесь мы оформили код приложения в виде класса, с набором статических свойств. Выделили общий контроллер сообщений callSignalHandler(), который, в зависимости от сообщения, вызывает нужную функцию обратного вызова, что удобнее и правильней, чем один большой switch на всю программу. Это почти весь текст программы, за исключением того, что в ней нужно описать логику для кнопок, это методы signal_pushButton1 и signal_pushButton2 соответственно. Можно оформить код программы таким образом, чтобы каждый обработчик представлял собой отдельный класс и хранился в отдельном файле. Это особенно удобно, если у вас очень большая программа. Вы сами решите, как вам удобнее и лучше.

Вернемся к нашим недописанным обработчикам сообщений. Код этих методов выглядит следующим образом. Для кнопки preg_match:

public static function signal_pushButton1($Window)

{

preg_match

(

wb_get_text(self::$components[IDC_RTFEDITBOX1002]),

wb_get_text(self::$components[IDC_RTFEDITBOX1001]),

$arrayResults

);

 

self::setResult($arrayResults);

}

и аналогичная функция для кнопки preg_match_all:

public static function signal_pushButton2($Window)

{

preg_match_all

(

wb_get_text(self::$components[IDC_RTFEDITBOX1002]),

wb_get_text(self::$components[IDC_RTFEDITBOX1001]),

$arrayResults

);

 

self::setResult($arrayResults);

}

В обеих функциях вы видите вызов функции setResult(). Это функция, обрабатывающая результат и выводящая его в красивом форматированном виде. Сделано это для сокращения размера программы, так как функционал вывода полностью идентичен для обеих кнопок. Код функции представлен ниже:

public static function setResult(array $arrayResults)

{

$result =

'<html><head><title>PCRETester</title></head><body>'

. highlight_string

(

"<?php\n\n"

. var_export($arrayResults,true)

,true

)

. '</body></html>'

;

 

static $file;

if (!$file) $file = getcwd() . '/render.tmp';

 

$fp = fopen($file,'w+');

fwrite($fp, $result);

fclose($fp);

 

wb_set_location(self::$components[IDC_HTMLCONTROL1003], $file);

}

Вот таким вот нехитрым образом мы выводим дамп массива в формате HTML с результатами. Данные сохраняются во временный файл, который потом загружается в компонент HTMLControl, где происходит рендеринг. Таким вот образом за 5 минут была написана полезная утилита (см. рис. 5). Веб-разработчику нет необходимости переучиваться и изучать что-то сложное. WinBinder очень легок в освоении, а на сайте есть очень подробная документация и хорошие примеры. Эта документация встроена и в саму студию, так что нет необходимости ходить на сайт.

Рисунок 5. Наша программа в действии

Рисунок 5. Наша программа в действии

Еще пару слов в пользу WinBinder

WinBinder настолько прост, что много о нём рассказывать не вижу смысла. Данной статьи достаточно для того, чтобы сесть и начать писать всякие утилитки для себя уже после тридцати минут знакомства. Можно написать легко и быстро редактор для базы данных SQLIte. Можно написать простой графический редактор, используя GD. К примеру, программу для визуального изменения размера изображений и их брендирования. И даже ICQ-клиент, благо есть библиотека, написанная на PHP, для работы с этим протоколом. Можно написать клиент для работы с почтой. Можно написать FTP-клиент. Да можно много чего еще написать. Была бы фантазия, прямые руки и свободное время, а инструмент у нас уже есть.

Конечно WinBinder не заменит вам С#/C++ или Java, но его возможностей достаточно для создания более-менее сложных приложений. Более того, сообщество программистов постоянно расширяет возможности WinBinder. Чего только стоит поддержка WinAPI, а также возможность чтения/записи памяти по произвольным адресам с помощью функций wb_peek() и wb_poke(). Например, таким образом был найден способ взаимодействия с буфером обмена.

Кстати, вот вам пример работы напрямую с памятью. Например, изменение содержимого строки в памяти:

<?php

 

$string = "Test string";

$addr = wb_get_address($string);

$peek = wb_peek($addr);

Debug::var_dump( $peek );

 

wb_poke($addr, "Replace");

$peek = wb_peek($addr);

Debug::var_dump($peek, $string);

 

?>

В результате в лог-файл будет записано следующее:

 

string(11) "Test string"

string(11) "Replacering"

string(11) "Replacering"

Мы получили адрес строковой переменной с помощью wb_get_adress(), затем получили её содержимое через wb_peek() и изменили, перезаписав начало строки через wb_poke().

Еще один плюс в корзину WinBinder – это то, что он поддерживает ресурсы из WinASM Studio (бесплатная среда разработки программного обеспечения для ОС Windows и DOS, изначально предназначенная для написания программ на языке Ассемблер) (см. рис. 6).

Рисунок 6. Ресурсы, созданные в WinASM Studio, можно подключать к Winbinder

Рисунок 6. Ресурсы, созданные в WinASM Studio, можно подключать к Winbinder

WinBinder умеет даже «на лету» работать с файлами ресурсов. К примеру, у вас есть файл с ресурсом окна. Вы можете его подключить прямо в программе, распарсить функцией parse_rc(), которая вернет нативный PHP-код и выполнить его. Пример приведен ниже:

<?php

$fp = fopen('myform.rc', 'rb');

$resource = fread($fp, file_size('myform.rc'));

fclose($fp);

$native_php_resource = parse_rc($resource, '$mainwin', null, 'PopupWindow');

eval($native_php_resource);

?>

На сегодня поддерживаются только ресурсы, созданные WinASM Studio. Подробнее о данной функции вы можете прочесть на этой странице http://winbinder.org/manual/functions/auxiliary/parse_rc.html.

В WinBinder реализованы даже функции для работы с базой данных. Все они начинаются с префикса db_. Подробности их использования можно узнать тут: http://winbinder.org/manual/reference/functions_database.html.

Теперь давайте разберем пример работы с реестром, так как в операционных системах Windows это неотъемлемая часть. А серьезному приложению работа с реестром просто необходима. Например, мы хотим узнать, какие обои установлены в данный момент на рабочем столе:

<?php

$wallpaper = wb_get_registry_key('HKCU', 'Control Panel\\Desktop', 'Wallpaper');

?>

Нет ничего проще

В Winbinder встроены функции для проигрывания звуков (wb_play_sound()), для поиска файлов (wb_find_file()). Так же легко можно работать с COM-компонентами Windows, увеличивая функционал своих программ. Например, можно написать свой Skype-клиент, используя SkypeAPI. Достаточно пары строк кода, и у вас уже почти готовое приложение:

<?php

$Skype = new COM('SKYPEAPI.Access')

if ( !$Skype )

{

wb_message_box($Window, "ERROR! Can not create SKYPEAPILib.Access object!", "ERROR!");

exit(1024);

}

$Com->Connect();

$data_array = $Com->GetFriendList();

?>

Думаю, на этом можно остановиться. Вы знаете достаточно, чтобы понять, нужен ли вам этот замечательный фреймворк и хотите ли вы с ним ознакомиться поближе. Безусловно, он вам может пригодиться, если вы PHP-программист и, возможно, читая эту статью, уже придумали, какую программу, написанную для себя, вы давно хотели переписать с помощью PHP-GTK, но не хватало времени изучить все возможности и особенности. Разработка с применением GTK никогда не славилась легкостью, тут никто спорить не будет. Причем я говорю не только о PHP-GTK. Так почему бы не попробовать новый инструмент? Особенно если у вас стоит задача написать приложение именно под операционную систему Windows.

Итого

Возможности WinBinder достаточно велики. Он умеет работать с реестром Windows. Умеет работать с медиа-ресурсами и проигрывать *.wav-файлы. Достаточно взглянуть в справочную информацию, и вы поймете, что он умеет много чего. Тем не менее его функционал хоть и велик, но очень прост в изучении. Один тот факт, что WinBinder взаимодействует напрямую с Windows API, говорит о том, что он обладает достаточной мощью для разработки приложений под операционную систему Windows. Более того, он очень хорошо документирован (на мой взгляд, лучше, чем PHP-GTK). На официальном сайте вы найдете массу примеров, а также много информации можно почерпнуть с форума сообщества.

Если вы уже знакомы с PHP, то через пару часов вы сможете увидеть свою программу на PHP в виндовом окошке. Освоив документацию WinBinder и получив достаточное количество практики, вы поймете, что еще более простого прикладного программирования под Windows вы не находили. Кстати, WinBinder доступен в PECL-репозитории по адресу http://pecl.php.net/package/WinBinder.

  1. Официальный сайт фреймворка WinBinder – http://winbinder.org.
  2. Сайт miniPHP Studio – http://exvision.net.
  3. WinBinder в репозитории PECL – http://pecl.php.net/package/WinBinder.

Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-45
E-mail: sa@samag.ru