2015年,年終項目總結

来源:http://www.cnblogs.com/wangzheand/archive/2016/01/02/5095193.html
-Advertisement-
Play Games

轉眼2015年已經過去,我們有跌跌撞撞的闖入了2016年!看湖南衛視的跨年演唱會時何老師說“大家好好想一想2015年你收穫了什麼?” 回想2015年還是有些收穫的。從8月份的什麼都不懂到現在經過五個多月的學習已經可以獨立完成一個簡單的KTV點歌系統了(雖然不能聯網)!我覺得這就是我2015年最大的收...


轉眼2015年已經過去,我們有跌跌撞撞的闖入了2016年!看湖南衛視的跨年演唱會時何老師說“大家好好想一想2015年你收穫了什麼?

回想2015年還是有些收穫的。從8月份的什麼都不懂到現在經過五個多月的學習已經可以獨立完成一個簡單的KTV點歌系統了(雖然不能聯網)!我覺得這就是我2015年最大的收穫!!

前臺運行效果展示

先給大家看一下這個系統的運行效果圖

主界面

image

該系統提供了5中點歌方式分別為 歌星點歌、拼音點歌、類型點歌、金曲排行和字數點歌

歌星點歌

image

該窗體有三個ListView視圖效果如下

image

image

點擊歌手則跳轉到歌曲列表並顯示該歌手的所有歌曲

image

如果選中點擊一首歌曲則判斷是否有其他歌曲正在播放如果有則直接將該歌曲加入到已點列表中如果沒有則直接播放該歌曲並加入已點列表

拼音點歌

image

拼音點歌可以根據歌曲名和歌曲名的拼音縮寫來進行點歌選中並點擊一首歌時效果同已點列表

類型點歌

image

類型點歌根據歌曲的類型進行點歌如果選中並點擊一個類型則跳轉到歌曲列表並顯示該類型的所有歌曲

金曲排行

image

金曲排行顯示所有的歌曲按照點播次數進行降序排序如果選中歌曲並點擊效果同已點列表

字數點歌

image

字數點歌通過歌曲名字的字數進行點歌

前臺技術實現

同一窗體顯示多種界面

使用三個ListView控制項展示不同的界面通過設置其Visible屬性來控制界面的顯示

if (listView2.Visible == true)//如果listView2顯示
            {
                listView2.Visible = false;//將listView2隱藏
                listView1.Visible = true;//將listView1顯示
            }
            else if (lv1.Visible == true)//如果lv1顯示
            {
                lv1.Visible = false;//將lv1隱藏
                listView2.Visible = true//將listView2顯示
            }
            else
            {
              listView1.Visible = false;//將listView1隱藏
               lv1.Visible = true;//將lv1顯示
            }

將歌曲添加到已點列表

該功能分三步實現

1.定義一個歌曲類並定義一個靜態的歌曲類數組

public  class PlayList
    {
       public string name;//歌曲名
       public string singername="未播放";//播放狀態
       public string url;//歌曲路徑

    }
 public class DBhelp
    {
 //歌曲對象數組
        public static PlayList[] list = new PlayList[50];
}

2.將歌曲添加到數組中

//將傳進來的對象加入倒數組中 
public static bool playadd(PlayList sb)
        {
                    if (frmmain.songurl == "")
            {
    //如果當前沒有歌曲正在播放則包房該歌曲
                frmmain.upsong = sb.name;
                frmmain.songurl = DBhelp.songurl() + "\\" + sb.url;

                DBhelp.f.seturl();
                sb.singername = "正在播放";
            }
            
             else
            {
    //判斷數組中的歌曲數量是否小於或等於兩首
                int i = 0;//表示數組中個去的數量
                foreach (var item in DBhelp.list)
                {
                    i++;
                    if (item == null)
                    {
                        break;
                    }

                }
                if (i <= 2)
                {
                    frmmain.buttomsong = sb.name;//將該歌曲的名字付給主窗體的靜態變數以便在“下一首”對應的文本框中顯示
                }
            }
            for (int i = 0; i < DBhelp.list.Length; i++)
            {
                if (DBhelp.list[i]!=null)
                {
       //如果該歌曲在數組中已經存在則不再進行添加直接跳過
                    if (DBhelp.list[i].name==sb.name&&DBhelp.list[i].url==sb.url)
                    {
                        break;
                        
                    }
                }
    //找出數組中沒有存儲個去的一項並將該歌曲加入到該項中
                else if (DBhelp.list[i]==null)
                {
                    DBhelp.list[i] = sb;
                    DBhelp.frm.add();
                    return true;//加入成功返回true
                }
            }
            return false;//加入失敗返回false
        }

3.將數組中的歌曲添加到已點列表

