0

Linux/UNIX マシンで MonoDevelop IDE を使用し、C# および .NET フレームワークでコーディングしています。プロジェクトのビルド時に Gtk::DrawingArea を親 Gtk.Window に表示する方法がわかりませんか?

::drawingArea オブジェクトをコードに手動で追加して、ウィンドウに直接配置して (デザイン ビューで、スクリーンショットを参照)、固定ボックス内に ::drawingArea オブジェクトを配置しようとしました。

以下は、私が実装しようとしているコードです。デザインは可能な限り基本的なもので、drawingArea への信号をキャッチして操作する方法を理解できるようにしています。親ウィンドウ (MainWindow) と描画領域 (drawingarea1) があります。

スクリーンショット

私の質問: drawingArea オブジェクトを Gtk.Window に表示するにはどうすればよいですか? さらに重要なことは、描画領域に設定された信号にオブジェクトを応答させるために欠けているものはありますか? 最終的には、描画領域ウィンドウ内で描画および色付けできるようにしたいのですが、現時点では、描画領域ウィジェットを表示してシグナルをキャッチすることさえできません。

前もって感謝します!

MainWidow.cs

using System;
using Gtk;

public partial class MainWindow : Gtk.Window
{


    public DrawingArea d;

    public MainWindow() : base(Gtk.WindowType.Toplevel)
    {
        d = drawingarea1;
        Build();
    }

    protected void OnDeleteEvent(object sender, DeleteEventArgs a)
    {
        Application.Quit();
        a.RetVal = true;
    }

    protected void OnExpose(object o, ExposeEventArgs args)
    {
        Console.WriteLine("OnExpose...");
    }

    protected void OnRealization(object sender, EventArgs e)
    {
        Console.WriteLine("OnRealization...");
    }

    protected void OnDragMotion(object o, DragMotionArgs args)
    {
        Console.WriteLine("OnDragMotion...");
    }
}

Driver.cs

using System;
using Gtk;

    class MainClass
    {
        public static void Main(string[] args)
        {
            Application.Init();

            MainWindow win = new MainWindow();
            // throws NULLREFERENCE EXECPTION
            win.d.Show();
         
            win.Show();

            Application.Run();
        }
    }

//******** 部分解 **********//

ColorSelectorDraw.cs

using System;
using Gtk;
using Gdk;

namespace GUIDraw4
{
    public class DemoColorSelection : Gtk.Window
    {
        private Gdk.Color color;
        private Gtk.DrawingArea drawingArea;

        public DemoColorSelection() : base("Color Selection")
        {
            BorderWidth = 8;
            VBox vbox = new VBox(false, 8);
            vbox.BorderWidth = 8;
            Add(vbox);

            // Create the color swatch area
            Frame frame = new Frame();
            frame.ShadowType = ShadowType.In;
            vbox.PackStart(frame, true, true, 0);

            drawingArea = new DrawingArea();
            drawingArea.ExposeEvent += new ExposeEventHandler(ExposeEventCallback);
            // set a minimum size
            drawingArea.SetSizeRequest(400, 250);
            // set the color
            color = new Gdk.Color(255, 255, 255);
            drawingArea.ModifyBg(StateType.Normal, color);
            frame.Add(drawingArea);

            Alignment alignment = new Alignment(1.0f, 0.5f, 0.0f, 0.0f);
            Button button = new Button("_Change the above color");
            button.Clicked += new EventHandler(ChangeColorCallback);
            alignment.Add(button);
            vbox.PackStart(alignment);

            ShowAll();
        }

        protected override bool OnDeleteEvent(Gdk.Event evt)
        {
            Destroy();
            return true;
        }

        // Expose callback for the drawing area
        private void ExposeEventCallback(object o, ExposeEventArgs args)
        {
            EventExpose eventExpose = args.Event;
            Gdk.Window window = eventExpose.Window;
            Rectangle area = eventExpose.Area;

            window.DrawRectangle(drawingArea.Style.BackgroundGC(StateType.Normal),
                          true,
                          area.X, area.Y,
                          area.Width, area.Height);
            args.RetVal = true;
        }

        private void ChangeColorCallback(object o, EventArgs args)
        {
            using (ColorSelectionDialog colorSelectionDialog = new ColorSelectionDialog("Changing color"))
            {
                colorSelectionDialog.TransientFor = this;
                colorSelectionDialog.ColorSelection.PreviousColor = color;
                colorSelectionDialog.ColorSelection.CurrentColor = color;
                colorSelectionDialog.ColorSelection.HasPalette = true;

                if (colorSelectionDialog.Run() == (int)ResponseType.Ok)
                {
                    Gdk.Color selected = colorSelectionDialog.ColorSelection.CurrentColor;
                    drawingArea.ModifyBg(StateType.Normal, selected);
                }

                colorSelectionDialog.Hide();
            }
        }
    }
}

Program.cs

using System;
using Gtk;

namespace GUIDraw4
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Application.Init();
            //MainWindow win = new MainWindow();
            //win.Show();

            DemoColorSelection cs = new DemoColorSelection();
            Application.Run();
        }
    }
}

これにより、少なくとも GUI にインタラクティブな描画ボードが表示されるように見えました。csharp.hotexamples.comから取得

4

0 に答える 0