Как использовать библиотеку Gdk# в C# (моно)?

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

Все, что я пытаюсь сделать, это нарисовать точки и линии в любом виджете/пиксельной карте/изображении, а затем отобразить их в моем приложении 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)?

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?


person djahma    schedule 02.02.2012    source источник
comment
Где возникает ошибка компиляции? Старайтесь включать только код, относящийся к вашему вопросу. (Вопрос, например, как создать экземпляр этого объекта Gdk с помощью Gdk#?. Вопрос, который кто-то объяснит мне Gdk#, скорее всего, будет закрыт.)   -  person millimoose    schedule 02.02.2012
comment
Кроме того, поиск учебника по моно-рисованию дает следующее: mono-project.com/Mono.Cairo   -  person millimoose    schedule 02.02.2012
comment
Хорошо, я перефразировал свой первоначальный вопрос, надеюсь, теперь стало понятнее. Насчет Каира, это не Gdk... какой смысл в этой библиотеке Gdk#, если ее никто не понимает? и почему нет никакого онлайн-ресурса, чтобы понять это, кроме их неполного справочного руководства?   -  person djahma    schedule 02.02.2012
comment
От привязок часто ожидают, что вы поймете исходную версию библиотеки (в данном случае C-версию Gtk, Gdk и прочее), будете использовать документацию для этой библиотеки и переводить различные идиомы с одного языка на другой. (Например, сигналы Gtk будут событиями C# и т. д.)   -  person millimoose    schedule 02.02.2012
comment
Кроме того, если бы вы читали эту статью, вы могли бы узнать, что: 1. Cairo можно использовать для рисования в Gtk#. (На самом деле я считаю, что это основной API 2D-графики для экосистемы Gtk. GDK устарел, а его функции рисования фактически отсутствуют в Gtk3.) 2. Второй пример кода включает выражение area.GdkWindow. В документации для Gdk.Window говорится, что он наследуется от Gdk.Drawable, что кажется быть тем, что вы ищете и что вы можете использовать для соберите Gdk.GC, если вам действительно нужен Gdk.   -  person millimoose    schedule 02.02.2012
comment
(Я соглашусь, что рыскание по документации не интуитивно и не приятно, но, к сожалению, необходимо. Если вас это не устраивает, вам может быть лучше использовать .NET framework или Cocoa вместо библиотек с открытым исходным кодом, оба которые имеют обширную официальную документацию с пошаговыми руководствами и образцами абсолютно для всего, что предоставляет вендор.)   -  person millimoose    schedule 02.02.2012


Ответы (1)


Итак, после продолжительного терпения я в конце концов нашел ответ на вопрос, как начать работу с 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#.

person djahma    schedule 06.02.2012
comment
Я искал подробности о том, как создать GC в течение многих лет! С тех пор я уничтожаю GC по умолчанию. Монодокументы, как правило, сосредоточены на базовых и сверхпродвинутых вещах. Большое спасибо! - person Daniel Monteiro; 19.03.2013