前回作成した付箋紙ソフトは付箋のサイズを変更することができませんでした。今回はサイズ変更に対応させます。簡単にするために付箋状態になったオブジェクトのサイズ変更は下、右、右下方向のみに変更することができる仕様にします。
マウスキャプチャされていない状態でマウスが移動したときはサイズ変更可能な位置にマウスポインタがあるかどうかを調べます。
マウスが境界線の上にあるときはマウスカーソルの形状を変更し、サイズ変更が可能であることがわかるようにします。
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 |
public partial class Form2 : Form { // サイズ変更中であることを示すフラグ bool isSizeChanging = false; private void Form2_MouseMove(object sender, MouseEventArgs e) { if(this.FormBorderStyle == FormBorderStyle.None) { Point point = Control.MousePosition; int x1 = point.X - oldMousePosX; int y1 = point.Y - oldMousePosY; oldMousePosX = point.X; oldMousePosY = point.Y; if(isSizeChanging) { SizeChangeForm(x1, y1); return; } if(this.Capture == true) { MoveForm(x1, y1); return; } if(this.Capture == false) { if(CanReisizeSouthEast()) Cursor = Cursors.SizeNWSE; else if(CanReisizeSouth()) Cursor = Cursors.SizeNS; else if(CanReisizeEast()) Cursor = Cursors.SizeWE; else Cursor = Cursors.Default; } } } } |
これがじっさいにサイズ変更可能であるかどうかを判定するメソッドです。
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 |
public partial class Form2 : Form { bool CanReisizeSouthEast() { if(this.FormBorderStyle == FormBorderStyle.None) { Rectangle rect = new Rectangle(this.Location, this.Size); int x = Control.MousePosition.X; int y = Control.MousePosition.Y; if(rect.Right - 10 < x && x < rect.Right && rect.Bottom - 10 < y && y < rect.Bottom) { return true; } } return false; } bool CanReisizeSouth() { if(this.FormBorderStyle == FormBorderStyle.None) { Rectangle rect = new Rectangle(this.Location, this.Size); int x = Control.MousePosition.X; int y = Control.MousePosition.Y; if(rect.Bottom - 10 < y && y < rect.Bottom) { return true; } } return false; } bool CanReisizeEast() { if(this.FormBorderStyle == FormBorderStyle.None) { Rectangle rect = new Rectangle(this.Location, this.Size); int x = Control.MousePosition.X; if(rect.Right - 10 < x && x < rect.Right) { return true; } } return false; } } |
そしてサイズ変更可能な位置でマウスボタンが押されたときはサイズ変更のための処理をおこないます。
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 |
public partial class Form2 : Form { bool isSizeChanging = false; private void Form2_MouseDown(object sender, MouseEventArgs e) { if(this.FormBorderStyle == FormBorderStyle.None) { if(CanReisizeSouthEast() || CanReisizeEast() || CanReisizeSouth()) { isSizeChanging = true; // マウスの座標を記憶する Point point = Control.MousePosition; oldMousePosX = point.X; oldMousePosY = point.Y; // フラグをセット if(CanReisizeSouthEast()) isSizeChangingSE = true; else if(CanReisizeSouth()) isSizeChangingS = true; else if(CanReisizeEast()) isSizeChangingE = true; } } } } |
isSizeChanging フラグがtrueになるとイベントハンドラForm2_MouseMoveのなかでSizeChangeFormメソッドが呼ばれます。このメソッドはサイズを変更するためのものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public partial class Form2 : Form { void SizeChangeForm(int x, int y) { Size size = this.Size; if(isSizeChangingS) { size.Width += x; size.Height += y; } else if(isSizeChangingE) size.Width += x; else if(isSizeChangingSE) size.Height += y; this.Size = size; } } |
ドラッグが終わったらマウスキャプチャが解除されますが、そのときにサイズ変更のためのフラグをもとに戻します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public partial class Form2 : Form { public Form2() { // コンストラクタ内にこれを追加する MouseCaptureChanged += Form2_MouseCaptureChanged; } private void Form2_MouseCaptureChanged(object sender, EventArgs e) { if(!this.Capture) { isSizeChanging = false; isSizeChangingS = false; isSizeChangingE = false; isSizeChangingSE = false; } } } |
ほかにも考えないといけないことがあります。付箋をつくるたびにそれがタスクバーに表示されると使いにくくなるのでそうならないようにForm2.ShowInTaskbarプロパティは falseにします。またこの場合、最小化してしまうともとに戻せないので最小化ボタンを無効にします。
SizeChangeForm(int x, int y)メソッドではサイズをゼロにすることもできます。これではもとに戻せなくなるのでMinimumSizeも Size(200, 60)くらいを指定したほうがよいと思います。
そこでコンストラクタは以下のようにしました。
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 |
public partial class Form2 : Form { public Form2() { InitializeComponent(); this.Controls.Add(label1); // 付箋紙のサイズ変更をするために必要 MouseMove += Form2_MouseMove; MouseDown += Form2_MouseDown; MouseCaptureChanged += Form2_MouseCaptureChanged; label1.MouseMove += Label1_MouseMove; label1.MouseDown += Label1_MouseDown; label1.MouseUp += Label1_MouseUp; // 付箋を編集するために必要 label1.DoubleClick += Label1_DoubleClick; // サイズがゼロにならないようにする MinimumSize = new Size(200, 60); // 最小化してしまうともとに戻せないので最小化ボタンを無効にする MinimizeBox = false; // 付箋紙をつくるたびにタスクバーにも表示されないようにする ShowInTaskbar = false; // フォームのサイズ変更がおこなわれたでもコントロールの相対位置が変わらないようにする textBox1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; buttonOK.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; // 付箋紙のサイズ変更がおこなわれたでもラベルが中央におさまるようにする // 上下左右のマージンは15ピクセル label1.Location = new Point(15, 15); Size size = this.ClientSize; size.Width -= 30; size.Height -= 30; label1.Size = size; label1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; label1.BorderStyle = BorderStyle.FixedSingle; label1.Visible = false; } } |
それから付箋紙状態と文章編集のときのフォームのサイズでは適切なサイズが違います。そこで付箋紙状態とフォームの状態のそれぞれのサイズを記憶しておき、状態が変化するときは記憶しておいたサイズに変更されるようにします。
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 |
public partial class Form2 : Form { int oldFormWidth = 0; int oldFormHeight = 0; int oldFusenWidth = 0; int oldFusenHeight = 0; void FormToFusen() { // フォームが付箋紙になるときにサイズを記憶しておく oldFormWidth = this.Size.Width; oldFormHeight = this.Size.Height; // もし記憶されている付箋紙のサイズがあるならこれを適用する if(oldFusenWidth != 0 && oldFusenHeight != 0) this.Size = new Size(oldFusenWidth, oldFusenHeight); FormBorderStyle = FormBorderStyle.None; textBox1.Visible = false; label1.Visible = true; label1.AutoSize = false; label1.Text = textBox1.Text; buttonOK.Visible = false; menuStrip1.Visible = false; } void FusenToForm() { // 付箋紙がフォーム形式に変更されるときにサイズを記憶しておく oldFusenWidth = this.Size.Width; oldFusenHeight = this.Size.Height; // 記憶されていたフォームのサイズを適用する Size size = new Size(oldFormWidth, oldFormHeight); this.Size = size; FormBorderStyle = FormBorderStyle.Sizable; textBox1.Visible = true; label1.Visible = false; buttonOK.Visible = true; menuStrip1.Visible = true; } } |