スキップしてメイン コンテンツへ

 none
Windows10 で Ink に線などをプログラムから描画したい RRS feed

  • 質問

  • Windows10 で Ink に線などを ”プログラムから線を描画" するソフトをテスト的に作ってみようと思っておりますが、方法が分からず質問させていただきます。.NET Framework 3.0 のモジュール(?)ということで、Windows10 に .NET Framework3.5 を追加しています。

    Inkをフォームに配置しておりますが、InkPictureというのを追加しております。

    それまでの手順としては、VS2012の「新しいプロジェクト」の 「Visual C#」 から 「Windowsフォームアプリケーション」を選択。作成したプロジェクトのツールボックスに InkPicture というのは無いので、メニューの「ツール」から「ツールボックスアイテムの選択」を選んで、「COMコンポーネント」タブにある「Microsoft InkPicture Control」にチェックを付けて利用しています。

    ここで質問なのですが、ユーザーはマウス操作によって線を描画できますが、これと同じ事をプログラムから行いたいと思っているのですが、可能でしょうか? もし可能な場合はどのようなコードを記述する必要があるかご教授頂けないかと思います。(最初の1本描画する所まで分かれば助かるのですが)

    ちなみに、以下のコードのようにGraphicsを取得して描画するという事をすると、見かけ上は線を引けるのですが、Inkの描画データとして描画されているのではなくて、Inkとは別に(同じ領域の前面側に)描画されているようです。(ストローク数が増えないのでそのように判断しております)

                Graphics g = axInkPicture1.CreateGraphics();
                g.DrawLine(penObj, 20, 20, 100, 100);

    よろしくお願い致します。

    2016年9月14日 9:49

