基于C#制作一個(gè)休息提醒鬧鐘的詳細(xì)步驟
> 此文主要通過WinForm來制作一個(gè)休息提醒鬧鐘,通過設(shè)置時(shí)間間隔進(jìn)行提醒,避免沉浸式的投入到工作或者學(xué)習(xí)當(dāng)中,戰(zhàn)斗的同時(shí)也要照顧好自己。
實(shí)現(xiàn)流程
1.1、創(chuàng)建項(xiàng)目
打開Visual Studio,右側(cè)選擇創(chuàng)建新項(xiàng)目。
搜索框輸入winform,選擇windows窗體應(yīng)用,填寫對(duì)應(yīng)的保存路徑點(diǎn)擊下一步,創(chuàng)建成功后如下圖,會(huì)有一個(gè)默認(rèn)打開的Form窗體。
1.2、時(shí)間間隔配置頁(yè)
準(zhǔn)備鬧鐘圖片素材,修改窗體圖標(biāo)及標(biāo)題樣式。
通過設(shè)置窗體Text以及Icon等屬性進(jìn)行配置,同時(shí)配置StartPosition屬性值為CenterScreen,讓窗體默認(rèn)居中顯示。
在左側(cè)工具箱拖拽Label、Buttom、NumericUpDown、timer等控件,實(shí)現(xiàn)頁(yè)面大致布局。
雙擊窗體,進(jìn)入代碼界面,在頂部定義一個(gè)計(jì)數(shù)器字段。
private int MinCounter = 0;
在窗體編輯界面上雙擊啟動(dòng)按鈕,生成對(duì)應(yīng)的點(diǎn)擊事件代碼。
在啟動(dòng)按鈕點(diǎn)擊事件中增加業(yè)務(wù)邏輯代碼如下:還原計(jì)數(shù)器為0、禁用啟動(dòng)按鈕、釋放停止按鈕、啟動(dòng)定時(shí)器。
/// <summary> /// 啟動(dòng)按鈕點(diǎn)擊事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnStart_Click(object sender, EventArgs e) { MinCounter = 0; btnStart.Enabled = false; btnEnd.Enabled = true; timer1.Enabled = true; }
在窗體編輯頁(yè)單擊timer控件,雙擊Tick,進(jìn)入到對(duì)應(yīng)的代碼中。(Tick指每當(dāng)經(jīng)過指定的時(shí)間間隔時(shí)發(fā)生的事件)
private void timer1_Tick(object sender, EventArgs e) { }
在事件中首先獲取窗體NumericUupDowm控件的值,就是用戶所輸入的分鐘數(shù)。
int min = tbMin.Value;
業(yè)務(wù)代碼:如果計(jì)數(shù)器等于用戶所輸入的分鐘數(shù),則跳轉(zhuǎn)提示窗體并禁用timer控件,否則計(jì)數(shù)器的值+1。
private void timer1_Tick(object sender, EventArgs e) { if (MinCounter == tbMin.Value) { timer1.Enabled = false; using (message msg = new message(tbMin.Value.ToString())) { tip.ShowDialog(); } MinCounter = 0; timer1.Enabled = true; } else { MinCounter++; } }
1.3、鬧鐘提醒頁(yè)
選中項(xiàng)目新建一個(gè)窗體,名字自定義,按上述步驟修改窗體標(biāo)題及圖標(biāo)屬性;隨后在工具箱拖拽三個(gè)label標(biāo)簽到窗體上,分別用于圖片、提示文字、倒計(jì)時(shí)等顯示
準(zhǔn)備一個(gè)素材圖,并通過其中一個(gè)label控件的image屬性進(jìn)行導(dǎo)入,然后修改AutoSize屬性值為False。
在提示窗體中定義幾個(gè)字段,分別用于控制窗體關(guān)閉倒計(jì)時(shí)、顯示已工作時(shí)長(zhǎng)等作用。
private static int CLOSE_SEC = 300; private string STR_MIN = ""; private int RUN_SEC = 0;
在窗體事件中接收傳遞過來的參數(shù),并進(jìn)行顯示。
public TipForm(string _min) { STR_MIN = _min; InitializeComponent(); }
窗體加載事件中設(shè)置label2的Text屬性為提示信息。
label2.Text = "親,您又工作了"+ STR_MIN + "分鐘,該休息一下啦!";
在工具箱拖拽一個(gè)timer控件到窗體上,通過其Tick屬性設(shè)置倒計(jì)時(shí)秒數(shù)顯示及窗體關(guān)閉事件。
private void timer1_Tick(object sender, EventArgs e) { RUN_SEC++; if (RUN_SEC >= CLOSE_SEC) { RUN_SEC = 0; Close(); } else { label2.Text = "[" + (CLOSE_SEC - RUN_SEC) + "秒后自動(dòng)關(guān)閉]"; } }
可以再進(jìn)行優(yōu)化,窗體加載時(shí)通過Player播放鈴聲同步提醒。
//播放聲音 string wavFile = Application.StartupPath + @"\alarm.wav"; Stream sm = null; if (File.Exists(wavFile)) { sm = new FileStream(wavFile, FileMode.Open); } else { sm = Properties.Resources.Alarm02; } SoundPlayer player = new SoundPlayer(sm); player.Play(); player.Dispose();
1.4、開機(jī)自啟動(dòng)配置
回到Form1窗體,在工具箱拖拽出一個(gè)checkBox控件,用于勾選是否開啟自啟。
實(shí)現(xiàn)一個(gè)函數(shù),設(shè)置應(yīng)用程序開機(jī)自動(dòng)運(yùn)行。
/// <summary> /// 設(shè)置應(yīng)用程序開機(jī)自動(dòng)運(yùn)行 /// </summary> /// <param name="fileName">應(yīng)用程序的文件名</param> /// <param name="isAutoRun">是否自動(dòng)運(yùn)行,為false時(shí),取消自動(dòng)運(yùn)行</param> /// <returns>返回1成功,非1不成功</returns> public static String SetAutoRunByReg(string fileName, bool isAutoRun) { string reSet = string.Empty; RegistryKey reg = null; try { if (!File.Exists(fileName)) { reSet = "設(shè)置/取消自動(dòng)啟動(dòng)發(fā)生異常:" + fileName + "文件不存在!"; } string key = @"Software\Microsoft\Windows\CurrentVersion\Run"; string name = Path.GetFileName(fileName); reg = Registry.LocalMachine.OpenSubKey(key, true); if (reg == null) { reg = Registry.LocalMachine.CreateSubKey(key); } if (isAutoRun) { reg.SetValue(name, fileName); reSet = "1"; } else { if (reg.GetValue(name) != null) { reg.DeleteValue(name); } reSet = "1"; } } catch (Exception ex) { reSet = "設(shè)置/取消自動(dòng)啟動(dòng)發(fā)生異常:[" + ex.Message + "],請(qǐng)嘗試用管理員身份運(yùn)行!"; } finally { if (reg != null) { reg.Close(); } } return reSet; }
雙擊checkbox的click事件生成對(duì)應(yīng)的事件代碼,調(diào)用上述函數(shù)即可實(shí)現(xiàn)開機(jī)自啟效果。
//開機(jī)自動(dòng)啟動(dòng)并最小化 private void chkBoxBoot_Click(object sender, EventArgs e) { string res = SetAutoRunByReg(Application.ExecutablePath, chkBoxBoot.Checked); if (res != "1") { MessageBox.Show(res); } }
1.5、日志記錄
在Form1窗體定義一個(gè)函數(shù)記錄啟動(dòng)以及操作日志并存入文本。
/// <summary> /// 寫日志 /// </summary> /// <param name="msg">日志文本</param> /// <param name="add_datetime">是否添加時(shí)間戳</param> public static void writeLog(string msg, bool add_datetime) { string logfile = Application.StartupPath + "/log.txt"; using (StreamWriter w = File.AppendText(logfile)) { if (add_datetime) { w.WriteLine("{0}\t {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss", DateTimeFormatInfo.InvariantInfo), msg); } else { w.WriteLine("{0}", msg); } w.Flush(); w.Close(); } }
在窗體事件中調(diào)用上述函數(shù)。
在項(xiàng)目文件夾-> bin文件夾 -> Debug文件夾查看日志。
1.6、最小化提示
通過Form1的Closing、Resize等屬性進(jìn)行配置,實(shí)現(xiàn)windows提示效果。
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { //注意判斷關(guān)閉事件Reason來源于窗體按鈕,否則用菜單退出時(shí)無法退出! if (e.CloseReason == CloseReason.UserClosing) { e.Cancel = true; //取消"關(guān)閉窗口"事件 this.WindowState = FormWindowState.Minimized; //使關(guān)閉時(shí)窗口向右下角縮小的效果 notifyIcon1.Visible = true; notifyIcon1.ShowBalloonTip(3000, "提示", "程序未退出,它在這里!", ToolTipIcon.Info); this.Hide(); return; } } private void Form1_Resize(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Minimized) //最小化到系統(tǒng)托盤 { notifyIcon1.Visible = true; //顯示托盤圖標(biāo) notifyIcon1.ShowBalloonTip(3000, "提示", "程序未退出,它在這里!", ToolTipIcon.Info); this.Hide(); //隱藏窗口 } }
總結(jié)
到此這篇關(guān)于基于C#制作一個(gè)休息提醒鬧鐘的文章就介紹到這了,更多相關(guān)C#制作休息提醒鬧鐘內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)Array,List,Dictionary相互轉(zhuǎn)換
這篇文章介紹了C#實(shí)現(xiàn)Array,List,Dictionary互相轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04C# 泛型的簡(jiǎn)單理解(安全、集合、方法、約束、繼承)分享
這篇文章介紹了C# 泛型的簡(jiǎn)單理解(安全、集合、方法、約束、繼承),有需要的朋友可以參考一下2013-10-10C#中Winfrom默認(rèn)輸入法的設(shè)置方法
這篇文章主要介紹了C#中Winfrom默認(rèn)輸入法的設(shè)置方法,以實(shí)例形式較為詳細(xì)的分析了C#中輸入法設(shè)置的相關(guān)技巧,需要的朋友可以參考下2015-05-05DevExpress實(shí)現(xiàn)TreeList按條件隱藏節(jié)點(diǎn)CheckBox的方法
這篇文章主要介紹了DevExpress實(shí)現(xiàn)TreeList按條件隱藏節(jié)點(diǎn)CheckBox的方法,需要的朋友可以參考下2014-08-08C#使用xsd文件驗(yàn)證XML格式是否正確的實(shí)現(xiàn)方法
這篇文章主要介紹了C#使用xsd文件驗(yàn)證XML格式是否正確的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了C#針對(duì)xml文件的創(chuàng)建、驗(yàn)證相關(guān)操作技巧,需要的朋友可以參考下2017-01-01C#中的Task.WhenAll和Task.WhenAny方法介紹
這篇文章介紹了C#中的Task.WhenAll和Task.WhenAny方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04初步認(rèn)識(shí)C#中的Lambda表達(dá)式和匿名方法
這篇文章主要介紹了初步認(rèn)識(shí)C#中的Lambda表達(dá)式和匿名方法,本文著重講解Lambda表達(dá)式和匿名方法的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-01-01C#接口INotifyPropertyChanged使用方法
這篇文章介紹了C#接口INotifyPropertyChanged的使用方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01C#簡(jiǎn)單的通用基礎(chǔ)字典實(shí)現(xiàn)方法
這篇文章主要介紹了C#簡(jiǎn)單的通用基礎(chǔ)字典實(shí)現(xiàn)方法,包含了字典的索引、記錄、回調(diào)與查詢等技巧,需要的朋友可以參考下2014-12-12