第33回 プログレスウインドウの不都合を解消する

以前「第29回 再生フォルダ読み込みをキャンセル可能にする」でプログレスウインドウを用意した。
今回はこのウインドウで不都合が生じる部分を修正する。

例えばキャンセルボタンではなくタイトルバーの「☓」ボタンからプログレスウインドウを閉じたり、
プログレスウインドウが開いているときにメインウインドウを終了したり、
プログレスウインドウが開いているときにさらに再生フォルダの変更を行ったり
した場合など、意図しない操作をするとすぐにフリーズする。
そのためそれらの操作を禁止する。

■ProgressDlg.cs
using System;
using System.Drawing;			//追加
using System.Windows.Forms;

namespace MP3Player
{
	public partial class ProgressForm : Form
	{
		public bool bCancel
		{
			get { return _bCancel; }
		}
		bool _bCancel = false;

		public EventHandler<EventArgs> Canceled = null;

		public string strProgress
		{
			set
			{
				try
				{
					Invoke((MethodInvoker)delegate
					{
						labelProgress.Text = value;
					});
				}
				catch (Exception)
				{
				}
			}
		}

		public ProgressForm(string strTitle)
		{
			InitializeComponent();
			Text = strTitle;

			//追加
			ControlBox = false;		//タイトルバーを消す
			FormBorderStyle = FormBorderStyle.FixedSingle;

			//追加
			//フォームのドラッグでウインドウを移動する
			{
				bool _bMoving = false;
				Point _ptMouseDown = new Point(-1, -1);
				Point _ptMouseDownWindowPos = new Point(-1, -1);

				MouseDown += (sender, e) =>
				{
					if (e.Button != MouseButtons.Left)
						return;

					_ptMouseDown.X = e.X;
					_ptMouseDown.Y = e.Y;
					_ptMouseDown = PointToScreen(_ptMouseDown);
					_ptMouseDownWindowPos.X = this.Left;
					_ptMouseDownWindowPos.Y = this.Top;
					_bMoving = true;
				};

				MouseMove += (sender, e) =>
				{
					if (_bMoving)
					{
						Point tmp = new Point(e.X, e.Y);
						tmp = PointToScreen(tmp);

						this.Left = _ptMouseDownWindowPos.X - _ptMouseDown.X + tmp.X;
						this.Top = _ptMouseDownWindowPos.Y - _ptMouseDown.Y + tmp.Y;
					}
				};

				MouseUp += (sender, e) =>
				{
					_bMoving = false;
					_ptMouseDown.X = -1;
					_ptMouseDown.Y = -1;
				};
			}
		}

		//以下を追加
		public void Init()
		{
			_bCancel = false;
		}
■Form1.cs
			//フォーム右クリックメニューの設定
			{
				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.StartPosition = FormStartPosition.Manual;
								dlg.Location = new Point(Location.X + 50, Location.Y + 50);
								dlg.ShowDialog();
							}
						}),
					new ToolStripMenuItem("再生設定", null, delegate
						{
							//追加
							//読み込み中に再生フォルダ変更されるとやっかいだから読込中は設定不可に
							if (_dlgCreateFileList.Visible)
								return;

							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;
			}
			_option.FolderChanged += delegate
			{
				CreateFileListAndPlay(true);		//フォルダを読み込み、再生開始
			};
			_option.FolderChanged(null, null);		//フォルダを読み込み、再生開始


			//以下を追加
			FormClosing += (sender, e) =>
			{
				//ファイルリスト読み込み中なら終了キャンセル
				if (_dlgCreateFileList.Visible)
					e.Cancel = true;
			};
		}


		//移動/名前変更
		ProgressForm _dlgCreateFileList = new ProgressForm("再生フォルダの読み込み中");


		/// <summary>
		/// 設定フォルダから音楽ファイルリストを読み込む
		/// </summary>
		void CreateFileListAndPlay(bool bPlay)
		{
			buttonStop_Click(null, null);		//再生停止

			//再生リストのクリア
			_listPlayHistory.Clear();
			_listPlayNext.Clear();
			_nCurrentIndex = -1;

			//移動
			//ProgressForm dlg = new ProgressForm("再生フォルダの読み込み中");
			_dlgCreateFileList.Init();		//追加
			_dlgCreateFileList.StartPosition = FormStartPosition.Manual;
			_dlgCreateFileList.Location = new Point(Location.X + 50, Location.Y + 50);
			_dlgCreateFileList.Show(this);

			Thread thread = new Thread(new ThreadStart(delegate
				{
					//mp3フォルダからの音楽ファイルリスト読み込み
					_listFiles = EnumFiles(_option.strFolder, _dlgCreateFileList);

					try
					{
						Invoke((MethodInvoker)delegate
						{
							_dlgCreateFileList.Close();
						});
					}
					catch (Exception)
					{
					}

					if (bPlay)
					{
						Invoke((MethodInvoker)delegate
						{
							Play();		//再生開始
						});
					}
				}));

			thread.Start();
		}

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


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