回答

  • COM参照でのInkPicureは型情報が難しいので、.Net版であるMicrosoft.Ink.dllを参照した方が楽です。
    $C:\Program Files (x86)\Common Files\Microsoft Shared\Ink\Microsoft.Ink.dllにあると思います

    Microsoft.Ink.dll版

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            //Microsoft.Ink.dll版 (.Net)
            private Microsoft.Ink.InkPicture inkPicture1;
    
    
            public Form1()
            {
                //InitializeComponent();
    
                this.Text="Microsoft.Ink.dll版";
                inkPicture1 = new Microsoft.Ink.InkPicture() { Dock = DockStyle.Fill, BackColor = Color.White };
    
    
                var ClearButton = new Button() { Text = "Clear" };
                ClearButton.Click += Clear_Click;
                var SaveButton = new Button() { Text = "Save", Left = ClearButton.Left + ClearButton.Width };
                SaveButton.Click += Save_Click;
                var LoadButton = new Button() { Text = "Load", Left = SaveButton.Left + SaveButton.Width };
                LoadButton.Click += Load_Click;
                var DrawButton = new Button() { Text = "Draw", Left = LoadButton.Left + LoadButton.Width };
                DrawButton.Click += Draw_Click;
    
                Panel p = new Panel() { Height = ClearButton.Height, Dock = DockStyle.Bottom };
                p.Controls.AddRange(new[] { ClearButton, SaveButton, LoadButton, DrawButton });
    
                this.Controls.Add(inkPicture1);
                this.Controls.Add(p);
    
    
                var f2=new Form2();
                f2.Show();
            }
    
            /// <summary>消去</summary>
            private void Clear_Click(object sender, EventArgs e)
            {
                this.inkPicture1.Ink.DeleteStrokes();
                this.inkPicture1.Refresh();
            }
    
            byte[] saved;
    
            /// <summary>現在状態の保存</summary>
            private void Save_Click(object sender, EventArgs e)
            {
                var ink = this.inkPicture1.Ink;
                saved = ink.Save();
            }
    
            /// <summary>保存した状態に復元</summary>
            private void Load_Click(object sender, EventArgs e)
            {
                if (saved != null)
                {
                    var ink = new Microsoft.Ink.Ink();
                    ink.Load(saved);
    
                    this.inkPicture1.InkEnabled = false;
                    this.inkPicture1.Ink = ink;
                    this.inkPicture1.InkEnabled = true;
                }
            }
    
            /// <summary>プログラムでストローク追加</summary>
            private void Draw_Click(object sender, EventArgs e)
            {
                Point[] ps = new[] { new Point(0, 0), new Point(500, 500), new Point(200, 0), new Point(0, 0) };
                var stroke = this.inkPicture1.Ink.CreateStroke(ps);
                this.inkPicture1.Refresh();//表示更新
            }
    
    
        }
    }

    Microsoft InkPicture Control版

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            //Microsoft InkPicture Control版 (COM)
            private AxMSINKAUTLib.AxInkPicture axInkPicture1;
            public Form1()
            {
                //InitializeComponent();
    
                this.Text = "Microsoft InkPicture Control版 ";
    
                axInkPicture1 = new AxMSINKAUTLib.AxInkPicture() { Dock = DockStyle.Fill, BackColor = Color.White };
    
    
                var ClearButton = new Button() { Text = "Clear" };
                ClearButton.Click += Clear_Click;
                var SaveButton = new Button() { Text = "Save", Left = ClearButton.Left + ClearButton.Width };
                SaveButton.Click += Save_Click;
                var LoadButton = new Button() { Text = "Load", Left = SaveButton.Left + SaveButton.Width };
                LoadButton.Click += Load_Click;
                var DrawButton = new Button() { Text = "Draw", Left = LoadButton.Left + LoadButton.Width };
                DrawButton.Click += Draw_Click;
    
                Panel p = new Panel() { Height = ClearButton.Height, Dock = DockStyle.Bottom };
                p.Controls.AddRange(new[] { ClearButton, SaveButton, LoadButton, DrawButton });
    
                this.Controls.Add(axInkPicture1);
                this.Controls.Add(p);
            }
    
            /// <summary>消去</summary>
            private void Clear_Click(object sender, EventArgs e)
            {
                this.axInkPicture1.Ink.DeleteStrokes();
                this.axInkPicture1.Refresh();
            }
    
            byte[] saved;
    
            /// <summary>現在状態の保存</summary>
            private void Save_Click(object sender, EventArgs e)
            {
                var ink = this.axInkPicture1.Ink;
                saved = (byte[])ink.Save();
            }
    
            /// <summary>保存した状態に復元</summary>
            private void Load_Click(object sender, EventArgs e)
            {
                if (saved != null)
                {
                    var ink = (MSINKAUTLib.InkDisp)new MSINKAUTLib.Ink();
                    ink.Load(saved);
    
                    this.axInkPicture1.InkEnabled = false;
                    this.axInkPicture1.Ink = ink;
                    this.axInkPicture1.InkEnabled = true;
                }
            }
    
            /// <summary>プログラムでストローク追加</summary>
            private void Draw_Click(object sender, EventArgs e)
            {
                Point[] ps = new[] { new Point(0, 0), new Point(500, 500), new Point(200, 0), new Point(0, 0) };
    
                int[] array = new int[ps.Length * 2];
                int i = 0;
                foreach (Point p in ps)
                {
                    array[i++] = p.X;
                    array[i++] = p.Y;
                }
                this.axInkPicture1.Ink.CreateStroke(array, null);
                this.axInkPicture1.Refresh();//表示更新
            }
    
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2016年9月15日 3:46