//將該方法放入到計時控制項(Timer)的Tick事件中
 public  void add()
        {
            listView1.Items.Clear();//清除已點列表中的現有項
    //遍曆數組將數組中的所有歌曲添加到ListView控制項中
            for (int i = 0; i <DBhelp.list.Length; i++)
            {
               
                if (DBhelp.list[i]!=null)
                {
                          ListViewItem li = new ListViewItem(DBhelp.list[i].name);
                     li.SubItems.Add(DBhelp.list[i].singername);
                     li.SubItems.Add(DBhelp.list[i].url);
                      listView1.Items.Add(li); 
                }
            }      
          }

使用WIndows Media Player控制項播放歌曲

wplist.URL = songurl;
//wplist為該空間的name屬性名,songurl為歌曲的完整路徑字元串
//通過設置wplist的URL屬性可以播放指定路徑的歌曲

控制歌曲的播放狀態

個人覺得歌曲的播放狀態的控制是很費精力的也是本次項目花費時間最長的一個模塊

//提前定義一個靜態變數index用來標示整的播放歌曲的索引 
        // 實現播放等功能
        public  void qiesong()
        {
    
            if (DBhelp.list[frmmain.index] != null)
            {
    //該下標的歌曲不為空
                DBhelp.list[frmmain.index].singername = "正在播放";
                frmmain.upsong = DBhelp.list[frmmain.index].name;//upsong標示正在播放歌曲的名字
                frmmain.songurl = DBhelp.songurl() + "\\" + DBhelp.list[frmmain.index].url;//songurl標示正在播放歌曲的完整路徑
            }
            else
            {
    //該下標的歌曲為空
                frmmain.index = 0;
                DBhelp.list[frmmain.index].singername = "正在播放";
                frmmain.upsong = DBhelp.list[frmmain.index].name;
                frmmain.songurl =DBhelp.songurl()+"\\"+ DBhelp.list[frmmain.index].url;
            }
            if (DBhelp.list[frmmain.index + 1] != null)
            {
    //該下標的下一個歌曲不為空
                frmmain.buttomsong = DBhelp.list[frmmain.index + 1].name;//buttomsong標示下一首播放的歌曲的名字
            }
            else
            {
    //該下標的下一個歌曲為空
                frmmain.buttomsong = DBhelp.list[0].name;
            }
            DBhelp.f.seturl();//seturl方法用於給播放器控制項設置路徑
           
        }

●切歌

//實現切歌功能
        public void clickgetsongstly()
        {
    
            if (listView1.Items.Count > 0)
            {

                DBhelp.list[frmmain.index].singername = "已播放";
                frmmain.index += 1;
                qiesong();
                
            }
           
           
        }

●播放

if (listView1.SelectedItems.Count > 0)
            {
                
                    DBhelp.list[frmmain.index].singername = "已播放";
              
                frmmain.index = listView1.Items.IndexOf(listView1.SelectedItems[0]);//獲取選中的歌曲的下標
                qiesong();
               
            }
            else
            {
                MessageBox.Show("請選擇一首歌曲");
            }

●刪除

if (listView1.SelectedItems.Count>0)
            {
                int index = listView1.Items.IndexOf(listView1.SelectedItems[0]);//獲取選中歌曲的下標
                    listView1.Items.Remove(listView1.SelectedItems[0]);在ListView控制項中清除該歌曲
                    string state = DBhelp.list[index].singername;//獲取選中歌曲的狀態
                    DBhelp.list[index] = null;//在數組中刪除該歌曲
                int starteindex=0;//標示正在播放歌曲的下標
                    for (int i = index; i <DBhelp.list.Length-1; i++)
                    {
                        //將刪除歌曲之後的歌曲前移
                        
                            DBhelp.list[i] = DBhelp.list[i + 1];
                            DBhelp.list[i + 1] = null;
                    }
                    for (int j = 0; j <DBhelp.list.Length-1; j++)
                    {//獲取正在播放的歌曲的下標
                        if (DBhelp.list[j]!=null)
                        {
                             if ( DBhelp.list[j].singername == "正在播放")
                        {
                            starteindex = j;
                        }
                        }
                    }
                    if (state=="正在播放")
                    {//刪除歌曲的狀態為正在播放
                        if (index!=0)
                        {//選中歌曲的下標不為0
                             frmmain.index -= 1;
                             clickgetsongstly();
                        }
                        else if (listView1.Items.Count < 1)
                        {//選中歌曲的下標為0並且已點列表中沒有歌曲
                            frmmain.index = 0;
                            frmmain.upsong = "";
                            frmmain.songurl = "";
                            frmmain.buttomsong = "";
                            DBhelp.f.seturl();
                        }
                        else
                        {//選中歌曲的下標為0並且已點列表中有歌曲
                            frmmain.index = 0;
                            qiesong();
                        }
                   
                    }else if (listView1.Items.Count<=1)
                    {
                        frmmain.buttomsong = DBhelp.list[0].name;
                    }
                   
                    else 
                    {
         //刪除歌曲的狀態不為正在播放
                        frmmain.index = starteindex;
                        if (DBhelp.list[frmmain.index + 1] != null)
                        {//刪除歌曲的下標的下一項有歌曲
                            frmmain.buttomsong = DBhelp.list[frmmain.index + 1].name;
                        }
                        else
                        {
        //刪除歌曲的下標的下一項沒有歌曲
                            frmmain.buttomsong = DBhelp.list[0].name;
                        }
                        
                        
                    }
                    
                    
                    add();

            }
            else
            {
                MessageBox.Show("請選擇一首歌曲");
            }

