第23回 再生条件設定画面を作る

今回は再生条件の設定ウインドウを作成します。

設定できる再生条件はおおまかに以下のようにします。
・音楽ファイルを追加した期間指定
・レーティング指定
・再生フォルダ変更

「プロジェクト」メニューから「Windowsフォームの追加」を選択し、「PlayConditionForm.cs」を追加します。

期間指定の開始を示す数値入力欄「numericUpDownPlayDayStart」
期間指定の最後を示す数値入力欄「numericUpDownPlayDayEnd」
をそれぞれMax=10000に設定(1万日=27年相当)。

曲レーティング指定の開始を示す数値入力欄「numericUpDownRatingStart」
曲レーティング指定の最後を示す数値入力欄「numericUpDownRatingEnd」
をそれぞれMax=5に設定(5=★★★★★)。

アーティストレーティング指定の開始を示す数値入力欄「numericUpDownRatingArtistStart」
アーティストレーティング指定の最後を示す数値入力欄「numericUpDownRatingArtistEnd」
をそれぞれMax=5に設定(5=★★★★★)。

再生フォルダを表示するテキストボックス「textBoxFolder」
再生フォルダを指定するボタン「buttonSelectFolder」
を作成。

OKボタン用の「buttonOk」
キャンセルボタン用の「buttonCancel」
を配置し、それぞれフォームのAcceptButtonとCancelButtonに割り当てる。

各ボタンはダブルクリックをしてイベントハンドラーを作成し、コードを追加。
そしてOptionクラスに各値保存用のプロパティを追加し、フォームの右クリックメニューでそのフォームが表示されるようにしたら完成。
各設定値に応じた再生条件設定の適用は次回以降へ持ち越し。

023_1.png

