첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형
728x170

TestProject.zip
0.01MB

▶ MainForm.cs

using System;
using System.Windows.Forms;

namespace TestProject
{
    /// <summary>
    /// 메인 폼
    /// </summary>
    public partial class MainForm : Form
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Enumeration
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 재생 상태

        /// <summary>
        /// 재생 상태
        /// </summary>
        private enum PlayStatus
        {
            /// <summary>
            /// 재생
            /// </summary>
            Play,

            /// <summary>
            /// 중단
            /// </summary>
            Stop,

            /// <summary>
            /// 중지
            /// </summary>
            Pause
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 미디어 플레이어
        /// </summary>
        private MediaPlayer.MediaPlayerClass mediaPlayer;

        /// <summary>
        /// 타이머
        /// </summary>
        private Timer timer;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - MainForm()

        /// <summary>
        /// 생성자
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            this.openFileDialog.RestoreDirectory = true;
            this.openFileDialog.CheckPathExists  = true;
            this.openFileDialog.CheckFileExists  = true;
            this.openFileDialog.Filter           = "MP3 파일(*.mp3)|*.mp3";
            this.openFileDialog.FilterIndex      = 1;
            this.openFileDialog.DefaultExt       = ".mp3";

            this.timer = new Timer();

            this.timer.Interval = 500;

            this.timer.Tick += timer_Tick;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Private
        //////////////////////////////////////////////////////////////////////////////// Event

        #region 타이머 틱 처리하기 - timer_Tick(sender, e)

        /// <summary>
        /// 타이머 틱 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void timer_Tick(object sender, EventArgs e)
        {
            this.positionTrackBar.Minimum = 0;
            this.positionTrackBar.Maximum = (int)this.mediaPlayer.Duration;
            this.positionTrackBar.Value   = (int)this.mediaPlayer.CurrentPosition;

            string currentPosition = TimeSpan.FromSeconds(this.mediaPlayer.CurrentPosition).ToString(@"hh\:mm\:ss");
            string duration        = TimeSpan.FromSeconds(this.mediaPlayer.Duration).ToString(@"hh\:mm\:ss");

            this.positionLabel.Text = $"{currentPosition} / {duration}";
        }

        #endregion

        #region MP3 파일 열기 버튼 클릭시 처리하기 - openButton_Click(sender, e)

        /// <summary>
        /// MP3 파일 열기 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void openButton_Click(object sender, EventArgs e)
        {
            if(this.openFileDialog.ShowDialog(this) == DialogResult.OK)
            {
                if(this.mediaPlayer == null)
                {
                    this.mediaPlayer = new MediaPlayer.MediaPlayerClass();
                }

                this.mediaPlayer.FileName = this.openFileDialog.FileName;

                this.mediaPlayer.Stop();

                SetPlayStatusLabelData(PlayStatus.Stop);

                this.filePathTextBox.Text = this.openFileDialog.FileName;

                this.volumeTrackBar.Value = GetTrackBarValue(-1200, 0, this.mediaPlayer.Volume);

                this.volumeLabel.Text = this.volumeTrackBar.Value.ToString();
            }
        }

        #endregion
        #region 재생 버튼 클릭시 처리하기 - playButton_Click(sender, e)

        /// <summary>
        /// 재생 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void playButton_Click(object sender, EventArgs e)
        {
            this.mediaPlayer.Play();

            this.timer.Start();

            SetPlayStatusLabelData(PlayStatus.Play);
        }

        #endregion
        #region 중단 버튼 클릭시 처리하기 - stopButton_Click(sender, e)

        /// <summary>
        /// 중단 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void stopButton_Click(object sender, EventArgs e)
        {
            this.mediaPlayer.Stop();

            this.timer.Stop();

            SetPlayStatusLabelData(PlayStatus.Stop);
        }

        #endregion
        #region 정지 버튼 클릭시 처리하기 - pauseButton_Click(sender, e)

        /// <summary>
        /// 정지 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void pauseButton_Click(object sender, EventArgs e)
        {
            this.mediaPlayer.Pause();

            SetPlayStatusLabelData(PlayStatus.Pause);
        }

        #endregion

        #region 볼륨 트랙바 스크롤시 처리하기 - volumeTrackBar_Scroll(sender, e)

        /// <summary>
        /// 볼륨 트랙바 스크롤시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void volumeTrackBar_Scroll(object sender, EventArgs e)
        {
            this.volumeLabel.Text = this.volumeTrackBar.Value.ToString();

            int volumn = GetVolume(-1200, 0, this.volumeTrackBar.Value);

            if(this.volumeTrackBar.Value == 0)
            {
                this.mediaPlayer.Mute = true;
            }
            else
            {
                this.mediaPlayer.Mute   = false;
                this.mediaPlayer.Volume = volumn;
            }
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////// Function

        #region 트랙바 값 구하기 - GetTrackBarValue(minimumVolume, maximumVolume, volume)

        /// <summary>
        /// 트랙바 값 구하기
        /// </summary>
        /// <param name="minimumVolume">최소 볼륨</param>
        /// <param name="maximumVolume">최대 볼륨</param>
        /// <param name="volume">볼륨</param>
        /// <returns>트랙바 값</returns>
        private int GetTrackBarValue(int minimumVolume, int maximumVolume, int volume)
        {
            double range = maximumVolume - minimumVolume;

            double targetValue = volume - minimumVolume;

            return (int)(targetValue / range * 100);
        }

        #endregion
        #region 볼륨 구하기 - GetVolume(minimumValue, maximumValue, value)

        /// <summary>
        /// 볼륨 구하기
        /// </summary>
        /// <param name="minimumValue">최소값</param>
        /// <param name="maximumValue">최대값</param>
        /// <param name="value">값</param>
        /// <returns>볼륨</returns>
        private int GetVolume(int minimumValue, int maximumValue, int value)
        {
            double range = maximumValue - minimumValue;

            double targetVolume = range * value / 100;

            return (int)(targetVolume + minimumValue);
        }

        #endregion
        #region 재생 상태 레이블 데이터 설정하기 - SetPlayStatusLabelData(playStatus)

        /// <summary>
        /// 재생 상태 레이블 데이터 설정하기
        /// </summary>
        /// <param name="playStatus">재생 상태</param>
        private void SetPlayStatusLabelData(PlayStatus playStatus)
        {
            switch(playStatus)
            {
                case PlayStatus.Play  : this.playStatusTextBox.Text = "재생"; break;
                case PlayStatus.Stop  : this.playStatusTextBox.Text = "중단"; break;
                case PlayStatus.Pause : this.playStatusTextBox.Text = "정지"; break;
            }
        }

        #endregion
    }
}
728x90
반응형
그리드형(광고전용)
Posted by 사용자 icodebroker
TAG , , ,

댓글을 달아 주세요