Я сделал Windows GUI через класс PHP * и System.Windows.Forms . Но я застрял в обработке нажатий кнопок, обновлении полей, формировании событий открытия / закрытия и т. Д.
Я не могу заставить com_event_sink () работать с любыми событиями вообще. Я не знаю ни одного способа заставить PHP «подделать» или утопить «делегатов» события управления. Лучшее, что я могу сделать, - это хакерство - постоянно отслеживать свойства элементов управления на предмет любых намеков на изменения - например, проверять, перетаскивается ли кнопка в данный момент вместо фактического события щелчка. Но есть только одно или два возможных свойства, которые даже относятся к взаимодействию с пользователем, которые я могу использовать здесь. Очевидно, что без привязки к событиям управления формой это делает мое приложение довольно бессильным.
С помощью PHP кто-нибудь смог подключиться к фактическим событиям класса System.Windows.Forms, чтобы создать эффективный графический интерфейс Windows? Если так, то как? Или есть другая сборка, на которую я должен смотреть вместо этого? Цитируем wezfurlong.org: Если вам нужны события в то же время, все документы .Net предполагают, что вы должны вместо этого сделать свои собственные обертки для объектов ...: (. Любой найдет обходной путь, который не ' Вынуждены ли вы изучать новый язык?
Вот мой рабочий тестовый графический интерфейс ...
<?php
$full_assembly_string = 'System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089';
$namespace = 'System.Windows.Forms';
// Main Form
$form = new DOTNET($full_assembly_string, $namespace.'.Form');
$form->Width = 450;
$form->Height = 550;
$form->Show();
// Textbox 1
$txt1 = new DOTNET($full_assembly_string, $namespace.'.TextBox');
$txt1->Name = "IP";
$txt1->Height = 400;
$txt1->Width = 400;
$txt1->Top = 40;
$txt1->Left = 5;
$txt1->Parent = $form;
// Textbox 2
$txt2 = new DOTNET($full_assembly_string, $namespace.'.TextBox');
$txt2->Height = 300;
$txt2->Width = 400;
$txt2->Top = 80;
$txt2->Left = 5;
$txt2->Multiline = True;
$txt2->ScrollBars = 3;
$txt2->Parent = $form;
// Button 1
$btn1 = new DOTNET($full_assembly_string, $namespace.'.Button');
$btn1->Height = 25;
$btn1->Width = 75;
$btn1->Text = "Backtrace";
$btn1->Top = 5;
$btn1->Left = 5;
$btn1->Parent = $form;
// Hack message/event capturing loop
while(true) {
com_message_pump(1);
// Check if 'Capture' property of Button 1 changed in lieu of actual click event
if ((bool) $btn1->Capture) {
$txt2->Text = "BACKTRACING ".$txt1->Name." ".$txt1->Text."!!";
$btn1->Capture = false; // force release of the button
}
}
?>
Меня также интересует альтернатива - PHP-GTK. Кто-нибудь получил эту работу, наложив необходимые библиотеки с их обычной установкой PHP5.3? Я не заинтересован в установке предварительно упакованной версии PHP, которая поставляется с PHP-GTK, так как она устарела годами. Но я очень рад, если кто-нибудь скажет мне, какие dll-файлы из пакета PHP-GTK выбрать и выбрать, чтобы они вошли в мою обычную установку PHP, чтобы она работала как любое обычное расширение.
Редактировать: В случае, если кто-то упоминает Winbinder - хотя я думаю, что эти разработчики проделали большую работу, он просто слишком глючный, разрозненный хобби-проект и не поддерживается централизованно, чтобы его можно было использовать в данный момент.
Обновление: Если никто не знает о хитрости или конкретной сборке .Net с поддержкой COM, которая может выступать в качестве оболочки, я бы посчитал эту проблему неразрешимой, используя родные методы PHP. Мне пришлось прибегнуть к созданию собственной библиотеки-оболочки VB.Net, в значительной степени опирающейся на класс отражения VB.Net в качестве посредника, зарегистрировать его как класс COM и вместо этого подключиться к -th- через COM. Разочаровывает, но начинает работать.