PHP DOTNET (): захват событий управления System.Windows.Forms для создания удобного графического интерфейса пользователя WIN - PullRequest
1 голос
/ 06 августа 2010

Я сделал 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. Разочаровывает, но начинает работать.

1 Ответ

0 голосов
/ 29 октября 2010

Self-ответ. Класс Dotnet, по-видимому, не является полностью функциональным и полагается на то, что классы доступны для COM (а большинство из них нет), а некоторые распространенные типы .Net не могут быть преобразованы в значения PHP (см. PHP tracker bug error) Таким образом, создание очень простой оболочки / API в VB.Net и превращение ее в COM-класс было единственным способом, который я смог найти, чтобы это заработало. Чисто в качестве примера (с открытым исходным кодом) см .: http://universalccw.sourceforge.net/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...