GUI на C#.

Все о программировании под *nix
Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

GUI на C#.

Сообщение Llama »

Вобщем, если кому-то лениво копать самому... Вот что-то типа helloworld. М.б. после него кому-то станет интересно и я буду копать mono не в одиночку.

Код: Выделить всё

using System;
using Gtk;

class MyTEST
{
static TextView tv;
	static void Main ()
	{
		Application.Init ();
		Gtk.Window win = new Gtk.Window ("MyTEST");
		win.SetDefaultSize (400, 300);
		win.DeleteEvent += new DeleteEventHandler (OnWinDelete);
		VBox vbox = new VBox (false, 0);
		HBox hbox = new HBox (false, 0);
		win.Add (vbox);
		tv = new TextView ();
		tv.Buffer.Text = "Hello World";
		vbox.PackStart (tv, true, true, 0);
		Button btn = new Button("Button 1");
		btn.Clicked += new EventHandler (SomeButtonClickA);
		vbox.PackStart (btn, true, true, 0);
		vbox.PackStart (hbox, true, true, 0);
		Button btnA = new Button("Button 2");
		btnA.Clicked += new EventHandler (SomeButtonClick);
		Button btnB = new Button("Button 3");
		btnB.Clicked += new EventHandler (SomeButtonClick);
		hbox.PackStart (btnA, true, true, 0);
		hbox.PackStart (btnB, true, true, 0);
		win.ShowAll ();
		Application.Run ();
	}
	static void OnWinDelete (object o, DeleteEventArgs args)
	{
		Application.Quit ();
	}
	static void SomeButtonClick (object o, EventArgs args)
	{
		Console.WriteLine ("Dont touch the key");
	}
	static void SomeButtonClickA (object o, EventArgs args)
	{
		Console.WriteLine ("Dont touch the key");
		Console.WriteLine (tv.Buffer.Text);
	}

}

Уж не знаю, насколько эт проавильно. но тем не менее...
собирать так:

Код: Выделить всё

mcs hw-gtk.cs -r:gtk-sharp
Необходимые пакеты:
gtk-sharp
mono
mono-mcs
Остально - по зависимостям. Работает вполне приятно... Если прикрутить binfmt-misc - будет еще приятнее...


Пакеты можно брать в unstable, сборка для stable - тут.

Код: Выделить всё

deb http://www.debianplanet.org/mono stable main
deb-src http://www.debianplanet.org/mono stable main
Скриптик для поднятия bifmt-misc выглядит так:

Код: Выделить всё

#!/bin/sh
# Copyright (C) 2002 Alp Toker <alp@atoker.com>
# Licensed under the terms of the GNU GPL

if [ ! -e /proc/sys/fs/binfmt_misc/register ]; then
	/sbin/modprobe binfmt_misc
	mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
fi

if [ -e /proc/sys/fs/binfmt_misc/register ]; then
	echo ':CLR:M::MZ::/usr/bin/mono:' > /proc/sys/fs/binfmt_misc/register
else
	echo "No binfmt_misc support"
	exit 1
fi

exit 0
Длря работы в ядре надо включить формат исполнимых файлов MISC. - после этого можно запускать программы просто как ./program.exe
Если кому-то это показалось интересным, то я и дальше буду выкладывать всякие свои полуфабрикаты с комментариями. Если нало - можно написать коментарии к примеру, но там ИМХО и так все понятно. Кроме того интересные вещи появляются в /usr/share/dotnet/gtk-sharp-examples/ после установки пакета gtk-sharp-examples. Ессно следует ставить какйо-нить monodoc - мне больше нарвится monodoc-http.
Опыт растет прямо пропорционально выведенному из строя оборудованию

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

по просьбам общественности...

Код: Выделить всё

using System;
using Gtk;
Здесь мы говорим, что будeт испоьзванs модули System и Gtk. Иерархию методов и свойств для этих методов см. в monodoc.

Код: Выделить всё

class MyTEST
{
static TextView tv;
Начлало программы MyTEST. Объявлена статическая переменная tv типа TextView.

Код: Выделить всё

