C# - 音乐小闹钟_BetaV1.0
- 時間:2017-11-20 作者:byzqy
介紹:
前段時間看到別人利用Timer控件實現了檢查電腦本地時間,然后對時間進行比較,最終實現鬧鐘功能。感覺有點意思,于是自己也做了一個小鬧鐘!
先看一下的最終的效果:
工具/原料:
(操作系統:Windows 7/10,開發工具:Visual Studio 2015,目標框架:.NET Framework 4)
Windows窗體(1個)
控件:Label(8個)、ComboBox(4個)、Button(6個)、CheckBox(6個)、PictureBox(1個)
組件:Timer(4個)
素材:
①wav格式音樂文件(若干,本實例為7個,歌曲文件來源網絡)
②png格式音符圖片(若干,本實例為6張,圖片為自己用小畫家制作而成,每后一張比前一張錯開一個位置,順次切換圖片就形成了動畫的效果。確實有點粗糙啦!)
?代碼/邏輯:
自己用小畫家畫了一個程序結構示意圖,輔助理解代碼。(不怎么美觀,見笑了!可右鍵在新標簽頁查看清晰大圖。)
主要代碼:(文件:Form1.cs)
using System; using System.Collections.Generic; using System.Drawing; using System.Media; using System.Windows.Forms;namespace Timer_AlarmClock {public partial class Form1 : Form{public Form1(){InitializeComponent();}int alarm_hour; //用于接收comboBox中設定的鬧鈴小時數int alarm_minute; //用于接收comboBox中設定的鬧鈴分鐘數int alarm_second; //用于接收comboBox中設定的鬧鈴秒數string alarm_time; //用于顯示鬧鈴時間int fileNum; //用于接收指定文件夾內音樂文件個數//窗體:Load (當窗體加載的時候,將當前系統的時間賦值給我的label)private void Form1_Load(object sender, EventArgs e){//time to string 界面顯示當前時間labelCurrentValue.Text = DateTime.Now.ToString();//int to string 選擇框默認顯示當前時間(位數不足2位,前面補0.)comboBox1.Text = Convert.ToString(DateTime.Now.Hour).PadLeft(2, '0');comboBox2.Text = Convert.ToString(DateTime.Now.Minute).PadLeft(2, '0');comboBox3.Text = Convert.ToString(DateTime.Now.Second).PadLeft(2, '0');//為界面和后臺設置鬧鐘初始默認值alarm_hour = DateTime.Now.Hour;alarm_minute = DateTime.Now.Minute;alarm_second = DateTime.Now.Second;alarm_time = 00 + ":" + 00 + ":" + 00;//time to string 鬧鐘顯示時間labelAlarmValue.Text = Convert.ToDateTime(alarm_time).ToString();//默認鈴聲編號comboBox4.Text = Convert.ToString(1);ringNumber = 1;//表示播放狀態的標記label3.Text = ""; //檢測文件夾內文件個數string musicDirPath = Application.StartupPath + "\\music\\";System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(musicDirPath);fileNum = dir.GetFiles().Length;//動態獲取鈴聲數量選擇列表List<string> list = new List<string>();for (int a = 1; a <= fileNum; a++){list.Add(a.ToString());}comboBox4.DataSource = list;}//按鈕:保存 (將選擇好的鬧鐘時間傳遞給后臺)private void button1_Click(object sender, EventArgs e){//string to int 將設置好的時間傳給后臺進行比較alarm_hour = Convert.ToInt32(comboBox1.Text);alarm_minute = Convert.ToInt32(comboBox2.Text);alarm_second = Convert.ToInt32(comboBox3.Text);//labelAlarmValue.Text = DateTime.Now.ToString("d") + " " + alarm_hour + ":" + alarm_minute + ":" + alarm_second;//string to DateTime 將設置好的時間傳給界面顯示 example:string time = "12:12:12"alarm_time = comboBox1.Text + ":" + comboBox2.Text + ":" + comboBox3.Text;DateTime dt = Convert.ToDateTime(alarm_time);labelAlarmValue.Text = dt.ToString();}int ringNumber; //用于接收鈴聲編號//按鈕:選擇鈴聲private void button2_Click(object sender, EventArgs e){ringNumber = Convert.ToInt32(comboBox4.Text);}bool PlayFlag = false; //用于標記播放狀態//按鈕:停止播放private void button3_Click(object sender, EventArgs e){timer2.Stop();//停止計時timer3.Stop();//隨機循環計時停止timer4.Stop();//順序循環計時停止this.pictureBox1.Image = null;sp.Stop();//停止播放音樂label3.Text = "";PlayFlag = false;}//按鈕:播放private void button4_Click(object sender, EventArgs e){if (!PlayFlag){playModelSet(); }}//按鈕:下一首private void button6_Click(object sender, EventArgs e){if (checkBox4.Checked) //隨機播放 {Random rd = new Random();ringNumber = rd.Next(1, fileNum + 1);playMedia(ringNumber);}else if (checkBox3.Checked) //順序播放 {ringNumber++;if (ringNumber == fileNum + 1){ringNumber = 1;}playMedia(ringNumber);}}//按鈕:上一首private void button5_Click(object sender, EventArgs e){if (checkBox4.Checked) //隨機播放 {Random rd = new Random();ringNumber = rd.Next(1, fileNum);playMedia(ringNumber);//難題:如果想返回上一個隨機數該怎么辦 }else if (checkBox3.Checked) //順序播放 {ringNumber--;if (ringNumber == 0){ringNumber = fileNum;}playMedia(ringNumber);}}//自定義方法:設置響鈴時間private void setRingTime(){if (//如果設置的時間和當前時間相等,那么響鈴DateTime.Now.Hour == alarm_hour && DateTime.Now.Minute == alarm_minute && DateTime.Now.Second == alarm_second//如果復選框為true且時間為整點,那么整點響鈴|| checkBox1.Checked && DateTime.Now.Minute == 0 && DateTime.Now.Second == 0//如果復選框為true且時間為半點,那么半點響鈴|| checkBox2.Checked && DateTime.Now.Minute == 30 && DateTime.Now.Second == 0 ){playMedia(ringNumber);}}//自定義方法:選擇播放模式SoundPlayer sp = new SoundPlayer();private void playModelSet(){if (checkBox5.Checked) //單曲 {playMedia(ringNumber);}else if (checkBox6.Checked) //循環 {if (checkBox4.Checked) //隨機播放(死循環) {playMedia(ringNumber);timer3.Enabled = true;timer3.Start();}else if (checkBox3.Checked) //順序播放(死循環) {playMedia(ringNumber);timer4.Enabled = true;timer4.Start();}}else{sp.PlayLooping(); //單曲循環 }PlayFlag = true;}//自定義方法:根據播放模式播放指定id的音樂private void playMedia(int i){//播放音樂(.wav格式的音頻文件)//SoundPlayer sp = new SoundPlayer();//sp.SoundLocation = @".\music\劉德華-愛太難.wav";//sp.Play();//i++,實現第i張;//i++;string musicFilePath = Application.StartupPath + "\\music\\" + i.ToString() + ".wav";sp.SoundLocation = musicFilePath;//sp.Play(); sp.PlayLooping();label3.Text = "正在播放 第 " + i + " 首 ...";timer2.Enabled = true;timer2.Start();//Thread.Sleep(3000);//timer2.Stop(); }//定時器1:刷新時間 (每隔一秒鐘就把當前時間賦值給label)private void timer1_Tick(object sender, EventArgs e){labelCurrentValue.Text = DateTime.Now.ToString();setRingTime();}//定時器2:實現動態音符效果和文字跑馬燈效果 (每隔一秒鐘切換一張音符圖片)int j = 0; //用于表示音符圖片序號private void timer2_Tick(object sender, EventArgs e){//i++,實現第i張;j++;string filePath = Application.StartupPath + "\\music_pic\\" + j.ToString() + ".png";this.pictureBox1.Image = Image.FromFile(filePath);label3.Text = label3.Text.Substring(1) + label3.Text.Substring(0, 1);//當j=6時,j變為0,然后重新開始;if (j == 6){j = 0;}}//定時器3:實現隨機播放 (每隔4*60秒就生成一個隨機數,這個隨機數表示下一個要播放的音樂序號)private void timer3_Tick(object sender, EventArgs e){Random rd = new Random();ringNumber = rd.Next(1, fileNum + 1);playMedia(ringNumber);}//定時器4:實現順序播放 (每隔4*60秒就鈴聲序號就加1,實現自動下一曲)private void timer4_Tick(object sender, EventArgs e){ringNumber++;if (ringNumber == fileNum+1){ringNumber = 1;}playMedia(ringNumber);}//復選框:隨機播放private void checkBox4_CheckedChanged(object sender, EventArgs e){if (checkBox4.Checked){checkBox3.Checked = false;}}//復選框:順序播放private void checkBox3_CheckedChanged(object sender, EventArgs e){if (checkBox3.Checked){checkBox4.Checked = false;}}//復選框:單曲private void checkBox5_CheckedChanged(object sender, EventArgs e){if (checkBox5.Checked){checkBox6.Checked = false;}}//復選框:循環private void checkBox6_CheckedChanged(object sender, EventArgs e){if (checkBox6.Checked){checkBox5.Checked = false;}}} } View Code實現的功能/存在的問題:
1、小鬧鐘利用Timer組件,每一秒中獲取一次電腦系統時間,使鬧鐘的時間動了起來,然后與設定好的時刻進行比較,時刻相等時就執行“報時”的動作。
2、小程序利用SoundPlayer類實現了對音樂文件的播放,但是存在的問題是這種方式只能播放.wav格式的音樂文件,其它的.mp3等格式的無法使用這種方式播放!
3、同樣是SoundPlayer類的原因吧,無法確定歌曲是否已經播放完了。我也只能利用定時器來完成歌曲的切換,歌曲不管長短,一律4分鐘(4*60*1000毫秒),不過效果怎么樣。[尷尬臉^_^]
4、利用Timer定時器組件實現了文字跑馬燈的效果:
label3.Text = label3.Text.Substring(1) + label3.Text.Substring(0, 1);
5、利用Timer定時器,和文件名稱 i++ 的方式,定時更換規律的圖片,實現了動態圖片的效果。不過這種效果略顯生硬,不怎么美觀,我相信有更好的辦法!
6、……so many bugs ^_*(期待BetaV2.0)
?
--The End!(本篇完)
轉載于:https://www.cnblogs.com/jswl/p/7867471.html
總結
以上是生活随笔為你收集整理的C# - 音乐小闹钟_BetaV1.0的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (二)基于kubernetes(1.25
- 下一篇: 不忘初心,能偷懒就偷懒:C#操作Word