すべての返信

  • COM参照でのInkPicureは型情報が難しいので、.Net版であるMicrosoft.Ink.dllを参照した方が楽です。
    $C:\Program Files (x86)\Common Files\Microsoft Shared\Ink\Microsoft.Ink.dllにあると思います

    Microsoft.Ink.dll版

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            //Microsoft.Ink.dll版 (.Net)
            private Microsoft.Ink.InkPicture inkPicture1;
    
    
            public Form1()
            {
                //InitializeComponent();
    
                this.Text="Microsoft.Ink.dll版";
                inkPicture1 = new Microsoft.Ink.InkPicture() { Dock = DockStyle.Fill, BackColor = Color.White };
    
    
                var ClearButton = new Button() { Text = "Clear" };
                ClearButton.Click += Clear_Click;
                var SaveButton = new Button() { Text = "Save", Left = ClearButton.Left + ClearButton.Width };
                SaveButton.Click += Save_Click;
                var LoadButton = new Button() { Text = "Load", Left = SaveButton.Left + SaveButton.Width };
                LoadButton.Click += Load_Click;
                var DrawButton = new Button() { Text = "Draw", Left = LoadButton.Left + LoadButton.Width };
                DrawButton.Click += Draw_Click;
    
                Panel p = new Panel() { Height = ClearButton.Height, Dock = DockStyle.Bottom };
                p.Controls.AddRange(new[] { ClearButton, SaveButton, LoadButton, DrawButton });
    
                this.Controls.Add(inkPicture1);
                this.Controls.Add(p);
    
    
                var f2=new Form2();
                f2.Show();
            }
    
            /// <summary>消去</summary>
            private void Clear_Click(object sender, EventArgs e)
            {
                this.inkPicture1.Ink.DeleteStrokes();
                this.inkPicture1.Refresh();
            }
    
            byte[] saved;
    
            /// <summary>現在状態の保存</summary>
            private void Save_Click(object sender, EventArgs e)
            {
                var ink = this.inkPicture1.Ink;
                saved = ink.Save();
            }
    
            /// <summary>保存した状態に復元</summary>
            private void Load_Click(object sender, EventArgs e)
            {
                if (saved != null)
                {
                    var ink = new Microsoft.Ink.Ink();
                    ink.Load(saved);
    
                    this.inkPicture1.InkEnabled = false;
                    this.inkPicture1.Ink = ink;
                    this.inkPicture1.InkEnabled = true;
                }
            }
    
            /// <summary>プログラムでストローク追加</summary>
            private void Draw_Click(object sender, EventArgs e)
            {
                Point[] ps = new[] { new Point(0, 0), new Point(500, 500), new Point(200, 0), new Point(0, 0) };
                var stroke = this.inkPicture1.Ink.CreateStroke(ps);
                this.inkPicture1.Refresh();//表示更新
            }
    
    
        }
    }

    Microsoft InkPicture Control版

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            //Microsoft InkPicture Control版 (COM)
            private AxMSINKAUTLib.AxInkPicture axInkPicture1;
            public Form1()
            {
                //InitializeComponent();
    
                this.Text = "Microsoft InkPicture Control版 ";
    
                axInkPicture1 = new AxMSINKAUTLib.AxInkPicture() { Dock = DockStyle.Fill, BackColor = Color.White };
    
    
                var ClearButton = new Button() { Text = "Clear" };
                ClearButton.Click += Clear_Click;
                var SaveButton = new Button() { Text = "Save", Left = ClearButton.Left + ClearButton.Width };
                SaveButton.Click += Save_Click;
                var LoadButton = new Button() { Text = "Load", Left = SaveButton.Left + SaveButton.Width };
                LoadButton.Click += Load_Click;
                var DrawButton = new Button() { Text = "Draw", Left = LoadButton.Left + LoadButton.Width };
                DrawButton.Click += Draw_Click;
    
                Panel p = new Panel() { Height = ClearButton.Height, Dock = DockStyle.Bottom };
                p.Controls.AddRange(new[] { ClearButton, SaveButton, LoadButton, DrawButton });
    
                this.Controls.Add(axInkPicture1);
                this.Controls.Add(p);
            }
    
            /// <summary>消去</summary>
            private void Clear_Click(object sender, EventArgs e)
            {
                this.axInkPicture1.Ink.DeleteStrokes();
                this.axInkPicture1.Refresh();
            }
    
            byte[] saved;
    
            /// <summary>現在状態の保存</summary>
            private void Save_Click(object sender, EventArgs e)
            {
                var ink = this.axInkPicture1.Ink;
                saved = (byte[])ink.Save();
            }
    
            /// <summary>保存した状態に復元</summary>
            private void Load_Click(object sender, EventArgs e)
            {
                if (saved != null)
                {
                    var ink = (MSINKAUTLib.InkDisp)new MSINKAUTLib.Ink();
                    ink.Load(saved);
    
                    this.axInkPicture1.InkEnabled = false;
                    this.axInkPicture1.Ink = ink;
                    this.axInkPicture1.InkEnabled = true;
                }
            }
    
            /// <summary>プログラムでストローク追加</summary>
            private void Draw_Click(object sender, EventArgs e)
            {
                Point[] ps = new[] { new Point(0, 0), new Point(500, 500), new Point(200, 0), new Point(0, 0) };
    
                int[] array = new int[ps.Length * 2];
                int i = 0;
                foreach (Point p in ps)
                {
                    array[i++] = p.X;
                    array[i++] = p.Y;
                }
                this.axInkPicture1.Ink.CreateStroke(array, null);
                this.axInkPicture1.Refresh();//表示更新
            }
    
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2016年9月15日 3:46
  • ご回答頂きましてありがとうございました。助かりました。

    頂いたコードで線の描画等が出来るのを確認したのと、DLL版を利用してさらに調査している所です。gekka さんのおかげで解決する事ができました。

    動かしていると別の問題が出てきたのですが、このスレッドの趣旨と少し違ってしまうので、別スレッドにしようと思います。大変ありがとうございました。

    2016年9月20日 9:00