キー操作で選択範囲を移動できるようにします。ショートカットキーを使うことができるようにするためにはメニューを作成して
1 2 3 4 5 6 7 |
public partial class Form1 : Form { public Form1() { SelectionMoveUpMenuItem.ShortcutKeys = Keys.A|Keys.Control; } } |
このようにすればCtrl+Aを押すことでメニューを選択したのと同じ効果を得ることができます。しかしこの方法では処理をすることができないキーがあります。AやBのキーを単独で押した場合は使えません。
1 2 3 4 5 6 7 8 |
public partial class Form1 : Form { public Form1() { SelectionMoveUpMenuItem.ShortcutKeys = Keys.A; // これでは例外が発生する } } |
Escape キーや PageDn、PageUp、その他 A Z、を単独で指定することはできないのでしょうか?
C#: Escape などのキーをショートカットキー (アクセラレータキー) として処理するには | ミルノのブログによると以下の方法があります。
1 2 3 4 5 6 7 8 9 10 |
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == Keys.Escape) { // ここにやりたいことを書く // trueを返すと本来の動作をしなくなる return false; } return base.ProcessCmdKey(ref msg, keyData); } |
UserControlImage.OnKeyDownUpメソッドなどはtrueを返すので、それ以外の動作はさせません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public partial class Form1 : Form { protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if(keyData == Keys.Up) return userControlImage1.OnKeyDownUp(); if(keyData == Keys.Down) return userControlImage1.OnKeyDownDown(); if(keyData == Keys.Right) return userControlImage1.OnKeyDownRight(); if(keyData == Keys.Left) return userControlImage1.OnKeyDownLeft(); return base.ProcessCmdKey(ref msg, keyData); } } |
以下はメニューが選択されたときのメソッドです。選択範囲を上下左右に移動させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public partial class Form1 : Form { private void SelectionMoveUpMenuItem_Click(object sender, EventArgs e) { userControlImage1.SelectionMoveUp(); } private void SelectionMoveDownMenuItem_Click(object sender, EventArgs e) { userControlImage1.SelectionMoveDown(); } private void SelectionMoveLeftMenuItem_Click(object sender, EventArgs e) { userControlImage1.SelectionMoveLeft(); } private void SelectionMoveRightMenuItem_Click(object sender, EventArgs e) { userControlImage1.SelectionMoveRight(); } } |
← → ↑ ↓キーを押すと範囲選択されている場合は選択範囲を移動させます。範囲選択されていない場合はスクロールさせます(ただし可能な場合)。
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 |
public partial class UserControlImage : UserControl { public bool OnKeyDownUp() { if(!SelectionMoveUp()) VScrollMove(-1); return true; } public bool OnKeyDownDown() { if(!SelectionMoveDown()) VScrollMove(1); return true; } public bool OnKeyDownLeft() { if(!SelectionMoveLeft()) HScrollMove(-1); return true; } public bool OnKeyDownRight() { if(!SelectionMoveRight()) HScrollMove(1); return true; } } |
実際に選択範囲を移動させるためのメソッドを示します。SelectionMoveメソッドを呼び出すことで選択範囲を移動させます。
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
public partial class UserControlImage : UserControl { public bool SelectionMoveUp() { return SelectionMove(0, -1); } public bool SelectionMoveDown() { return SelectionMove(0, 1); } public bool SelectionMoveLeft() { return SelectionMove(-1, 0); } public bool SelectionMoveRight() { return SelectionMove(1, 0); } public bool SelectionMove(int moveX, int moveY) { if(BitmapRectangle == null) return false; if(moveX != 0) BitmapRectangle.X += moveX; if(moveY != 0) BitmapRectangle.Y += moveY; Bitmap bitmap = new Bitmap(Bitmap); Graphics g = Graphics.FromImage(bitmap); if(blankBitmap != null) g.DrawImage(blankBitmap.Bitmap, blankBitmap.Location); if(blankColorPoints != null) { foreach(ColorPoint cp in blankColorPoints) bitmap.SetPixel(cp.X, cp.Y, cp.Color); } g.DrawImage(BitmapRectangle.Bitmap, BitmapRectangle.Location); g.Dispose(); Bitmap bitmap1 = DrawBoderRectangle(bitmap); bitmap.Dispose(); ShowBitmap(bitmap1); bitmap1.Dispose(); return true; } } |
これはスクロールさせるためのメソッドです。スクロールバーを動かすことができるか確認して、動かすことができる場合は動かして表示されている画像もそれにあわせて変化させます。
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 |
public partial class UserControlImage : UserControl { public bool VScrollMove(int i) { int value = vScrollBar1.Value; if(vScrollBar1.Minimum <= value + i && value + i <= vScrollBar1.Maximum) { this.vScrollBar1.Value = value + i; ShowBitmap(Bitmap); return true; } return false; } public bool HScrollMove(int i) { int value = hScrollBar1.Value; if(hScrollBar1.Minimum <= value + i && value + i <= hScrollBar1.Maximum) { this.hScrollBar1.Value = value + i; ShowBitmap(Bitmap); return true; } return false; } } |