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