編集している画像のうえで右クリックするとレイヤーを選択できるようにします。
Form1クラスでScroolPictureBoxクラスのPictureBoxMouseDownイベントを処理できるようにします。
|
public partial class Form1 : Form { public Form1() { InitializeComponent(); scroolPictureBox1.BorderStyle = BorderStyle.None; scroolPictureBox1.PictureBoxMouseDown += ScroolPictureBox1_PictureBoxMouseDown; MenuItemLayers.DropDownOpening += MenuItemLayers_DropDownOpening; } } |
右ボタンがクリックされたらどのレイヤーに相当する部分かしらべてコンテキストメニューを表示します。GetLayerFromPointメソッドは座標からレイヤーを取得するためのものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
public partial class Form1 : Form { private void ScroolPictureBox1_PictureBoxMouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { Layer layer = GetLayerFromPoint(new Point(e.X, e.Y)); if(layer != null) { // ContextMenuEx1クラスは後述 new ContextMenuEx1(this, layer); } return; } } Layer GetLayerFromPoint(Point pt) { // 複数のレイヤーが重なっている場合は最前面のものを取得したいので、 // Layersのなかで条件を満たすもののうち最後のものを取得する return Layers.LastOrDefault(x => x.Left < pt.X && pt.X < x.Right && x.Top < pt.Y && pt.Y < x.Bottom); } // 別のクラスからでもLayersを参照できるようにする public List<Layer> GetLayers() { return Layers; } } |
以下はコンテキストメニューを表示し、クリックされたときの処理をおこなうためのクラスです。これで編集用のダイアログが表示されます。
前回までのコードではShowStringLayerFormメソッドとShowImageLayerFormメソッドがprivateになっているのでpublicに変更しておいてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
class ContextMenuEx1 { Form1 _form; public ContextMenuEx1(Form1 form, Layer layer) { _form = form; ContextMenuStrip contextMenuStrip = CreateContextMenuStrip(layer); contextMenuStrip.Show(Control.MousePosition); } ContextMenuStrip CreateContextMenuStrip(Layer layer) { ContextMenuStrip menuStrip = new ContextMenuStrip(); AddMenuEdit(menuStrip, layer); AddMenuBack(menuStrip, layer); return menuStrip; } void AddMenuEdit(ContextMenuStrip menuStrip, Layer layer) { ToolStripMenuItem item = new ToolStripMenuItem(); item.Text = "レイヤーを編集する"; item.Tag = layer; item.Click += Item_Click1; menuStrip.Items.Add(item); } void Item_Click1(object sender, EventArgs e) { ToolStripMenuItem mi = (ToolStripMenuItem)sender; Layer layer = (Layer)mi.Tag; // ShowStringLayerFormメソッドとShowImageLayerFormメソッドをpublicにすること if (layer is StringLayer) _form.ShowStringLayerForm((StringLayer)layer); else if (layer is ImageLayer) _form.ShowImageLayerForm((ImageLayer)layer); } } |
レイヤーが重なっている場合、一番上しか選択できないのはちょっと不便です。また重なり合った部分はどれを前面にして表示するかを変更できるようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
class ContextMenuEx1 { ContextMenuStrip CreateContextMenuStrip(Layer layer) { ContextMenuStrip menuStrip = new ContextMenuStrip(); AddMenuEdit(menuStrip, layer); AddMenuBackOne(menuStrip, layer); // これを追加 return menuStrip; } void AddMenuBackOne(ContextMenuStrip menuStrip, Layer layer) { ToolStripMenuItem item = new ToolStripMenuItem(); item.Text = "レイヤーをひとつ後ろに移動する"; item.Tag = layer; item.Click += Item_Click2; menuStrip.Items.Add(item); } void Item_Click2(object sender, EventArgs e) { ToolStripMenuItem mi = (ToolStripMenuItem)sender; Layer layer = (Layer)mi.Tag; // Layer.Zは10おきになっているので11だけ減らす。 // そのあとLayer.Zが小さい順にならべて再表示する layer.Z -= 11; _form.SetLayersZ(); _form.ShowLayers(); } } |
SetLayersZ()はLayer.Zを10おきに並べなおすメソッドです。
|
public partial class Form1 : Form { public void SetLayersZ() { Layers = Layers.OrderBy(x => x.Z).ToList(); int i = 0; foreach (Layer layer in Layers) { layer.Z = i; i += 10; } } } |
鳩でも分かるC#管理人からのお願い
できる仕事であれば請け負います。鳩でもわかるC#管理人はクラウドワークスに在宅ワーカーとして登録しています。お仕事の依頼もお待ちしております。
⇒ 仕事を依頼する
コメントについて
コメントで英語などの外国語でコメントをされる方がいますが、管理人は日本語以外はわからないので基本的に内容が理解できず、承認することもありません。それからへんな薬を売っているサイトやリンク先のサイトが存在しないというスパムコメントも多々あります。
Some people make comments in foreign languages such as English, but since the manager does not understand anything other than Japanese, he basically cannot understand the content and does not approve it. Please use Japanese when making comments.
そんななか日本語のコメントもいただけるようになりました。「○○という変数はどこで宣言されているのか?」「××というメソッドはどこにあるのか」「例外が発生する」「いっそのことソース丸ごとくれ」という質問ですが、管理人としては嬉しく思います。「自分が書いた記事は読まれているんだな」と。疑問点には可能な限り答えます。記事に問題があれば修正いたします。
そのうえでお願いがあります。「匿名」という味も素っ気もない名前ではなく、捨てハンでいいのでなにかハンドルネームをつくってほしいと思います。
管理人のモチベーションアップのために
よろしければご支援お願いします。
⇒ 管理人の物乞いリスト