NumericUpDown.ValueChangedイベントはユーザーが値を直接変更した場合であっても、プログラムで変更された場合でも発生します。両者を区別する方法はないのでしょうか?
c# – 変更されたイベントがユーザー入力から発生したかどうかを確認します
上記サイトによると機械翻訳されたものなのかヘンテコな文章ですが、単純な方法で区別することはできないようです。代わりの方法としてNumericUpDownがActiveControlかどうかを調べる方法があります。
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 |
public partial class FormInsertString : Form { void ShowImageString() { bool doesNumericUpDownWidthHeightActive = false; Bitmap bitmap = BitmapEx.GetBitmapRotateString(String, SelectedFont, SelectedColor, (int)numericUpDownAngle.Value); ignoreNumericUpDownValueChanged = true; if (bitmap != null) { if (numericUpDownWidth != this.ActiveControl && numericUpDownHeight != this.ActiveControl) { numericUpDownWidth.Value = bitmap.Width; numericUpDownHeight.Value = bitmap.Height; } else doesNumericUpDownWidthHeightActive = true; } else { numericUpDownWidth.Value = numericUpDownWidth.Minimum; numericUpDownHeight.Value = numericUpDownHeight.Minimum; } ignoreNumericUpDownValueChanged = false; if (!doesNumericUpDownWidthHeightActive) { scroolPictureBox1.Bitmap = bitmap; } else { int width = (int)numericUpDownWidth.Value; int height = (int)numericUpDownHeight.Value; Bitmap newBitmap = new Bitmap(width, height); Graphics g = Graphics.FromImage(newBitmap); g.DrawImage(bitmap, new Rectangle(0, 0, width, height)); g.Dispose(); scroolPictureBox1.Bitmap = newBitmap; } Bitmap = bitmap; } } |
これだけだと幅と高さをアップダウンコントロールで変更することができるのですが、ダイアログが表示されたときにもとに戻ってしまいます。そこでダイアログがロードされたときの処理も変更しないといけません。
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 |
public partial class FormInsertString : Form { private void FormInsertString_Load(object sender, EventArgs e) { if (Layer != null) { ignoreNumericUpDownValueChanged = true; { textBoxLayerName.Text = Layer.Name; numericUpDownAngle.Value = Layer.Angle; String = Layer.String; SelectedColor = Color.FromArgb(Layer.SelectColorArgb); SelectedFont = new Font(Layer.FontName, Layer.FontSize); numericUpDownHeight.Value = Layer.Height; numericUpDownWidth.Value = Layer.Width; numericUpDownX.Value = Layer.X; numericUpDownY.Value = Layer.Y; textBox1.Text = String; } ignoreNumericUpDownValueChanged = false; ShowImageString2(); } } void ShowImageString2() { // ShowImageString()との違いは生成されたBitmapがnumericUpDownの値を決めるのではなく // numericUpDownの値でBitmapのサイズを決めること Bitmap bitmap = BitmapEx.GetBitmapRotateString(String, SelectedFont, SelectedColor, (int)numericUpDownAngle.Value); if (bitmap != null) { int width = (int)numericUpDownWidth.Value; int height = (int)numericUpDownHeight.Value; Bitmap newBitmap = new Bitmap(width, height); Graphics g = Graphics.FromImage(newBitmap); g.DrawImage(bitmap, new Rectangle(0, 0, width, height)); g.Dispose(); scroolPictureBox1.Bitmap = newBitmap; } else { ignoreNumericUpDownValueChanged = true; numericUpDownWidth.Value = numericUpDownWidth.Minimum; numericUpDownHeight.Value = numericUpDownHeight.Minimum; ignoreNumericUpDownValueChanged = false; } Bitmap = bitmap; } } |
ShowImageString2()メソッドを作成した以上は以下のようにしてしまえばスッキリします(いったい何を面倒なことをしてたのだ?)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public partial class FormInsertString : Form { private void numericUpDownWidth_ValueChanged(object sender, EventArgs e) { if (!ignoreNumericUpDownValueChanged) { ShowImageString2(); MoveLayer(); } } private void numericUpDownHeight_ValueChanged(object sender, EventArgs e) { if (!ignoreNumericUpDownValueChanged) { ShowImageString2(); MoveLayer(); } } } |
それから問題はまだあります。フォントを変更したときや文字列を変更したときも幅と高さの設定がもとに戻ってしまいます。
まず色が変更されるときですが、これは ShowImageString()の代わりに ShowImageString2()を呼べば解決します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public partial class FormInsertString : Form { private void buttonColor_Click(object sender, EventArgs e) { ColorDialog dialog = new ColorDialog(); dialog.Color = SelectedColor; if (dialog.ShowDialog() == DialogResult.OK) { SelectedColor = dialog.Color; ShowImageString2(); MoveLayer(); } dialog.Dispose(); } } |
問題は文字列の長さや角度、フォントの大きさが変更されるときです。このときはBitmapEx.GetBitmapRotateStringメソッドが返すBitmapのサイズと実際に表示されるBitmapのサイズの比を調べて適切な値をnumericUpDownWidthとnumericUpDownHeightに設定するというのはどうでしょうか?
ShowImageString2()が呼び出されたときにBitmapのサイズの比を調べて、ShowImageString()が呼び出されたらその比で新しいBitmapを生成します。
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 55 56 57 58 59 60 61 |
public partial class FormInsertString : Form { Bitmap Bitmap = null; double WidthExtend = 1.0; double HeightExtend = 1.0; void ShowImageString2() { Bitmap bitmap = BitmapEx.GetBitmapRotateString(String, SelectedFont, SelectedColor, (int)numericUpDownAngle.Value); if (bitmap != null) { int width = (int)numericUpDownWidth.Value; int height = (int)numericUpDownHeight.Value; Bitmap newBitmap = new Bitmap(width, height); Graphics g = Graphics.FromImage(newBitmap); g.DrawImage(bitmap, new Rectangle(0, 0, width, height)); g.Dispose(); scroolPictureBox1.Bitmap = newBitmap; // 比を調べる WidthExtend = 1d * newBitmap.Width / bitmap.Width; HeightExtend = 1d * newBitmap.Height / bitmap.Height; } else { ignoreNumericUpDownValueChanged = true; numericUpDownWidth.Value = numericUpDownWidth.Minimum; numericUpDownHeight.Value = numericUpDownHeight.Minimum; ignoreNumericUpDownValueChanged = false; } Bitmap = bitmap; } void ShowImageString() { Bitmap bitmap = BitmapEx.GetBitmapRotateString(String, SelectedFont, SelectedColor, (int)numericUpDownAngle.Value); ignoreNumericUpDownValueChanged = true; if (bitmap != null) { numericUpDownWidth.Value = (int)(bitmap.Width * WidthExtend); numericUpDownHeight.Value = (int)(bitmap.Height * HeightExtend); int width = (int)numericUpDownWidth.Value; int height = (int)numericUpDownHeight.Value; Bitmap newBitmap = new Bitmap(width, height); Graphics g = Graphics.FromImage(newBitmap); g.DrawImage(bitmap, new Rectangle(0, 0, width, height)); g.Dispose(); scroolPictureBox1.Bitmap = newBitmap; } else { numericUpDownWidth.Value = numericUpDownWidth.Minimum; numericUpDownHeight.Value = numericUpDownHeight.Minimum; } ignoreNumericUpDownValueChanged = false; Bitmap = bitmap; } } |