   static void Main ()
   {
      Application.Init ();
Функция main. С нее начинается выполнение программы.

Код: Выделить всё

      Gtk.Window win = new Gtk.Window ("MyTEST");
      win.SetDefaultSize (400, 300);
Создали объект win типа Gtk.Window путам вызова конструктора с параметром "MyTEST" По сути - это окно с заголовком MyTEST

Код: Выделить всё

      win.DeleteEvent += new DeleteEventHandler (OnWinDelete);
Зарегистрировали обработчик события удаления окна - функцию OnWinDelete.

Код: Выделить всё

      VBox vbox = new VBox (false, 0);
      HBox hbox = new HBox (false, 0);
Создали два контейнера - горизонтальный и вертикальный.

Код: Выделить всё

      win.Add (vbox);
Добавили вертикальный контейнейр в окно.

Код: Выделить всё

      tv = new TextView ();
      tv.Buffer.Text = "Hello World";
Создали объект tv и заслали в него строчку "Hello World".

Код: Выделить всё

      vbox.PackStart (tv, true, true, 0);
Поместили объект tv в вертикальный контейнер.

Код: Выделить всё

      Button btn = new Button("Button 1");
Создали объект типа Button с надписью "Button 1"

Код: Выделить всё

 
      btn.Clicked += new EventHandler (SomeButtonClickA);
И зарегистрировали обработчик нажатия.

Код: Выделить всё

      vbox.PackStart (btn, true, true, 0);
      vbox.PackStart (hbox, true, true, 0);
      Button btnA = new Button("Button 2");
      btnA.Clicked += new EventHandler (SomeButtonClick);
      Button btnB = new Button("Button 3");
      btnB.Clicked += new EventHandler (SomeButtonClick);
      hbox.PackStart (btnA, true, true, 0);
      hbox.PackStart (btnB, true, true, 0);
Тута делаются еще кнопки, записхиваются в контейнеоры и регистрируются обработчики.

Код: Выделить всё

      win.ShowAll ();
      Application.Run ();
   }
Теперь ЭТО показать на экране. Можно даже потрогать ;) Конец Main()

Код: Выделить всё


   static void OnWinDelete (object o, DeleteEventArgs args)
   {
      Application.Quit ();
   }
   static void SomeButtonClick (object o, EventArgs args)
   {
      Console.WriteLine ("Dont touch the key");
   }
   static void SomeButtonClickA (object o, EventArgs args)
   {
      Console.WriteLine ("Dont touch the key");
      Console.WriteLine (tv.Buffer.Text);
   }

} 
Это - функции обработчики событий. Console определен System. Там впрочем и помимо Console есть много чего интересного. С.м. monodoc.
Опыт растет прямо пропорционально выведенному из строя оборудованию

Аватара пользователя
fa3a
Неотъемлемая часть форума
Сообщения: 619
Зарегистрирован: 25 июл 2003, 17:22
Откуда: Minsk

Сообщение fa3a »

Llama писал(а):по просьбам общественности...
хе-хе.. прикольно! :-)))
Never touch the running program!!!

Аватара пользователя
X-Stranger
Администратор
Сообщения: 1238
Зарегистрирован: 09 сен 2001, 04:46
Контактная информация:

Сообщение X-Stranger »

2 Llama: Выкладывай, выкладывай, если это планируется делать и дальше, так могу тебе WebLog выделить, чтоб ты туда всяческие программерские штуки. Лично мне это интересно, тем более что про C#.

Аватара пользователя
leikind
Неотъемлемая часть форума
Сообщения: 811
Зарегистрирован: 20 июн 2002, 03:02
Откуда: Брюссель
Контактная информация:

Сообщение leikind »

Я тебя Llama люблю и уважаю :) , да только если ты вздумал приводить примеры кода, можно было сделать его покрасивше, даже такой маленький кусочек, а именно, избавиться от статических членов и вспомнить о том, что C# - это ОО язык.

Код: Выделить всё

using System;
using Gtk;

namespace Test{
    class MyWindow : Gtk.Window{
        TextView tv;
        MessageDialog dialog;
        
        public MyWindow() : base("MyTest"){
            
            SetDefaultSize (400, 300);
            SetDefaultSize (400, 300);
            DeleteEvent += new DeleteEventHandler (OnWinDelete);
            
            BuildItself();
            
            ShowAll();
            Application.Run();
        }
        
        void BuildItself(){
              VBox vbox = new VBox (false, 0);
              HBox hbox = new HBox (false, 0);
              Add (vbox);
              tv = new TextView ();
              tv.Buffer.Text = "Hello World";
              vbox.PackStart (tv, true, true, 0);
              Button btn = new Button("Say it");
              btn.Clicked += new EventHandler (SomeButtonClickA);
              vbox.PackStart (btn, true, true, 0);
              vbox.PackStart (hbox, true, true, 0);
              Button btnA = new Button("Button 2");
              btnA.Clicked += new EventHandler (SomeButtonClick);
              Button btnB = new Button("Button 3");
              btnB.Clicked += new EventHandler (SomeButtonClick);
              hbox.PackStart (btnA, true, true, 0);
              hbox.PackStart (btnB, true, true, 0);        
        }
        
        void OnWinDelete(object o, DeleteEventArgs args) {
            Application.Quit ();
        }
       
        void SomeButtonClick(object o, EventArgs args) {
            Say("Don't touch the key");
        }
        
        void SomeButtonClickA(object o, EventArgs args) {
            Say(tv.Buffer.Text);
        }   
        
        void Say(string message)  {
            dialog = new MessageDialog(this, DialogFlags.Modal,
                MessageType.Info, ButtonsType.Ok, message);
            dialog.Run();
            dialog.Destroy();
        }        
    
        static void Main(){
            Application.Init();
            new MyWindow();
        }      
    }
}


Изображение

Benvenuto

Сообщение Benvenuto »

Спасибо, идея хорошая :-)
Буду рад увидеть новый код.
Кстати, как обстоят дела с проектом альтернативного .Net окружения, внутри проекта Mono? Чтобы программы ставить там, где .Net не стоит.

Ответить