C# 如何在C(mono)中使用Gdk库?

C# 如何在C(mono)中使用Gdk库?,c#,drawable,gtk#,gdk,C#,Drawable,Gtk#,Gdk,我是Gtk和Gdk的新手,完全不知道如何开始 我所要做的就是在任何widget/pixmap/image中绘制点和线,然后在我的gtk应用程序中显示它们。 到目前为止,我知道我必须创建一个Gdk.drawable对象来访问绘图点(点[]点)和绘图线(点[]点)方法。然而,要实例化一个Drawable对象,我需要一个Gdk.GC对象。两个对象构造函数都接受一个IntPtr参数,我不知道我应该传递什么IntPtr?!或者,一个GC构造函数也可以接受一个可绘制的对象,而一个可绘制的构造函数可以接受一个

我是Gtk和Gdk的新手,完全不知道如何开始

我所要做的就是在任何widget/pixmap/image中绘制点和线,然后在我的gtk应用程序中显示它们。
到目前为止,我知道我必须创建一个
Gdk.drawable
对象来访问
绘图点(点[]点)
绘图线(点[]点)
方法。然而,要实例化一个
Drawable
对象,我需要一个
Gdk.GC
对象。两个对象构造函数都接受一个
IntPtr
参数,我不知道我应该传递什么
IntPtr
?!或者,一个GC构造函数也可以接受一个可绘制的对象,而一个可绘制的构造函数可以接受一个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库?

因此,经过大量的耐心,我终于找到了如何开始使用gdk的答案

基本上,只有事件才能触发图形。我试图直接从方法调用绘图,但没有成功。下面是我在C#中缺少的基本代码:

在这里,我们构建主窗口,并使用OneExposeEvent方法编写所有图形。当任何小部件需要(全部或部分)重绘时,将调用此方法。在这里,您需要使用“Drawable”参数实例化Gdk.GC对象(上下文)。没有太多选择:Gdk.Pixmap或Gdk.Window。我选择了Gdk.Window,因为它是最直接的绘制表面。然后可以自定义上下文对象以决定如何绘制它

最后,直接从要绘制的可绘制对象调用绘制方法:这里我只想绘制一系列8个连接点


我希望这能帮助其他用户理解这个gdk名称空间的逻辑。

编译错误发生在哪里?尽量只包含与您的问题相关的代码。(一个问题,比如“如何使用Gdk#?”实例化这个Gdk对象。“有人向我解释Gdk吗”这个问题可能会结束。)另外,搜索“mono drawing tutorial”会得出这样的结论:好的,我已经重新表述了我最初的问题,希望现在更清楚。关于开罗,这不是Gdk…如果没有人理解它,这个Gdk库有什么意义?除了不完整的参考手册之外,为什么没有任何在线资源可以理解它呢?对绑定的期望通常是您能够理解库的原始版本(在本例中,是Gtk和Gdk的C版本以及杂项),使用该库的文档,并在不同语言之间翻译各种习惯用法。(例如,Gtk信号将是C#events等)此外,如果您阅读了这篇文章,您可能会了解到:1。Cairo可用于Gtk#中的绘图。(事实上,我相信它是Gtk生态系统的主要2D图形API。GDK已被弃用,其绘图功能实际上已在Gtk3中消失。)。第二个代码示例包括表达式
area.GdkWindow
。表示它继承自
Gdk.Drawable
,这似乎是您正在寻找的东西,如果您真的想要Gdk,您可以使用它。多年来,我一直在寻找有关如何创建GC的详细信息!从那以后,我一直在破坏默认的地面军事系统。Mono文档倾向于关注基础和超高级stuf。非常感谢你!
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);
    }
}