Как использовать библиотеку Gdk # в C # (моно)? - PullRequest
6 голосов
/ 02 февраля 2012

Я полный новичок с Gtk # и Gdk #, и я совершенно потерян, как начать.

Все, что я пытаюсь сделать, это рисовать точки и линии в любом виджете/ pixmap / image, а затем отобразить их в моем приложении gtk.
Пока я понимаю, что должен создать объект Gdk.drawable для доступа к методам DrawPoints(Point[] points) и DrawLine(Point[] points).Однако, чтобы создать экземпляр объекта Drawable, мне нужен объект Gdk.GC.Оба конструктора объекта принимают параметр IntPtr, и я не знаю, что IntPtr я должен передать здесь ?!Или конструктор GC мог бы также взять объект Drawable, а конструктор Drawable мог бы взять объект GC ... Я поворачиваюсь по кругу!

Это было 24-часовое онлайн-исследование и не считая некоторых примеров Pythonкоторые используют конструкторы, которые не принимают параметров, я не смог найти никакого ресурса для начала работы в C #.

Итак, кто-нибудь может показать мне, как правильно использовать эти объекты GC и Drawable для рисования линии, используя DrawLine(Point[] points) method?

GDKEXAMPLE(){
    win = new Gtk.Window ("Gdk nightmare");
    win.SetDefaultSize (400, 300);
    img=new Gtk.Image();
    Drawable dr=new Drawable(null); //how to instantiate this object?
    Gdk.GC gc=new Gdk.GC(null); //how to instantiate this object?
    Point[] pts=new Point[3];
    pts[0]=new Point(10,10);
    pts[1]=new Point(15,20);
    pts[2]=new Point(20,50);

    dr.DrawLines(gc,pts);
    Pixmap pxmp=new Pixmap(dr,100,100);
    img.SetFromPixmap(pxmp,pxmp); //Requests a pixmap and pixmap mask: what mask?
    img.QueueDraw();

    win.Add(img);
    win.ShowAll();
}

Может ли кто-нибудь помочь мне использовать класс Gdk.GC и Gdk.Drawable, а затем отобразить любые точки или линии в виджете Gtk, пожалуйста?может быть, сделав приведенный выше код для работы?или любая ссылка на какой-то учебник в C # с использованием этой библиотеки gdk?

1 Ответ

6 голосов
/ 06 февраля 2012

Итак, после большого терпения я в конце концов нашел ответ на вопрос, как начать работу с Gdk #.

По сути, только события могут вызвать рисование.Я пытался вызывать рисунки напрямую из методов, но это не сработало.Вот основной код, который мне не хватало в C #:

using System;
using Gdk;
using Gtk;

class GdkApp : Gtk.Window 
{
    public static void Main()
    {
        Application.Init();
        new GdkApp();
        Application.Run();
    }

    public GdkApp() : base("Simple drawing")
    {
        SetDefaultSize(230, 150);
        DeleteEvent+=delegate {Application.Quit(); };
        ShowAll();
    }


    protected override bool OnExposeEvent (EventExpose evnt)
    {
        bool ok = base.OnExposeEvent (evnt);
        draw ();
        return ok;
    }

    void draw()
    {
        Gdk.GC gc = new Gdk.GC ((Drawable)base.GdkWindow);
        gc.RgbFgColor = new Gdk.Color (255, 50, 50);
        gc.RgbBgColor = new Gdk.Color (0, 0, 0);
        gc.SetLineAttributes (3, LineStyle.OnOffDash, 
                              CapStyle.Projecting, JoinStyle.Round);
        Gdk.Point[] pts = new Gdk.Point[8];
        pts [0] = new Gdk.Point (10, 50);
        pts [1] = new Gdk.Point (15, 70);
        pts [2] = new Gdk.Point (20, 80);
        pts [3] = new Gdk.Point (25, 70);
        pts [4] = new Gdk.Point (30, 80);
        pts [5] = new Gdk.Point (40, 90);
        pts [6] = new Gdk.Point (55, 85);
        pts [7] = new Gdk.Point (75, 65);
        base.GdkWindow.DrawLines (gc, pts);
    }
}

Здесь мы строим главное окно и записываем все чертежи в методе OnExposeEvent.Этот метод вызывается, когда любой виджет необходимо (полностью или частично) перерисовать.Там вам нужно создать экземпляр объекта Gdk.GC (контекст) с параметром «Drawable».Там нет большого выбора: Gdk.Pixmap или Gdk.Window.Я выбрал Gdk.Window, так как это была самая простая поверхность для рисования.Затем вы можете настроить объект контекста, чтобы решить, как он будет нарисован.

Наконец, и непосредственно из объекта Drawable, на котором вы хотите рисовать, вы можете вызвать методы рисования: здесь я просто хотел построить сериюиз 8 соединенных точек.

Я надеюсь, что это может помочь некоторым другим пользователям, пытающимся понять логику этого пространства имен gdk #.

...