第36回 ツールチップを表示する

今回はウインドウのサイズを少し小さくする。
すると長いタイトルだと表示しきれないため、マウスポインターを運べばツールチップで表示されるようにする。

ついでにトラックバーはクリックしてもクリック位置に移動してくれず、使い勝手が悪いためその部分も修正した。

■Form1.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.IO.Compression;
using System.Threading;
using System.Windows.Forms;
using WMPLib;

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

		System.Windows.Forms.Timer _timer = new System.Windows.Forms.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

		ToolTip _wndToolTip = new ToolTip();		//追加

		public Form1()
		{
			InitializeComponent();

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

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


			//ウインドウ表示位置設定
			//[Ctrl]キーが押されていないときのみ設定=表示位置を復元したくないときは[Ctrl]キーを押して起動する
			if ((Control.ModifierKeys & Keys.Control) != Keys.Control)
			{
				StartPosition = FormStartPosition.Manual;
				Location = _option.ptWindowPos;
			}


			Init_FormDragMove();			//タイトルバーを消しフォームのドラッグで移動可能にする
			Init_TasktrayIcon();			//タスクトレイへの常駐化
			Init_ContextMenu();				//フォーム右クリックメニューの設定

			Init_MediaPlayer();				//WindowsMediaPlayer関連の初期化


			//以下を追加
			_wndToolTip.AutoPopDelay = 5000;		//表示される時間
			_wndToolTip.InitialDelay = 200;			//表示されるまでの時間
			_wndToolTip.ReshowDelay = 200;
			_wndToolTip.ShowAlways = true;


			_option.FolderChanged += delegate
			{
				CreateFileListAndPlay(true);		//フォルダを読み込み、再生開始
			};
			_option.FolderChanged(null, null);		//フォルダを読み込み、再生開始
		}



		/// <summary>
		/// WindowsMediaPlayer関連の初期化
		/// </summary>
		void Init_MediaPlayer()
		{
			//再生位置の手動シーク処理(シークバーの操作でシーク)
			trackBarSeek.ValueChanged += delegate
			{
				if (trackBarSeek.Focused)
				{
					_mediaPlayer.controls.currentPosition = (double)trackBarSeek.Value / 100;
				}
			};

			//以下を追加
			//トラックバーのクリック位置に応じてシークさせる
			trackBarSeek.MouseDown += (sender, e) =>
			{
				try
				{
					int nValue = trackBarSeek.Maximum * e.X / (trackBarSeek.Width - trackBarSeek.Margin.Horizontal);
					if (nValue < trackBarSeek.Minimum)
						nValue = trackBarSeek.Minimum;
					if (nValue > trackBarSeek.Maximum)
						nValue = trackBarSeek.Maximum;
					trackBarSeek.Value = nValue;
				}
				catch (Exception)
				{
				}
			};


			//音量の調節(トラックバーの操作で音量変更)
			_mediaPlayer.settings.volume = _option.nVolume;
			trackBarVolume.Maximum = 100;			//音量はゼロから100
			trackBarVolume.Value = _mediaPlayer.settings.volume;
			trackBarVolume.ValueChanged += delegate
			{
				_option.nVolume = (int)trackBarVolume.Value;
				_mediaPlayer.settings.volume = _option.nVolume;
			};


			_mediaPlayer.PlayStateChange += delegate(int nNewState)
			{
				WMPPlayState state = (WMPPlayState)nNewState;

				switch (state)
				{
					case WMPPlayState.wmppsStopped:
						buttonPlay.Text = ">";
						trackBarSeek.Value = 0;
						break;

					case WMPPlayState.wmppsPaused:
						_timer.Stop();
						buttonPlay.Text = ">";
						break;

					case WMPPlayState.wmppsPlaying:
						_bStopButtonPushed = false;
						buttonPlay.Text = "||";
						_timer.Start();
						break;

					case WMPPlayState.wmppsTransitioning:
						break;
				}
			};
		/// <summary>
		/// 曲を再生する
		/// </summary>
		void Play(bool bPlayNext = true)
		{
			if (_listFiles.Count == 0)
				return;

			if (bPlayNext || _listPlayHistory.Count == 0)
			{
				//次の曲を再生する
				if (_nCurrentIndex >= 0)
				{
					_listPlayHistory.Add(_nCurrentIndex);					//今の曲を履歴として保存
					if (_listPlayHistory.Count > 100)						//履歴の最大保存数は100
						_listPlayHistory.RemoveAt(0);
				}

				_nCurrentIndex = GetNextIndex();
			}
			else
			{
				//前の曲を再生する
				if (_nCurrentIndex >= 0)
					_listPlayNext.Insert(0, _nCurrentIndex);					//今の曲を次の曲として保存
				_nCurrentIndex = _listPlayHistory[_listPlayHistory.Count - 1];	//一番最新の履歴曲を今の曲とする
				_listPlayHistory.RemoveAt(_listPlayHistory.Count - 1);			//一番最新の履歴曲を削除
			}

			Utility.CleanTempFolder();			//tmpフォルダ内の削除

			string strFile = _listFiles[_nCurrentIndex].strFile;
			if (_listFiles[_nCurrentIndex].nEntryIndex >= 0)
			{
				//zip書庫ならtmpフォルダに解凍する
				bool ret = Utility.ExtractFileFromZip(strFile, _listFiles[_nCurrentIndex].nEntryIndex, Utility.GetTmpFile(), out strFile);
				if (ret == false)
					return;
			}

			_mediaPlayer.URL = strFile;			//再生曲をセット
			_mediaPlayer.controls.play();

			//曲名/タイトルの表示
			{
				string strTitle;
				string strArtist;
				string strAlbum;

				MP3Info.GetMp3Info(_listFiles[_nCurrentIndex], out strTitle, out strArtist, out strAlbum);

				labelTitle.Text = strTitle;
				labelArtist.Text = strArtist;

				//以下を追加
				//ラベルへツールチップス設定
				_wndToolTip.SetToolTip(labelTitle, strTitle);
				_wndToolTip.SetToolTip(labelArtist, strArtist);

				ShowRating();
			}
		}

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


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