前回、前々回とフォトビューアーを自作してきましたが、
今回はスライドショーができるようにします。
まず前回作成したアプリではファイルの登録がひとつずつしかできませんでした。複数のファイルをドラッグ&ドロップすればすべて登録できるようにします。
複数のファイルはソートして追加しています。また最後尾ではなく中間に追加するときは、listBox1.Items.Insert(index, path);では順序が逆になってしまうので、最初に降べきの順にソートしています。
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 Form1 : Form { private void listBox1_DragDrop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { string[] vs = (string[])e.Data.GetData(DataFormats.FileDrop); Point point = listBox1.PointToClient(new Point(e.X, e.Y)); int index = listBox1.IndexFromPoint(point); if (index == -1) { var files = vs.OrderBy(x => x); foreach (var path in files) listBox1.Items.Add(path); } else { var files = vs.OrderByDescending(x => x); foreach (var path in files) listBox1.Items.Insert(index, path); } } if (e.Data.GetDataPresent(typeof(int))) { // ListNox内部のドラッグ&ドロップの処理は省略 } } } |
あとファイルをコピーしてペーストしても登録できるようにしました。Ctrl+Vを押せば、複数ファイルを登録できます。
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 |
public partial class Form1 : Form { private void listBox1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.V && e.Control) { List<string> vs = new List<string>(); if (Clipboard.ContainsFileDropList()) { var files = Clipboard.GetFileDropList(); foreach (var str in files) vs.Add(str); int index = listBox1.SelectedIndex; if (index == -1) { listBox1.Items.AddRange(vs.OrderBy(x => x).ToArray()); } else { var vs1 = vs.OrderByDescending(x => x); foreach (string str in vs1) listBox1.Items.Insert(index, str); } } } } } |
スライドショーをするのはリストボックスの現在選択されている項目を一定時間おきにずらしていけばよい、最後まで来たら最初に戻る。これでいいと思います。
まずツールバーに開始と終了のためのメニューを追加します。またタイマーをつくります。
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 |
public partial class Form1 : Form { Timer timer = new Timer(); public Form1() { toolStripSplitButtonSlideshow.DropDownItems.Clear(); toolStripSplitButtonSlideshow.DropDownItems.Add("スタート", null, OnStartClick); toolStripSplitButtonSlideshow.DropDownItems.Add("ストップ", null, OnStopClick); timer.Tick += Timer_Tick; } void OnStartClick(object sender, EventArgs e) { timer.Interval = 2000; timer.Start(); } void OnStopClick(object sender, EventArgs e) { timer.Stop(); } private void Timer_Tick(object sender, EventArgs e) { int count = listBox1.Items.Count; if (count == 0) return; int i = listBox1.SelectedIndex; if (count > i + 1) listBox1.SelectedIndex++; else listBox1.SelectedIndex = 0; } } |
それからツールバーにNumericUpDownコントロールが張り付いていますが、これは
ToolStrip(ツールバー、メニュー、ステータスバー)に任意のコントロールを配置する
自作したToolStripItemをVisual Studioのデザイナで表示する
で紹介されている方法を使えば可能です。
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 |
[System.Windows.Forms.Design.ToolStripItemDesignerAvailability( System.Windows.Forms.Design.ToolStripItemDesignerAvailability.ToolStrip | System.Windows.Forms.Design.ToolStripItemDesignerAvailability.StatusStrip)] public class ToolStripNumericUpDown : ToolStripControlHost { public ToolStripNumericUpDown() : base(new NumericUpDown()) { NumericUpDown.ValueChanged += NumericUpDown_ValueChanged; } public event EventHandler ValueChanged; private void NumericUpDown_ValueChanged(object sender, EventArgs e) { ValueChanged?.Invoke(this, new EventArgs()); } public NumericUpDown NumericUpDown { get { return (NumericUpDown)Control; } } public decimal Value { get { return NumericUpDown.Value; } set { NumericUpDown.Value = value; } } public decimal Minimum { get { return NumericUpDown.Minimum; } set { NumericUpDown.Minimum = value; } } public decimal Maximum { get { return NumericUpDown.Maximum; } set { NumericUpDown.Maximum = value; } } } |
これで値の設定と取得ができます。タイマーのインターバルは最短で0.5秒、最長で60秒です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public partial class Form1 : Form { public Form1() { toolStripNumericUpDown1.Maximum = 60 * 1000; toolStripNumericUpDown1.Minimum = 500; toolStripNumericUpDown1.Value = 2000; timer.Interval = 2000; } private void toolStripNumericUpDown1_ValueChanged(object sender, EventArgs e) { timer.Interval = (int)toolStripNumericUpDown1.Value; } private void toolStripNumericUpDown1_ValueChanged(object sender, EventArgs e) { timer.Interval = (int)toolStripNumericUpDown1.Value; } } |