窗體邊框樣式設置為None時窗體可以移動

private Point mouseOffset;        //記錄滑鼠指針的坐標        
        private bool isMouseDown = false; //記錄滑鼠按鍵是否按下   
    //Point 提供有序的 x 坐標和 y 坐標整數對,該坐標對在二維平面中定義一個點。
    //滑鼠左鍵按下後發生
        private void SelectSongFromClassify_MouseDown(object sender, MouseEventArgs e)
        {
            int xOffset;
            int yOffset;
            if (e.Button == MouseButtons.Left)
            {
                xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
                yOffset = -e.Y - SystemInformation.CaptionHeight - SystemInformation.FrameBorderSize.Height;
                mouseOffset = new Point(xOffset, yOffset);
                isMouseDown = true;
            }

        }
    //滑鼠在組件上移動時發生
        private void SelectSongFromClassify_MouseMove(object sender, MouseEventArgs e)
        {
            if (isMouseDown)
            {
                Point mousePos = Control.MousePosition;
                mousePos.Offset(mouseOffset.X + 5, mouseOffset.Y + 30);
                Location = mousePos;
            }

        }
    //滑鼠左鍵按下並釋放後發生
        private void SelectSongFromClassify_MouseUp(object sender, MouseEventArgs e)
        {
            // 修改滑鼠狀態isMouseDown的值      
            // 確保只有滑鼠左鍵按下並移動時,才移動窗體       
            if (e.Button == MouseButtons.Left)
            {
                isMouseDown = false;
            }

        }

結尾

好了,今天就先寫這麼多吧!關於後臺方面的下次再寫吧(寫的眼睛疼~~~)!!!

祝:新年快樂,在2016年發大財(還是空降的天上掉餡餅的那種^_^)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 新建項目à新建一個空白解決方案 在Model新建一個實體類 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; name...
  • 一、將WCF服務部署到IIS上 【轉載自簡單笑容——http://www.cnblogs.com/skdsxx/p/5072726.html】1.首先檢測電腦上是否安裝了IIS,一般來說Win7以上系統自帶IIS2.下麵進行IIS服務的開啟設置控制面板=》打開或關閉Windos功能3.勾選該視窗中的...
  • 引言本文主要講述在區域網內,使用c#基於Udp協議編寫一個對戰的五子棋游戲。主要從Udp的使用、游戲的繪製、對戰的邏輯這三個部分來講解。開發環境:vs2013,.Net4.0,在文章的末尾提供源代碼下載的地址。Udp通信Udp是基於無連接的傳輸協議,特點是資源消耗小、處理速度快、使用方便,不需要與接...
  • 一:故事背景 以前在寫WebApi2的時候,一直是用作前後端分離(WebApi2 +angularjs),可是最近自己在給WebApp寫介面的時候遇到了很多坑,總結一下就是跨域問題。而跨域問題在WebApi2中配置也是有點麻煩,不知道在2中是否有對jsonp跨域問題更好解決方案,如果有,跪求各位博....
  • 《重構》這本書的代碼都是java,我準備用C#來一遍。而今天我的主要任務是寫一大段垃圾代碼出來,然後重構(僅限於函數的,不涉及到其它方面的重構)。程式界面:功能介紹:俠客名字自己取,然後點擊按鈕隨機角色的屬性,根骨,經脈,柔韌,悟性等四項屬性值都是隨機而來。其他的都是由這四個屬性計算而來:根骨:影響...
  • Technorati 標記: http 代理驗證及測試Technorati 標記: C#參考了網上很多資料,綜合整理出來最終的代碼:using System; using System.Collections; using System.Collections.Generic; using Syst...
  • 使用NuGet安裝Nancy和直接引用源碼項目存在一些差異,如序列化,授權驗證問題。如果引用源碼的話,自定義JsonSerializer,如下:註意,需要使用NuGet安裝Newtonsoft.Json public class CustomJsonNetSerializer : JsonSeria...
  • 1、新建UserDatabase類,實現IUserMapper介面 using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using S...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...