■PlayConditionForm.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MP3Player
{
	public partial class PlayConditionForm : Form
	{
		public PlayConditionForm()
		{
			InitializeComponent();

			textBoxFolder.ReadOnly = true;
			textBoxFolder.Text = Form1._option.strFolder;

			numericUpDownPlayDayStart.Value = Form1._option.nPlayDayStart;
			numericUpDownPlayDayEnd.Value = Form1._option.nPlayDayEnd;

			numericUpDownRatingStart.Value = Form1._option.nPlayRatingStart;
			numericUpDownRatingEnd.Value = Form1._option.nPlayRatingEnd;

			numericUpDownRatingArtistStart.Value = Form1._option.nPlayRatingArtistStart;
			numericUpDownRatingArtistEnd.Value = Form1._option.nPlayRatingArtistEnd;
		}


		private void buttonSelectFolder_Click(object sender, EventArgs e)
		{
			FolderBrowserDialog dlg = new FolderBrowserDialog();

			dlg.Description = "再生フォルダの選択";
			dlg.RootFolder = Environment.SpecialFolder.Desktop;
			dlg.SelectedPath = textBoxFolder.Text;
			dlg.ShowNewFolderButton = false;

			DialogResult ret = dlg.ShowDialog(this);
			if (ret == DialogResult.OK)
			{
				textBoxFolder.Text = dlg.SelectedPath;
			}
		}

		private void buttonOk_Click(object sender, EventArgs e)
		{
			Form1._option.strFolder = textBoxFolder.Text;

			Form1._option.nPlayDayStart = (int)numericUpDownPlayDayStart.Value;
			Form1._option.nPlayDayEnd = (int)numericUpDownPlayDayEnd.Value;

			Form1._option.nPlayRatingStart = (int)numericUpDownRatingStart.Value;
			Form1._option.nPlayRatingEnd = (int)numericUpDownRatingEnd.Value;

			Form1._option.nPlayRatingArtistStart = (int)numericUpDownRatingArtistStart.Value;
			Form1._option.nPlayRatingArtistEnd = (int)numericUpDownRatingArtistEnd.Value;

			Close();
		}

		private void buttonCancel_Click(object sender, EventArgs e)
		{
			Close();
		}
	}
}
■Option.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace MP3Player
{
	[Serializable]
	public class AudioItem
	{
		public string strFile = "";
		public int nEntryIndex = -1;

		public AudioItem()
		{
		}

		public AudioItem(string strFile, int nEntryIndex = -1)
		{
			this.strFile = strFile;
			this.nEntryIndex = nEntryIndex;
		}
	}


	[Serializable]
	public class RatingItem : AudioItem
	{
		public int nRating = 0;

		public RatingItem()
		{
		}

		public RatingItem(string strFile, int nEntryIndex, int nRating)
			: base(strFile, nEntryIndex)
		{
			this.nRating = nRating;
		}
	}


	[Serializable]
	public class RatingArtistItem
	{
		public string strArtist = "";
		public int nRating = 0;

		public RatingArtistItem()
		{
		}

		public RatingArtistItem(string strArtist, int nRating)
		{
			this.strArtist = strArtist;
			this.nRating = nRating;
		}
	}





	[Serializable]
	public class Option
	{
		void AfterLoaded()
		{
			//デフォルトでカラオケ曲などをNG指定
			AddNGWord("カラオケ");
			AddNGWord("karaoke");
			AddNGWord("inst.");
			AddNGWord("instrum");
			AddNGWord("トイレの神様");
		}

		public int nVolume
		{
			get { return _nVolume; }
			set { _nVolume = value; }
		}
		int _nVolume = 20;


		public string strFolder
		{
			get { return _strFolder; }
			set { _strFolder = value; }
		}
		string _strFolder = @"G:\Desktop\mp3\";

		//以下を追加
		/// <summary>
		/// 再生するファイル追加開始日
		/// 
		/// 指定した日数よりも前に追加された音楽ファイルは再生しない
		/// ゼロならこの設定は無視
		/// 例えば「180に設定した場合は、最近180日以内に追加したものが再生対象」
		/// </summary>
		public int nPlayDayStart
		{
			get { return _nPlayDayStart; }
			set { _nPlayDayStart = value; }
		}
		int _nPlayDayStart = 0;

		//以下を追加
		/// <summary>
		/// 再生するファイル追加終了日
		/// 
		/// 指定した日数よりも後に追加された音楽ファイルは再生しない
		/// ゼロならこの設定は無視
		/// 例えば「180に設定した場合は、180日以上古いものが再生対象」
		/// </summary>
		public int nPlayDayEnd
		{
			get { return _nPlayDayEnd; }
			set { _nPlayDayEnd = value; }
		}
		int _nPlayDayEnd = 0;

		//以下を追加
		/// <summary>
		/// 再生する最低レーティング
		/// 
		/// 例えば「1ならレーティング1以上の曲を再生」
		/// </summary>
		public int nPlayRatingStart
		{
			get { return _nPlayRatingStart; }
			set { _nPlayRatingStart = value; }
		}
		int _nPlayRatingStart = 0;

		//以下を追加
		/// <summary>
		/// 再生する最高レーティング
		/// 
		/// 例えば「1ならレーティング1以下の曲=レーティング1もしくはゼロの曲を再生」
		/// </summary>
		public int nPlayRatingEnd
		{
			get { return _nPlayRatingEnd; }
			set { _nPlayRatingEnd = value; }
		}
		int _nPlayRatingEnd = 5;

		//以下を追加
		/// <summary>
		/// 再生する最低アーティストレーティング
		/// 
		/// 例えば「1ならレーティング1以上のアーティストの曲を再生」
		/// </summary>
		public int nPlayRatingArtistStart
		{
			get { return _nPlayRatingArtistStart; }
			set { _nPlayRatingArtistStart = value; }
		}
		int _nPlayRatingArtistStart = 0;

		//以下を追加
		/// <summary>
		/// 再生する最高アーティストレーティング
		/// 
		/// 例えば「1ならレーティング1以下のアーティスト曲=レーティング1もしくはゼロの曲を再生」
		/// </summary>
		public int nPlayRatingArtistEnd
		{
			get { return _nPlayRatingArtistEnd; }
			set { _nPlayRatingArtistEnd = value; }
		}
		int _nPlayRatingArtistEnd = 5;
■Form1.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Windows.Forms;
using WMPLib;

namespace MP3Player
{
	public partial class Form1 : Form
	{
		WindowsMediaPlayer _mediaPlayer = new WindowsMediaPlayer();

		Timer _timer = new Timer();

		public static Option _option = new Option();


		List<AudioItem> _listFiles;			//音楽ファイル一覧
		int _nCurrentIndex = -1;			//↑へのインデックス


		List<int> _listPlayHistory = new List<int>();		//過去の再生曲
		List<int> _listPlayNext = new List<int>();			//未来の再生曲。なければランダム


		bool _bStopButtonPushed = false;	//「停止」ボタンを押したらtrue

		public Form1()
		{
			InitializeComponent();

			//設定の読み込み
			Option.Load(out _option, Utility.GetExeFolder() + "option.txt");

			Utility.CreateTmpFolder();			//tmpフォルダの作成


			//mp3フォルダからの音楽ファイルリスト読み込み
			_listFiles = EnumFiles(_option.strFolder);


			//フォームが表示されたときの処理
			Shown += delegate
			{
				//シークバーにフォーカスがあると、再生位置が表示されないのでここで再生ボタンにフォーカスを与える
				buttonPlay.Focus();
			};


			//フォーム右クリックメニューの設定
			{
				ContextMenuStrip menu = new ContextMenuStrip();

				ToolStripItem[] stripItem = new ToolStripMenuItem[]
				{
					new ToolStripMenuItem("曲レーティング",null,new ToolStripMenuItem[]
					{
						new ToolStripMenuItem("なし", null, delegate
							{
								SetRating(0);
							}),
						new ToolStripMenuItem("★", null, delegate
							{
								SetRating(1);
							}),
						new ToolStripMenuItem("★★", null, delegate
							{
								SetRating(2);
							}),
						new ToolStripMenuItem("★★★", null, delegate
							{
								SetRating(3);
							}),
						new ToolStripMenuItem("★★★★", null, delegate
							{
								SetRating(4);
							}),
						new ToolStripMenuItem("★★★★★", null, delegate
							{
								SetRating(5);
							}),
					}),
					new ToolStripMenuItem("アーティストレーティング",null,new ToolStripMenuItem[]
					{
						new ToolStripMenuItem("なし", null, delegate
							{
								SetRatingArtist(0);
							}),
						new ToolStripMenuItem("★", null, delegate
							{
								SetRatingArtist(1);
							}),
						new ToolStripMenuItem("★★", null, delegate
							{
								SetRatingArtist(2);
							}),
						new ToolStripMenuItem("★★★", null, delegate
							{
								SetRatingArtist(3);
							}),
						new ToolStripMenuItem("★★★★", null, delegate
							{
								SetRatingArtist(4);
							}),
						new ToolStripMenuItem("★★★★★", null, delegate
							{
								SetRatingArtist(5);
							}),
					}),
					new ToolStripMenuItem("NG登録", null, delegate
						{
							if (_nCurrentIndex >= 0)
							{
								AddNGForm dlg = new AddNGForm(_listFiles[_nCurrentIndex], labelTitle.Text, labelArtist.Text);
								dlg.ShowDialog();
							}
						}),
					new ToolStripMenuItem("再生設定", null, delegate
						{
							//以下を追加
							PlayConditionForm dlg = new PlayConditionForm();
							dlg.ShowDialog(this);
						}),
					new ToolStripMenuItem("エクスプローラー", null, delegate
						{
							if (_nCurrentIndex >= 0)
							{
								Process.Start("explorer.exe","/select,\"" + _listFiles[_nCurrentIndex].strFile + "\"");
							}
						}),
					new ToolStripMenuItem("最小化", null, delegate
						{
							if (WindowState == FormWindowState.Normal)
								WindowState = FormWindowState.Minimized;
						}),
					new ToolStripMenuItem("終了", null, delegate
						{
							Close();
						}),
				};
				menu.Items.AddRange(stripItem);

				ContextMenuStrip = menu;
			}

プロジェクトファイルをダウンロード


カテゴリー「MP3プレーヤーを作る(C#)」 のエントリー