1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Panelなどコントロール(Control)上で右クリックをしてコンテキストメニューを開いた位置に新たにPictureBoxなどのコントロールを追加する(その1)

Last updated at Posted at 2020-04-14

 下の写真のように、水色のPanelの上で、コンテキストメニューを開き、その選択に応じて、新たにPictureBoxなどのコントロールを追加する。

 ポイントは、コンテキストメニューを開くために、右クリックした位置を取得する点である。この点については、dobon.netを参考にした。
https://dobon.net/vb/dotnet/control/cmclickpoint.html

 なお、追加したコントロールを削除したい場合は、(その2:追加したコントロールを削除する)を参照してください。

動作画像.png

// 1.コントロール(panel)上で左クリックしたときにコンテキストメニューを開き、コンテキストメニューを開いた時にあったマウスの先端に動的に新たにコントロールを作る。

// 参考資料
// https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.contextmenustrip?view=netframework-4.8

// https://dobon.net/vb/dotnet/control/cmclickpoint.html

using System;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;

namespace TestSourceControl
{
    class Form3 : Form
    {
        public static void Main()
        {
            Application.Run(new Form3());
        }

        private Panel panel;

        // panelを左クリックしたときのContextMenuStripコントロールの宣言
        private ContextMenuStrip contextMenuStripOnPanel;

        public Form3()
        {
            this.Size = new Size(800, 800);

            // panelのコンテキストメニューを宣言とコンテキストメニューを開いた時のイベントハンドラーの定義
            contextMenuStripOnPanel = new ContextMenuStrip();

            // panelの上で、右クリックをした時のコンテキストメニューを開くためのデリゲードへの登録
            contextMenuStripOnPanel.Opening += new CancelEventHandler(cms_Opening); // 必ずForm3()で宣言する

            panel = new Panel();
            panel.Location = new Point(100, 100);
            panel.Size = new Size(600, 600);
            panel.BorderStyle = BorderStyle.FixedSingle;
            panel.BackColor = Color.SkyBlue;
            panel.Parent = this;
            panel.ContextMenuStrip = contextMenuStripOnPanel;

            Label labelOnForm = new Label();
            labelOnForm.Text = " 水色のパネルの上で、右クリックをして、" + "\r\n" + "コンテキストメニューからコントロールを選択すると、" + "\r\n" + "パネル上の右クリックした際のマウスポインタの先の位置に、選択したコントロールを追加できます。" ;
            labelOnForm.AutoSize = true; ;
            labelOnForm.Location = new Point(0, 0);
            labelOnForm.Parent = this;

        }

        private Point cp;

        // panel上で右クリックをした時の処理
        void cms_Opening(object sender, CancelEventArgs e)
        {
            ContextMenuStrip menuOnPanel = (ContextMenuStrip)sender;
            
            // マウスカーソルの位置を画面座標で取得
            Point mp = MousePosition;
            cp = menuOnPanel.SourceControl.PointToClient(mp);
            Console.WriteLine(cp);

            // コンテキストメニューの表示
            contextMenuStripOnPanel.Items.Clear();
            contextMenuStripOnPanel.Items.Add("ピクチャーボックスを追加");
            contextMenuStripOnPanel.Items.Add("テキストボックスを追加");
            contextMenuStripOnPanel.Items.Add("ラベルを追加");

            contextMenuStripOnPanel.Items[0].Click += PanelMenuItems0_Click;
            contextMenuStripOnPanel.Items[1].Click += PanelMenuItems1_Click;
            contextMenuStripOnPanel.Items[2].Click += PanelMenuItems2_Click;

            // キャンセルをfalseに設定します。(イベントをキャンセルするかどうかの設定)
            // 空のエントリに基づいてtrueに最適化されます。
            e.Cancel = false;   //trueにするとコンテキスメニューが表示されない
        }

        //
        // PictureBoxをつくるイベントハンドラ
        private void PanelMenuItems0_Click(object sender, EventArgs e)
        {
            PictureBox pictureBox = new PictureBox();
            pictureBox.Location = cp;
            pictureBox.BackColor = Color.White;
            pictureBox.Size = new Size(50, 50);
            pictureBox.Image = Image.FromFile("testPicture.bmp");
            pictureBox.Parent = panel;
        }

        //
        // テキストボックスを作るイベントハンドラー 
        private void PanelMenuItems1_Click(object sender, EventArgs e)
        {
            TextBox textBox = new TextBox();
            textBox.Location = cp;
            textBox.BorderStyle = BorderStyle.FixedSingle;
            textBox.Text = "これはテキストボックスです。";
            textBox.Multiline=true;
            textBox.Size = new Size(100, 100);
            textBox.BackColor = Color.Yellow;
            textBox.Parent = panel;
        }

        //
        // ラベルを作るイベントハンドラー
        private void PanelMenuItems2_Click(object sender, EventArgs e)
        {
            Label label = new Label();
            label.Location = cp;
            label.BorderStyle = BorderStyle.FixedSingle;
            label.BackColor = Color.Pink;
            label.Text = "これはラベルです。";
            label.Parent = panel;
        }
    }
}


testPicture.png

この画像ファイルは、debugフォルダまたはbinフォルダに置いてください。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?