From 9b6772686cd885fd3a4f4cfd148955d62b005f7f Mon Sep 17 00:00:00 2001 From: jasonchenwork Date: Fri, 29 Aug 2025 16:15:54 +0800 Subject: [PATCH] =?UTF-8?q?2508291614=20=E6=8E=A7=E5=88=B6=E9=A0=85?= =?UTF-8?q?=E5=BE=9E=E5=B1=AC=E8=A8=AD=E5=AE=9A=E6=9B=B4=E6=AD=A3=20?= =?UTF-8?q?=E7=A8=8B=E5=BC=8F=E7=A2=BC=E9=87=8D=E6=A7=8B/=E7=98=A6?= =?UTF-8?q?=E8=BA=AB=20=E8=AA=BF=E6=95=B4=E6=B8=9B=E5=B0=91videoview?= =?UTF-8?q?=E9=96=83=E7=88=8D=20=E5=B7=B2=E9=BB=9E=E6=AD=8C=E6=9B=B2?= =?UTF-8?q?=E9=A0=81=E9=9D=A2=E8=87=AA=E5=8B=95=E5=AE=9A=E4=BD=8D=E9=82=8F?= =?UTF-8?q?=E8=BC=AF=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DBObj/SongData.cs | 11 +- PrimaryFormParts/PrimaryForm.ToggleLight.cs | 4 +- PrimaryFormParts/PrimaryForm.cs | 41 +- .../PrimaryForm.SingerSearch.EnglishSearch.cs | 583 ++++------ .../PrimaryForm.SingerSearch.PinyinSearch.cs | 415 ++------ ...rimaryForm.SingerSearch.WordCountSearch.cs | 1 - .../PrimaryForm.SongSearch.EnglishSearch.cs | 556 ++++------ .../PrimaryForm.SongSearch.NumberSearch.cs | 992 ++++-------------- .../PrimaryForm.SongSearch.PinyinSearch.cs | 593 ++++------- Program.cs | 2 +- Services/MediaService.cs | 2 - VideoPlayerForm.cs | 2 + img.ini | 206 +--- 13 files changed, 970 insertions(+), 2438 deletions(-) diff --git a/DBObj/SongData.cs b/DBObj/SongData.cs index 1b5dfe9..9bdc9a1 100644 --- a/DBObj/SongData.cs +++ b/DBObj/SongData.cs @@ -10,11 +10,18 @@ namespace DBObj private Artist A ; private Artist B ; public bool isPublicSong { get; set; } - public PlayState state; + + public SongData() + { + basic = new("", "", "", "", 1, 1, ""); + A = new("", ""); + B = new("", ""); + isPublicSong = false; + } public SongData(string songNumber, string song, string filename, int humanVoice, bool isPublic) { - basic=new(songNumber,song,"",filename,humanVoice,0,""); + basic = new(songNumber, song, "", filename, humanVoice, 0, ""); isPublicSong = isPublic; } public SongData(string songNumber, string song, string artistA, string artistB, string filename, string artistASimplified, string artistBSimplified, string songSimplified, int humanVoice,int dbChange,string situation) diff --git a/PrimaryFormParts/PrimaryForm.ToggleLight.cs b/PrimaryFormParts/PrimaryForm.ToggleLight.cs index 4f8bbb4..8c4644b 100644 --- a/PrimaryFormParts/PrimaryForm.ToggleLight.cs +++ b/PrimaryFormParts/PrimaryForm.ToggleLight.cs @@ -1,6 +1,5 @@ -using System.Drawing; using System.IO; -using static System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox; + namespace DualScreenDemo { public partial class PrimaryForm : Form @@ -269,7 +268,6 @@ namespace DualScreenDemo private void SetPictureBoxToggleLightAndButtonsVisibility(bool isVisible) { - pictureBoxToggleLight.Visible = isVisible; if (isVisible) SetUIVisible(pictureBoxToggleLight); else CloseUI(pictureBoxToggleLight); } diff --git a/PrimaryFormParts/PrimaryForm.cs b/PrimaryFormParts/PrimaryForm.cs index fbbcfe0..f183b21 100644 --- a/PrimaryFormParts/PrimaryForm.cs +++ b/PrimaryFormParts/PrimaryForm.cs @@ -1416,7 +1416,8 @@ namespace DualScreenDemo } private SongData currentSelectedSong; - + + //vod介面點擊事件 public void Label_Click(object sender, EventArgs e) { @@ -1443,12 +1444,12 @@ namespace DualScreenDemo vodButton.MouseUp += (sender, e) => vodButton.BackgroundImage = new Bitmap(Path.Combine(serverPath, data["SongOrderPanel"]["DelBtn"])); } else - { + { vodButton.BackgroundImage = new Bitmap(Path.Combine(serverPath, data["SongOrderPanel"]["Request"])); - vodButton.MouseEnter += (sender, e) => vodButton.BackgroundImage = new Bitmap(Path.Combine(serverPath, data["SongOrderPanel"]["Request"])); - vodButton.MouseLeave += (sender, e) => vodButton.BackgroundImage = new Bitmap(Path.Combine(serverPath, data["SongOrderPanel"]["Request"])); - vodButton.MouseDown += (sender, e) => vodButton.BackgroundImage = new Bitmap(Path.Combine(serverPath, data["SongOrderPanel"]["Request"])); - vodButton.MouseUp += (sender, e) => vodButton.BackgroundImage = new Bitmap(Path.Combine(serverPath, data["SongOrderPanel"]["Request"])); + vodButton.MouseEnter += (sender, e) => vodButton.BackgroundImage = new Bitmap(Path.Combine(serverPath, data["SongOrderPanel"]["Request"])); + vodButton.MouseLeave += (sender, e) => vodButton.BackgroundImage = new Bitmap(Path.Combine(serverPath, data["SongOrderPanel"]["Request"])); + vodButton.MouseDown += (sender, e) => vodButton.BackgroundImage = new Bitmap(Path.Combine(serverPath, data["SongOrderPanel"]["Request"])); + vodButton.MouseUp += (sender, e) => vodButton.BackgroundImage = new Bitmap(Path.Combine(serverPath, data["SongOrderPanel"]["Request"])); } } @@ -2300,8 +2301,34 @@ namespace DualScreenDemo autoRefreshTimer.Start(); // 开始自动刷新 // 已點歌曲錨點 var List = SongList.GetHistory(); - totalPages = (int)Math.Ceiling((double)List.Count / itemsPerPage); + var targetNum = multiPagePanel.itemsPerPage - List.Count % multiPagePanel.itemsPerPage; int index = List.FindIndex(song => song.GetState() == PlayState.Playing); + int remainder=(List.Count-index)%multiPagePanel.itemsPerPage; + if (remainder !=0&&remainder!=1) + { + + if (List.Count < multiPagePanel.itemsPerPage) + { + int itemsToInsert = multiPagePanel.itemsPerPage - index; + + for (int i = 0; i < itemsToInsert; i++) + { + List.Insert(index, new SongData()); + } + } + { + int itemsToInsert = multiPagePanel.itemsPerPage - remainder; + + for (int i = 0; i < itemsToInsert; i++) + { + List.Insert(index, new SongData()); + } + } + } + + + totalPages = (int)Math.Ceiling((double)List.Count / itemsPerPage); + index = List.FindIndex(song => song.GetState() == PlayState.Playing); int page = 0; if ((index+1) > multiPagePanel.itemsPerPage) page = Math.Abs((index+1) / multiPagePanel.itemsPerPage); diff --git a/PrimaryFormParts/SingerSearch/PrimaryForm.SingerSearch.EnglishSearch.cs b/PrimaryFormParts/SingerSearch/PrimaryForm.SingerSearch.EnglishSearch.cs index 00fbae1..a9f32a1 100644 --- a/PrimaryFormParts/SingerSearch/PrimaryForm.SingerSearch.EnglishSearch.cs +++ b/PrimaryFormParts/SingerSearch/PrimaryForm.SingerSearch.EnglishSearch.cs @@ -1,31 +1,220 @@ using System.IO; -using IniParser; -using IniParser.Model; namespace DualScreenDemo { public partial class PrimaryForm { private PictureBox pictureBoxEnglishSingers; - private Button[] numberButtonsForSingers; private Button[] letterButtonsForEnglishSingers; private Button modifyButtonEnglishSingers; private Button clearButtonEnglishSingers; private Button closeButtonEnglishSingers; - - private (int X, int Y, int Width, int Height) modifyButtonEnglishCoords; - private (int X, int Y, int Width, int Height) clearButtonEnglishCoords; - private (int X, int Y, int Width, int Height) closeButtonEnglishCoords; - private RichTextBox inputBoxEnglishSingers; + private void InitializeButtonsForEnglishSingers() + { + InitializeEngAlphbtSingerBtns(pictureBoxEnglishSingers,LetterButtonEnglishSingers_Click); + InitializeInputBoxEnglishSingers(); + InitializeEngSingersButton(); + } + private void InitializeEngSingersButton() + { + var data = LoadBtnConfigData(); + + modifyButtonEnglishSingers = new Button { Name = "modifyButtonEnglishSingers" }; + ConfigureButton(modifyButtonEnglishSingers, 650, 275, 72, 67, + new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesEnglish"]["normal"])), + new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesEnglish"]["mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesEnglish"]["mouseDown"])), + ModifyButtonEnglishSingers_Click); + + pictureBoxEnglishSingers.Controls.Add(modifyButtonEnglishSingers); + + + clearButtonEnglishSingers = new Button { Name = "clearButtonEnglishSingers" }; + ConfigureButton(clearButtonEnglishSingers, 8, 275, 72, 67, + new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesEnglish"]["normal"])), + new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesEnglish"]["mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesEnglish"]["mouseDown"])), + ClearButtonEnglishSingers_Click); + + pictureBoxEnglishSingers.Controls.Add(clearButtonEnglishSingers); + + + closeButtonEnglishSingers = new Button { Name = "closeButtonEnglishSingers" }; + ConfigureButton(closeButtonEnglishSingers, 730, 275, 72, 67, + new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesEnglish"]["normal"])), + new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesEnglish"]["mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesEnglish"]["mouseDown"])), + CloseButtonEnglishSingers_Click); + + pictureBoxEnglishSingers.Controls.Add(closeButtonEnglishSingers); + } + private void InitializeEngAlphbtSingerBtns(Control control, EventHandler handler) + { + numberButtonsForSingers = new Button[10]; + letterButtonsForEnglishSingers = new Button[26]; + // 設置上排按鈕 + int x = 8; + for (int i = 0; i < 10; i++) + { + CreateNumberEngSingerBtns(i, x, 65, control, handler); + x += 80; + } + + x = 8; + for (int i = 0; i < 10; i++) + { + CreateEngAlphbtSingerBtns(i, x, 135, control, handler); + x += 80; + } + + x = 40; + for (int i = 10; i < 19; i++) + { + CreateEngAlphbtSingerBtns(i, x, 205, control, handler); + x += 80; + } + // 設置下排按鈕 + x = 88; + for (int i = 19; i < 26; i++) + { + CreateEngAlphbtSingerBtns(i, x, 275, control, handler); + x += 80; + } + } + private void CreateNumberEngSingerBtns(int index, int x, int y, Control control, EventHandler handler) + { + try + { + // 加載配置數據 + var data = LoadBtnConfigData(); + // 創建語音按鈕並設置其屬性 + numberButtonsForSingers[index] = new Button + { + Name = $"ButtonsForEnglish_{ButtonsNumberSymbols[index]}", // 按鈕名稱設為語音符號名稱 + }; + + ConfigureButton(numberButtonsForSingers[index], x, y, 72, 67, + new Bitmap(Path.Combine(serverPath, data["NumberButtonImages"][$"button{index}_normal"])), + new Bitmap(Path.Combine(serverPath, data["NumberButtonImages"][$"button{index}_mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["NumberButtonImages"][$"button{index}_mouseDown"])), + handler); + + // 設置按鈕的 Tag 屬性為對應的語音符號 + numberButtonsForSingers[index].Tag = ButtonsNumberSymbols[index]; + + // 將按鈕添加到表單的控制項集合中 + control.Controls.Add(numberButtonsForSingers[index]); + } + catch (Exception ex) + { + Console.WriteLine($"Error creating button at index {index}: {ex.Message}"); + } + } + private void CreateEngAlphbtSingerBtns(int index, int x, int y, Control control, EventHandler handler) + { + try + { + // 加載配置數據 + var data = LoadBtnConfigData(); + // 創建語音按鈕並設置其屬性 + letterButtonsForEnglishSingers[index] = new Button + { + Name = $"ButtonsForEnglishSingers_{ButtonsEnglishSymbols[index]}", // 按鈕名稱設為語音符號名稱 + }; + + ConfigureButton(letterButtonsForEnglishSingers[index], x, y, 72, 67, + new Bitmap(Path.Combine(serverPath, data["EnglishLetterButtonImages"][$"button{index}_normal"])), + new Bitmap(Path.Combine(serverPath, data["EnglishLetterButtonImages"][$"button{index}_mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["EnglishLetterButtonImages"][$"button{index}_mouseDown"])), + handler); + + // 設置按鈕的 Tag 屬性為對應的語音符號 + letterButtonsForEnglishSingers[index].Tag = ButtonsEnglishSymbols[index]; + + // 將按鈕添加到表單的控制項集合中 + control.Controls.Add(letterButtonsForEnglishSingers[index]); + } + catch (Exception ex) + { + Console.WriteLine($"Error creating button at index {index}: {ex.Message}"); + } + } + + private void InitializeInputBoxEnglishSingers() + { + try + { + string fontName = "Times New Roman"; + float fontSize = 26; + FontStyle fontStyle = FontStyle.Regular; + Color foreColor = Color.Black; + + inputBoxEnglishSingers = new RichTextBox + { + Visible = false, + Name = "inputBoxEnglishSingers", + ForeColor = foreColor, + Font = new Font(fontName, fontSize / 900 * Screen.PrimaryScreen.Bounds.Height, fontStyle) + }; + + ResizeAndPositionControl(inputBoxEnglishSingers, 10, 12, 455, 47); + + pictureBoxEnglishSingers.Controls.Add(inputBoxEnglishSingers); + } + catch (Exception ex) + { + Console.WriteLine($"An error occurred: {ex.Message}"); + } + } + + private void ShowImageOnPictureBoxEnglishSingers(string imagePath) + { + try + { + Bitmap originalImage = new Bitmap(imagePath); + + pictureBoxEnglishSingers.Image = originalImage; + + ResizeAndPositionPictureBox(pictureBoxEnglishSingers, 390, 360, 808, 356); + + pictureBoxEnglishSingers.Visible = true; + } + catch (Exception ex) + { + Console.WriteLine($"An error occurred: {ex.Message}"); + } + } + + private void SetEnglishSingersAndButtonsVisibility(bool isVisible) + { + System.Action action = () => + { + SuspendLayout(); + if (isVisible) SetUIVisible(pictureBoxEnglishSingers); + else CloseUI(pictureBoxEnglishSingers); + ResumeLayout(); + PerformLayout(); + }; + + if (this.InvokeRequired) + { + this.Invoke(action); + } + else + { + action(); + } + } + private void EnglishSearchSingersButton_Click(object sender, EventArgs e) { UpdateSSearchBtn(englishSearchButton, englishSearchActiveBackground); bool shouldBeVisible = !pictureBoxEnglishSingers.Visible; - + var configData = LoadBtnConfigData(); string imagePath = Path.Combine(serverPath, configData["ImagePaths"]["EnglishSingers"]); @@ -41,125 +230,9 @@ namespace DualScreenDemo ResetinputBox(); pictureBoxEnglishSingers.Visible = true; } - - private (int X, int Y, int Width, int Height)[] numberButtonCoords; - - private void LoadNumberButtonCoordsFromConfig() - { - var parser = new FileIniDataParser(); - string iniPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "img.ini"); - IniData data = parser.ReadFile(iniPath); - - - var buttonList = new List<(int X, int Y, int Width, int Height)>(); - - for (int i = 1; i <= 10; i++) - { - var coordString = data["NumberButtonCoordinates"][$"button{i}"]; - var coords = coordString.Split(','); - buttonList.Add((int.Parse(coords[0]), int.Parse(coords[1]), int.Parse(coords[2]), int.Parse(coords[3]))); - } - - numberButtonCoords = buttonList.ToArray(); - } - - private Button CreateButton(string name, (int X, int Y, int Width, int Height) coords, string normalImagePath, string mouseDownImagePath, string mouseOverImagePath, EventHandler clickEventHandler) - { - var button = new Button - { - Name = name, - FlatStyle = FlatStyle.Flat, - FlatAppearance = { BorderSize = 0, MouseDownBackColor = Color.Transparent, MouseOverBackColor = Color.Transparent }, - BackgroundImageLayout = ImageLayout.Stretch, - BackgroundImage = Image.FromFile(Path.Combine(serverPath, normalImagePath)) - }; - - ResizeAndPositionButton(button, coords.X, coords.Y, coords.Width, coords.Height); - - button.MouseEnter += (sender, e) => button.BackgroundImage = Image.FromFile(Path.Combine(serverPath, mouseOverImagePath)); - button.MouseLeave += (sender, e) => button.BackgroundImage = Image.FromFile(Path.Combine(serverPath, normalImagePath)); - button.MouseDown += (sender, e) => button.BackgroundImage = Image.FromFile(Path.Combine(serverPath, mouseDownImagePath)); - button.MouseUp += (sender, e) => button.BackgroundImage = Image.FromFile(Path.Combine(serverPath, normalImagePath)); - - button.Click += clickEventHandler; - - return button; - } - - - private void InitializeNumberButtonsForSingers() - { - var data = LoadBtnConfigData(); - numberButtonCoords = LoadButtonCoordinates(data, "NumberButtonCoordinates", 10); - var buttonImages = LoadButtonImages(data, "NumberButtonImages", 10); - - numberButtonsForSingers = new Button[10]; - for (int i = 0; i < 10; i++) - { - string normalImagePath = buttonImages[$"button{i}"].normal; - string mouseDownImagePath = buttonImages[$"button{i}"].mouseDown; - string mouseOverImagePath = buttonImages[$"button{i}"].mouseOver; - - - if (normalImagePath == null || mouseDownImagePath == null || mouseOverImagePath == null) - { - Console.WriteLine($"Error: One or more image paths for button{i} are null."); - continue; - } - - - numberButtonsForSingers[i] = CreateButton( - $"numberButton_{i}", - numberButtonCoords[i], - normalImagePath, - mouseDownImagePath, - mouseOverImagePath, - NumberButtonForSingers_Click - ); - numberButtonsForSingers[i].Tag = (i + 1) % 10; - this.Controls.Add(numberButtonsForSingers[i]); - } - } - - private void NumberButtonForSingers_Click(object sender, EventArgs e) - { - - var button = sender as Button; - if (button != null && button.Tag != null) - { - if (inputBoxEnglishSingers.Visible) - { - inputBoxEnglishSingers.Text += button.Tag.ToString(); - } - } - } - - private void InitializeLetterButtonsForEnglishSingers() - { - var data = LoadBtnConfigData(); - var buttonImages = LoadButtonImages(data, "EnglishLetterButtonImages", 26); - string qwertyLayout = "QWERTYUIOPASDFGHJKLZXCVBNM"; - letterButtonsForEnglishSingers = new Button[26]; - - for (int i = 0; i < 26; i++) - { - var coords = data["EnglishLetterButtonCoordinates"][$"button{i}"].Split(','); - letterButtonsForEnglishSingers[i] = CreateButton( - $"letterButton_{qwertyLayout[i]}", - (int.Parse(coords[0]), int.Parse(coords[1]), int.Parse(coords[2]), int.Parse(coords[3])), - buttonImages[$"button{i}"].normal, - buttonImages[$"button{i}"].mouseDown, - buttonImages[$"button{i}"].mouseOver, - LetterButtonEnglishSingers_Click - ); - letterButtonsForEnglishSingers[i].Tag = qwertyLayout[i]; - this.Controls.Add(letterButtonsForEnglishSingers[i]); - } - } - private void LetterButtonEnglishSingers_Click(object sender, EventArgs e) { - + var button = sender as Button; if (button != null && button.Tag != null) { @@ -169,270 +242,44 @@ namespace DualScreenDemo } } } - - private void InitializeButtonsForEnglishSingers() - { - InitializeNumberButtonsForSingers(); - InitializeLetterButtonsForEnglishSingers(); - - - InitializeModifyButtonEnglishSingers(); - - - InitializeClearButtonEnglishSingers(); - - - InitializeCloseButtonEnglishSingers(); - - InitializeInputBoxEnglishSingers(); - } - - private void InitializeModifyButtonEnglishSingers() - { - var data = LoadBtnConfigData(); - modifyButtonEnglishCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "modifyButtonEnglishSingers"); - var buttonImages = LoadButtonImages(data, "ModifyButtonImagesEnglish"); - - modifyButtonEnglishSingers = CreateSpecialButton( - "btnModifyEnglishSingers", - modifyButtonEnglishCoords, - buttonImages.normal, - buttonImages.mouseOver, - buttonImages.mouseDown, - ModifyButtonEnglishSingers_Click - ); - - this.Controls.Add(modifyButtonEnglishSingers); - } - private void ModifyButtonEnglishSingers_Click(object sender, EventArgs e) { - - if (this.Controls.Contains(inputBoxEnglishSingers) && inputBoxEnglishSingers.Text.Length > 0) + + if (pictureBoxEnglishSingers.Controls.Contains(inputBoxEnglishSingers) && inputBoxEnglishSingers.Text.Length > 0) { inputBoxEnglishSingers.Text = inputBoxEnglishSingers.Text.Substring(0, inputBoxEnglishSingers.Text.Length - 1); } } - - private void InitializeClearButtonEnglishSingers() - { - var data = LoadBtnConfigData(); - clearButtonEnglishCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "clearButtonEnglishSingers"); - var buttonImages = LoadButtonImages(data, "ClearButtonImagesEnglish"); - - clearButtonEnglishSingers = CreateSpecialButton( - "btnClearEnglishSingers", - clearButtonEnglishCoords, - buttonImages.normal, - buttonImages.mouseOver, - buttonImages.mouseDown, - ClearButtonEnglishSingers_Click - ); - - this.Controls.Add(clearButtonEnglishSingers); - } - private void ClearButtonEnglishSingers_Click(object sender, EventArgs e) { - if (this.Controls.Contains(inputBoxEnglishSingers) && inputBoxEnglishSingers.Text.Length > 0) + if (pictureBoxEnglishSingers.Controls.Contains(inputBoxEnglishSingers) && inputBoxEnglishSingers.Text.Length > 0) { inputBoxEnglishSingers.Text = ""; } } - - private void InitializeCloseButtonEnglishSingers() - { - var data = LoadBtnConfigData(); - closeButtonEnglishCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "closeButtonEnglishSingers"); - var buttonImages = LoadButtonImages(data, "CloseButtonImagesEnglish"); - - closeButtonEnglishSingers = CreateSpecialButton( - "btnCloseEnglishSingers", - closeButtonEnglishCoords, - buttonImages.normal, - buttonImages.mouseOver, - buttonImages.mouseDown, - CloseButtonEnglishSingers_Click - ); - - this.Controls.Add(closeButtonEnglishSingers); - } - private void CloseButtonEnglishSingers_Click(object sender, EventArgs e) { - + pictureBoxEnglishSingers.Visible = false; englishSearchButton.BackgroundImage = englishSearchNormalBackground; FindEnglishSingers(); SetEnglishSingersAndButtonsVisibility(false); } - private void FindEnglishSingers(){ - string searchText = inputBoxEnglishSingers.Text; - string query = string.IsNullOrWhiteSpace(searchText) - ? "SELECT * FROM artists LIMIT 1000;" - : $"SELECT * FROM artists WHERE `name` LIKE '%{searchText}%';"; - //string query = $"SELECT * FROM ArtistLibrary WHERE `歌手姓名` LIKE '{searchText}%' "; - var searchResults = SearchSingers_Mysql(query); - - currentPage = 0; - currentArtistList = searchResults; - totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage); - - multiPagePanel.currentPageIndex = 0; - multiPagePanel.LoadSingers(currentArtistList); - } - private void InitializeInputBoxEnglishSingers() + private void FindEnglishSingers() { - try - { - var parser = new FileIniDataParser(); - parser.Parser.Configuration.AssigmentSpacer = ""; - parser.Parser.Configuration.CommentString = "#"; - parser.Parser.Configuration.CaseInsensitive = true; + string searchText = inputBoxEnglishSingers.Text; + string query = string.IsNullOrWhiteSpace(searchText) + ? "SELECT * FROM artists LIMIT 1000;" + : $"SELECT * FROM artists WHERE `name` LIKE '%{searchText}%';"; + //string query = $"SELECT * FROM ArtistLibrary WHERE `歌手姓名` LIKE '{searchText}%' "; + var searchResults = SearchSingers_Mysql(query); - - IniData data; - using (var reader = new StreamReader("img.ini", System.Text.Encoding.UTF8)) - { - data = parser.ReadData(reader); - } + currentPage = 0; + currentArtistList = searchResults; + totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage); - int x = int.Parse(data["InputBoxEnglishSingers"]["X"]); - int y = int.Parse(data["InputBoxEnglishSingers"]["Y"]); - int width = int.Parse(data["InputBoxEnglishSingers"]["Width"]); - int height = int.Parse(data["InputBoxEnglishSingers"]["Height"]); - string fontName = data["InputBoxEnglishSingers"]["FontName"]; - float fontSize = float.Parse(data["InputBoxEnglishSingers"]["FontSize"]); - FontStyle fontStyle = (FontStyle)Enum.Parse(typeof(FontStyle), data["InputBoxEnglishSingers"]["FontStyle"]); - Color foreColor = Color.FromName(data["InputBoxEnglishSingers"]["ForeColor"]); - - inputBoxEnglishSingers = new RichTextBox - { - Visible = false, - Name = "inputBoxEnglishSingers", - ForeColor = foreColor, - Font = new Font(fontName, fontSize / 900 * Screen.PrimaryScreen.Bounds.Height, fontStyle) - }; - - ResizeAndPositionControl(inputBoxEnglishSingers, x, y, width, height); - - this.Controls.Add(inputBoxEnglishSingers); - } - catch (Exception ex) - { - Console.WriteLine($"An error occurred: {ex.Message}"); - } - } - - private void ShowImageOnPictureBoxEnglishSingers(string imagePath) - { - try - { - var parser = new FileIniDataParser(); - parser.Parser.Configuration.AssigmentSpacer = ""; - parser.Parser.Configuration.CommentString = "#"; - parser.Parser.Configuration.CaseInsensitive = true; - - - IniData data; - using (var reader = new StreamReader("img.ini", System.Text.Encoding.UTF8)) - { - data = parser.ReadData(reader); - } - - int x = int.Parse(data["PictureBoxEnglishSingers"]["X"]); - int y = int.Parse(data["PictureBoxEnglishSingers"]["Y"]); - int width = int.Parse(data["PictureBoxEnglishSingers"]["Width"]); - int height = int.Parse(data["PictureBoxEnglishSingers"]["Height"]); - - - Bitmap originalImage = new Bitmap(imagePath); - - - pictureBoxEnglishSingers.Image = originalImage; - - - ResizeAndPositionPictureBox(pictureBoxEnglishSingers, x, y, width, height); - - pictureBoxEnglishSingers.Visible = true; - } - catch (Exception ex) - { - Console.WriteLine($"An error occurred: {ex.Message}"); - } - } - - private void SetEnglishSingersAndButtonsVisibility(bool isVisible) - { - System.Action action = () => - { - SuspendLayout(); - - pictureBoxEnglishSingers.Visible = isVisible; - if (isVisible) pictureBoxEnglishSingers.BringToFront(); - - foreach (var button in numberButtonsForSingers) - { - button.Visible = isVisible; - if (isVisible) button.BringToFront(); - } - - foreach (var button in letterButtonsForEnglishSingers) - { - button.Visible = isVisible; - if (isVisible) button.BringToFront(); - } - - - if (modifyButtonEnglishSingers != null) - { - modifyButtonEnglishSingers.Visible = isVisible; - if (isVisible) modifyButtonEnglishSingers.BringToFront(); - } - - if (clearButtonEnglishSingers != null) - { - clearButtonEnglishSingers.Visible = isVisible; - if (isVisible) clearButtonEnglishSingers.BringToFront(); - } - if (closeButtonEnglishSingers != null) - { - closeButtonEnglishSingers.Visible = isVisible; - if (isVisible) closeButtonEnglishSingers.BringToFront(); - } - - - if (inputBoxEnglishSingers != null) - { - inputBoxEnglishSingers.Visible = isVisible; - if (isVisible) inputBoxEnglishSingers.BringToFront(); - } - - ResumeLayout(); - PerformLayout(); - - - pictureBoxEnglishSingers.Refresh(); - foreach (var button in numberButtonsForSingers.Concat(letterButtonsForEnglishSingers)) - { - button.Refresh(); - } - - - if (modifyButtonEnglishSingers != null) modifyButtonEnglishSingers.Refresh(); - if (clearButtonEnglishSingers != null) clearButtonEnglishSingers.Refresh(); - if (closeButtonEnglishSingers != null) closeButtonEnglishSingers.Refresh(); - if (inputBoxEnglishSingers != null) inputBoxEnglishSingers.Refresh(); - }; - - if (this.InvokeRequired) - { - this.Invoke(action); - } - else - { - action(); - } + multiPagePanel.currentPageIndex = 0; + multiPagePanel.LoadSingers(currentArtistList); } } } \ No newline at end of file diff --git a/PrimaryFormParts/SingerSearch/PrimaryForm.SingerSearch.PinyinSearch.cs b/PrimaryFormParts/SingerSearch/PrimaryForm.SingerSearch.PinyinSearch.cs index 436a5d4..f6b0c7f 100644 --- a/PrimaryFormParts/SingerSearch/PrimaryForm.SingerSearch.PinyinSearch.cs +++ b/PrimaryFormParts/SingerSearch/PrimaryForm.SingerSearch.PinyinSearch.cs @@ -1,215 +1,63 @@ using System.IO; -using IniParser; -using IniParser.Model; namespace DualScreenDemo { public partial class PrimaryForm { private PictureBox pictureBoxPinYinSingers; - private Button[] letterButtonsForPinYinSingers; private Button modifyButtonPinYinSingers; private Button clearButtonPinYinSingers; private Button closeButtonPinYinSingers; - - private (int X, int Y, int Width, int Height) modifyButtonPinYinCoords; - private (int X, int Y, int Width, int Height) clearButtonPinYinCoords; - private (int X, int Y, int Width, int Height) closeButtonPinYinCoords; - private RichTextBox inputBoxPinYinSingers; - private void PinyinSingerSearchButton_Click(object sender, EventArgs e) - { - - UpdateSSearchBtn(pinyinSearchButton, pinyinSearchActiveBackground); - - var configData = LoadBtnConfigData(); - string pinyinImagePath = Path.Combine(serverPath, configData["ImagePaths"]["PinYinSingers"]); - - ShowImageOnPictureBoxPinYinSingers(Path.Combine(serverPath, pinyinImagePath)); - - - - SetZhuYinSingersAndButtonsVisibility(false); // 隱藏注音搜尋相關控件 - SetEnglishSingersAndButtonsVisibility(false); // 隱藏英文搜尋相關控件 - SetWordCountSingersAndButtonsVisibility(false); // 隱藏字數搜尋相關控件 - SetHandWritingForSingersAndButtonsVisibility(false); // 隱藏手寫搜尋相關控件 - - SetPinYinSingersAndButtonsVisibility(true); - //SetPictureBoxArtistSearchAndButtonsVisibility(false); - pictureBoxPinYinSingers.Visible = true; - } - - private void InitializeLetterButtonsForPinYinSingers() - { - var data = LoadBtnConfigData(); - var buttonImages = LoadButtonImages(data, "PinYinLetterButtonImages", 26); - string qwertyLayout = "QWERTYUIOPASDFGHJKLZXCVBNM"; - letterButtonsForPinYinSingers = new Button[26]; - - for (int i = 0; i < 26; i++) - { - var coords = data["PinYinLetterButtonCoordinates"][$"button{i}"].Split(','); - letterButtonsForPinYinSingers[i] = CreateButton( - $"letterButton_{qwertyLayout[i]}", - (int.Parse(coords[0]), int.Parse(coords[1]), int.Parse(coords[2]), int.Parse(coords[3])), - buttonImages[$"button{i}"].normal, - buttonImages[$"button{i}"].mouseDown, - buttonImages[$"button{i}"].mouseOver, - LetterButtonPinYinSingers_Click - ); - letterButtonsForPinYinSingers[i].Tag = qwertyLayout[i]; - this.Controls.Add(letterButtonsForPinYinSingers[i]); - } - } - - private void LetterButtonPinYinSingers_Click(object sender, EventArgs e) - { - - var button = sender as Button; - if (button != null && button.Tag != null) - { - if (inputBoxPinYinSingers.Visible) - { - inputBoxPinYinSingers.Text += button.Tag.ToString(); - } - } - } - private void InitializeButtonsForPinYinSingers() { - InitializeLetterButtonsForPinYinSingers(); - InitializeSpecialButtonsForPinYinSingers(); InitializeInputBoxPinYinSingers(); + InitializePinYinSingersButton(); + InitializeAlphbtBtns(pictureBoxPinYinSingers, LetterButtonPinYinSingers_Click); } - - private void InitializeSpecialButtonsForPinYinSingers() - { - - InitializeModifyButtonPinYinSingers(); - - - InitializeClearButtonPinYinSingers(); - - - InitializeCloseButtonPinYinSingers(); - } - - private void InitializeModifyButtonPinYinSingers() + private void InitializePinYinSingersButton() { var data = LoadBtnConfigData(); - modifyButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "modifyButtonPinYinSingers"); - var buttonImages = LoadButtonImages(data, "ModifyButtonImagesPinYin"); - modifyButtonPinYinSingers = CreateSpecialButton( - "btnModifyPinYinSingers", - modifyButtonPinYinCoords, - buttonImages.normal, - buttonImages.mouseOver, - buttonImages.mouseDown, - ModifyButtonPinYinSingers_Click - ); - } + modifyButtonPinYinSingers = new Button { Name = "modifyButtonPinYinSingers" }; + ConfigureButton(modifyButtonPinYinSingers, 650, 264, 72, 67, + new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesPinYin"]["normal"])), + new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesPinYin"]["mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesPinYin"]["mouseDown"])), + ModifyButtonPinYinSingers_Click); - private void ModifyButtonPinYinSingers_Click(object sender, EventArgs e) - { - - if (this.Controls.Contains(inputBoxPinYinSingers) && inputBoxPinYinSingers.Text.Length > 0) - { - inputBoxPinYinSingers.Text = inputBoxPinYinSingers.Text.Substring(0, inputBoxPinYinSingers.Text.Length - 1); - } - } + pictureBoxPinYinSingers.Controls.Add(modifyButtonPinYinSingers); - private void InitializeClearButtonPinYinSingers() - { - var data = LoadBtnConfigData(); - clearButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "clearButtonPinYinSingers"); - var buttonImages = LoadButtonImages(data, "ClearButtonImagesPinYin"); - clearButtonPinYinSingers = CreateSpecialButton( - "btnClearPinYinSingers", - clearButtonPinYinCoords, - buttonImages.normal, - buttonImages.mouseOver, - buttonImages.mouseDown, - ClearButtonPinYinSingers_Click - ); - } + clearButtonPinYinSingers = new Button { Name = "clearButtonPinYinSingers" }; + ConfigureButton(clearButtonPinYinSingers, 8, 264, 72, 67, + new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesPinYin"]["normal"])), + new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesPinYin"]["mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesPinYin"]["mouseDown"])), + ClearButtonPinYinSingers_Click); - private void ClearButtonPinYinSingers_Click(object sender, EventArgs e) - { - if (this.Controls.Contains(inputBoxPinYinSingers) && inputBoxPinYinSingers.Text.Length > 0) - { - inputBoxPinYinSingers.Text = ""; - } - } + pictureBoxPinYinSingers.Controls.Add(clearButtonPinYinSingers); - private void InitializeCloseButtonPinYinSingers() - { - var data = LoadBtnConfigData(); - closeButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "closeButtonPinYinSingers"); - var buttonImages = LoadButtonImages(data, "CloseButtonImagesPinYin"); - closeButtonPinYinSingers = CreateSpecialButton( - "btnClosePinYinSingers", - closeButtonPinYinCoords, - buttonImages.normal, - buttonImages.mouseOver, - buttonImages.mouseDown, - CloseButtonPinYinSingers_Click - ); - } - - private void CloseButtonPinYinSingers_Click(object sender, EventArgs e) - { - pictureBoxPinYinSingers.Visible = false; - pinyinSearchButton.BackgroundImage = pinyinSearchNormalBackground; - FindPinYinSingers(); - SetPinYinSingersAndButtonsVisibility(false); - } - private void FindPinYinSingers(){ - string searchText = inputBoxPinYinSingers.Text; - // 在這裡添加搜尋歌曲的邏輯 - // 例如:根據輸入框的內容搜尋歌曲 - string query = string.IsNullOrWhiteSpace(searchText) - ? "SELECT * FROM artists; LIMIT 1000" - : $"SELECT * FROM artists WHERE `pinyin_abbr` LIKE '{searchText}%';"; - //string query = $"SELECT * FROM SongLibrary WHERE `歌星A拼音` LIKE '{searchText}%' OR `歌星B拼音` LIKE '{searchText}%' "; - - var searchResults = SearchSingers_Mysql(query); - // 重置分頁 - currentPage = 0; - currentArtistList = searchResults; - totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage); - multiPagePanel.currentPageIndex = 0; - multiPagePanel.LoadSingers(currentArtistList); + closeButtonPinYinSingers = new Button { Name = "closeButtonPinYinSingers" }; + ConfigureButton(closeButtonPinYinSingers, 730, 264, 72, 67, + new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesPinYin"]["normal"])), + new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesPinYin"]["mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesPinYin"]["mouseDown"])), + CloseButtonPinYinSingers_Click); + pictureBoxPinYinSingers.Controls.Add(closeButtonPinYinSingers); } private void InitializeInputBoxPinYinSingers() { try { - var parser = new FileIniDataParser(); - parser.Parser.Configuration.AssigmentSpacer = ""; - parser.Parser.Configuration.CommentString = "#"; - parser.Parser.Configuration.CaseInsensitive = true; - - - IniData data; - using (var reader = new StreamReader("img.ini", System.Text.Encoding.UTF8)) - { - data = parser.ReadData(reader); - } - - int x = int.Parse(data["InputBoxPinYinSingers"]["X"]); - int y = int.Parse(data["InputBoxPinYinSingers"]["Y"]); - int width = int.Parse(data["InputBoxPinYinSingers"]["Width"]); - int height = int.Parse(data["InputBoxPinYinSingers"]["Height"]); - string fontName = data["InputBoxPinYinSingers"]["FontName"]; - float fontSize = float.Parse(data["InputBoxPinYinSingers"]["FontSize"]); - FontStyle fontStyle = (FontStyle)Enum.Parse(typeof(FontStyle), data["InputBoxPinYinSingers"]["FontStyle"]); - Color foreColor = Color.FromName(data["InputBoxPinYinSingers"]["ForeColor"]); + string fontName = "Times New Roman"; + float fontSize = 26; + FontStyle fontStyle = FontStyle.Regular; + Color foreColor = Color.Black; inputBoxPinYinSingers = new RichTextBox { @@ -219,23 +67,9 @@ namespace DualScreenDemo Font = new Font(fontName, fontSize / 900 * Screen.PrimaryScreen.Bounds.Height, fontStyle) }; - ResizeAndPositionControl(inputBoxPinYinSingers, x, y, width, height); + ResizeAndPositionControl(inputBoxPinYinSingers, 20, 25, 448, 57); - /*inputBoxPinYinSingers.TextChanged += (sender, e) => - { - string searchText = inputBoxPinYinSingers.Text; - var searchResults = allSongs.Where(song => song.ArtistAPinyin.Replace(" ", "").StartsWith(searchText)) - .Union(allSongs.Where(song => song.ArtistBPinyin.Replace(" ", "").StartsWith(searchText))) - .ToList(); - currentPage = 0; - currentSongList = searchResults; - totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage); - - multiPagePanel.currentPageIndex = 0; - multiPagePanel.LoadSongs(currentSongList); - };*/ - - this.Controls.Add(inputBoxPinYinSingers); + pictureBoxPinYinSingers.Controls.Add(inputBoxPinYinSingers); } catch (Exception ex) { @@ -243,41 +77,14 @@ namespace DualScreenDemo } } - private (int X, int Y, int Width, int Height) pictureBoxPinYinSingerCoords; - - private void LoadPictureBoxPinYinSingerCoordsFromConfig() - { - var parser = new FileIniDataParser(); - string iniPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "img.ini"); - IniData data = parser.ReadFile(iniPath); - - - var coords = data["PictureBoxPinYinSingers"]; - pictureBoxPinYinSingerCoords = ( - int.Parse(coords["X"]), - int.Parse(coords["Y"]), - int.Parse(coords["Width"]), - int.Parse(coords["Height"]) - ); - } - private void ShowImageOnPictureBoxPinYinSingers(string imagePath) { - - LoadPictureBoxPinYinSingerCoordsFromConfig(); - - Bitmap originalImage = new Bitmap(imagePath); - - Rectangle displayArea = new Rectangle(pictureBoxPinYinSingerCoords.X, pictureBoxPinYinSingerCoords.Y, pictureBoxPinYinSingerCoords.Width, pictureBoxPinYinSingerCoords.Height); - - pictureBoxPinYinSingers.Image = originalImage; - - ResizeAndPositionPictureBox(pictureBoxPinYinSingers, displayArea.X, displayArea.Y, displayArea.Width, displayArea.Height); - + ResizeAndPositionPictureBox(pictureBoxPinYinSingers, 390, 360, 808, 356); + pictureBoxPinYinSingers.Visible = true; } @@ -286,85 +93,8 @@ namespace DualScreenDemo System.Action action = () => { SuspendLayout(); - - if (pictureBoxPinYinSingers == null) - { - Console.WriteLine("pictureBoxPinYinSingers is null"); - } - else - { - pictureBoxPinYinSingers.Visible = isVisible; - if (isVisible) pictureBoxPinYinSingers.BringToFront(); - pictureBoxPinYinSingers.Refresh(); - } - - if (letterButtonsForPinYinSingers == null) - { - Console.WriteLine("letterButtonsForPinYinSingers is null"); - } - else - { - foreach (var button in letterButtonsForPinYinSingers) - { - if (button == null) - { - Console.WriteLine("A button in letterButtonsForPinYinSingers is null"); - } - else - { - button.Visible = isVisible; - if (isVisible) button.BringToFront(); - button.Refresh(); - } - } - } - - if (modifyButtonPinYinSingers == null) - { - Console.WriteLine("modifyButtonPinYinSingers is null"); - } - else - { - modifyButtonPinYinSingers.Visible = isVisible; - if (isVisible) modifyButtonPinYinSingers.BringToFront(); - modifyButtonPinYinSingers.Refresh(); - } - - if (clearButtonPinYinSingers == null) - { - Console.WriteLine("clearButtonPinYinSingers is null"); - } - else - { - clearButtonPinYinSingers.Visible = isVisible; - if (isVisible) clearButtonPinYinSingers.BringToFront(); - clearButtonPinYinSingers.Refresh(); - } - - if (closeButtonPinYinSingers == null) - { - Console.WriteLine("closeButtonPinYinSingers is null"); - } - else - { - closeButtonPinYinSingers.Visible = isVisible; - if (isVisible) closeButtonPinYinSingers.BringToFront(); - closeButtonPinYinSingers.Refresh(); - } - - if (inputBoxPinYinSingers == null) - { - Console.WriteLine("inputBoxPinYinSingers is null"); - } - else - { - inputBoxPinYinSingers.Visible = isVisible; - if (isVisible) inputBoxPinYinSingers.BringToFront(); - inputBoxPinYinSingers.Refresh(); - } - - ResumeLayout(); - PerformLayout(); + if (isVisible) SetUIVisible(pictureBoxPinYinSingers); + else CloseUI(pictureBoxPinYinSingers); }; if (this.InvokeRequired) @@ -376,5 +106,82 @@ namespace DualScreenDemo action(); } } + + #region 按鈕點擊事件 + private void PinyinSingerSearchButton_Click(object sender, EventArgs e) + { + + UpdateSSearchBtn(pinyinSearchButton, pinyinSearchActiveBackground); + + var configData = LoadBtnConfigData(); + string pinyinImagePath = Path.Combine(serverPath, configData["ImagePaths"]["PinYinSingers"]); + + ShowImageOnPictureBoxPinYinSingers(Path.Combine(serverPath, pinyinImagePath)); + + + + SetZhuYinSingersAndButtonsVisibility(false); // 隱藏注音搜尋相關控件 + SetEnglishSingersAndButtonsVisibility(false); // 隱藏英文搜尋相關控件 + SetWordCountSingersAndButtonsVisibility(false); // 隱藏字數搜尋相關控件 + SetHandWritingForSingersAndButtonsVisibility(false); // 隱藏手寫搜尋相關控件 + + SetPinYinSingersAndButtonsVisibility(true); + //SetPictureBoxArtistSearchAndButtonsVisibility(false); + pictureBoxPinYinSingers.Visible = true; + } + private void LetterButtonPinYinSingers_Click(object sender, EventArgs e) + { + + var button = sender as Button; + if (button != null && button.Tag != null) + { + if (inputBoxPinYinSingers.Visible) + { + inputBoxPinYinSingers.Text += button.Tag.ToString(); + } + } + } + private void ModifyButtonPinYinSingers_Click(object sender, EventArgs e) + { + + if (pictureBoxPinYinSingers.Controls.Contains(inputBoxPinYinSingers) && inputBoxPinYinSingers.Text.Length > 0) + { + inputBoxPinYinSingers.Text = inputBoxPinYinSingers.Text.Substring(0, inputBoxPinYinSingers.Text.Length - 1); + } + } + private void ClearButtonPinYinSingers_Click(object sender, EventArgs e) + { + if (pictureBoxPinYinSingers.Controls.Contains(inputBoxPinYinSingers) && inputBoxPinYinSingers.Text.Length > 0) + { + inputBoxPinYinSingers.Text = ""; + } + } + private void CloseButtonPinYinSingers_Click(object sender, EventArgs e) + { + pictureBoxPinYinSingers.Visible = false; + pinyinSearchButton.BackgroundImage = pinyinSearchNormalBackground; + FindPinYinSingers(); + SetPinYinSingersAndButtonsVisibility(false); + } + private void FindPinYinSingers() + { + string searchText = inputBoxPinYinSingers.Text; + // 在這裡添加搜尋歌曲的邏輯 + // 例如:根據輸入框的內容搜尋歌曲 + string query = string.IsNullOrWhiteSpace(searchText) + ? "SELECT * FROM artists; LIMIT 1000" + : $"SELECT * FROM artists WHERE `pinyin_abbr` LIKE '{searchText}%';"; + //string query = $"SELECT * FROM SongLibrary WHERE `歌星A拼音` LIKE '{searchText}%' OR `歌星B拼音` LIKE '{searchText}%' "; + + var searchResults = SearchSingers_Mysql(query); + // 重置分頁 + currentPage = 0; + currentArtistList = searchResults; + totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage); + multiPagePanel.currentPageIndex = 0; + multiPagePanel.LoadSingers(currentArtistList); + + } + #endregion } } \ No newline at end of file diff --git a/PrimaryFormParts/SingerSearch/PrimaryForm.SingerSearch.WordCountSearch.cs b/PrimaryFormParts/SingerSearch/PrimaryForm.SingerSearch.WordCountSearch.cs index 37376c8..87d4380 100644 --- a/PrimaryFormParts/SingerSearch/PrimaryForm.SingerSearch.WordCountSearch.cs +++ b/PrimaryFormParts/SingerSearch/PrimaryForm.SingerSearch.WordCountSearch.cs @@ -5,7 +5,6 @@ namespace DualScreenDemo public partial class PrimaryForm { private PictureBox pictureBoxWordCountSingers; - private Button[] numberWordCountButtonsForSingers; private Button modifyButtonWordCountSingers; private Button clearButtonWordCountSingers; private Button closeButtonWordCountSingers; diff --git a/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.EnglishSearch.cs b/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.EnglishSearch.cs index de1b2ab..0bcd47d 100644 --- a/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.EnglishSearch.cs +++ b/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.EnglishSearch.cs @@ -1,273 +1,161 @@ using System.IO; -using IniParser; -using IniParser.Model; -/* 歌曲查詢 英文輸入 */ namespace DualScreenDemo { public partial class PrimaryForm { - /* 主頁面設計 */ private PictureBox pictureBoxEnglishSongs; - private Button[] numberButtonsForSongs; private Button[] letterButtonsForEnglishSongs; + private int[] ButtonsNumberSymbols = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]; + private string[] ButtonsEnglishSymbols = ["Q","W","E","R","T","Y","U","I","O","P", + "A","S","D","F","G","H","J","K","L", + "Z","X","C","V","B","N","M"]; private Button modifyButtonEnglishSongs; private Button clearButtonEnglishSongs; private Button closeButtonEnglishSongs; private RichTextBox inputBoxEnglishSongs; - private void EnglishSearchSongsButton_Click(object sender, EventArgs e) - { - zhuyinSearchSongButton.BackgroundImage = zhuyinSearchSongNormalBackground; - englishSearchSongButton.BackgroundImage = englishSearchSongActiveBackground; - pinyinSearchSongButton.BackgroundImage = pinyinSearchSongNormalBackground; - wordCountSearchSongButton.BackgroundImage = wordCountSearchSongNormalBackground; - handWritingSearchSongButton.BackgroundImage = handWritingSearchSongNormalBackground; - numberSearchSongButton.BackgroundImage = numberSearchSongNormalBackground; - - bool shouldBeVisible = !pictureBoxEnglishSongs.Visible; - - - var configData = LoadBtnConfigData(); - string imagePath = Path.Combine(serverPath, configData["ImagePaths"]["EnglishSongs"]); - - ShowImageOnPictureBoxEnglishSongs(Path.Combine(serverPath, imagePath)); - // 鍵盤UI介面顯示設定 - SetWordCountSongsAndButtonsVisibility(false); - SetEnglishSongsAndButtonsVisibility(true); - SetPinYinSongsAndButtonsVisibility(false); - SetHandWritingForSongsAndButtonsVisibility(false); - SetSongIDSearchAndButtonsVisibility(false); - SetZhuYinSongsAndButtonsVisibility(false); - - ResetinputBox(); - pictureBoxEnglishSongs.Visible = true; - } - - - private void InitializeNumberButtonsForSongs() - { - var data = LoadBtnConfigData(); - numberButtonCoords = LoadButtonCoordinates(data, "NumberButtonCoordinates", 10); - var buttonImages = LoadButtonImages(data, "NumberButtonImages", 10); - /* 按鈕圖片路徑設置 */ - numberButtonsForSongs = new Button[10]; - for (int i = 0; i < 10; i++) - { - string normalImagePath = buttonImages[$"button{i}"].normal; - string mouseDownImagePath = buttonImages[$"button{i}"].mouseDown; - string mouseOverImagePath = buttonImages[$"button{i}"].mouseOver; - - - if (normalImagePath == null || mouseDownImagePath == null || mouseOverImagePath == null) - { - Console.WriteLine($"Error: One or more image paths for button{i} are null."); - continue; - } - - - numberButtonsForSongs[i] = CreateButton( - $"numberButton_{i}", - numberButtonCoords[i], - normalImagePath, - mouseDownImagePath, - mouseOverImagePath, - NumberButtonForSongs_Click - ); - numberButtonsForSongs[i].Tag = (i + 1) % 10; - this.Controls.Add(numberButtonsForSongs[i]); - } - } - /* 按鈕按下事件 */ - private void NumberButtonForSongs_Click(object sender, EventArgs e) - { - - var button = sender as Button; - if (button != null && button.Tag != null) - { - if (inputBoxEnglishSongs.Visible) - { - inputBoxEnglishSongs.Text += button.Tag.ToString(); - } - } - } - - /* 鍵盤對應按鈕位置 */ - private void InitializeLetterButtonsForEnglishSongs() - { - var data = LoadBtnConfigData(); - var buttonImages = LoadButtonImages(data, "EnglishLetterButtonImages", 26); - string qwertyLayout = "QWERTYUIOPASDFGHJKLZXCVBNM"; - letterButtonsForEnglishSongs = new Button[26]; - - for (int i = 0; i < 26; i++) - { - var coords = data["EnglishLetterButtonCoordinates"][$"button{i}"].Split(','); - letterButtonsForEnglishSongs[i] = CreateButton( - $"letterButton_{qwertyLayout[i]}", - (int.Parse(coords[0]), int.Parse(coords[1]), int.Parse(coords[2]), int.Parse(coords[3])), - buttonImages[$"button{i}"].normal, - buttonImages[$"button{i}"].mouseDown, - buttonImages[$"button{i}"].mouseOver, - LetterButtonEnglishSongs_Click - ); - letterButtonsForEnglishSongs[i].Tag = qwertyLayout[i]; - this.Controls.Add(letterButtonsForEnglishSongs[i]); - } - } - - private void LetterButtonEnglishSongs_Click(object sender, EventArgs e) - { - - var button = sender as Button; - if (button != null && button.Tag != null) - { - if (inputBoxEnglishSongs.Visible) - { - inputBoxEnglishSongs.Text += button.Tag.ToString(); - } - } - } - private void InitializeButtonsForEnglishSongs() { - InitializeNumberButtonsForSongs(); - InitializeLetterButtonsForEnglishSongs(); - - - InitializeModifyButtonEnglishSongs(); - - - InitializeClearButtonEnglishSongs(); - - - InitializeCloseButtonEnglishSongs(); - InitializeInputBoxEnglishSongs(); + InitializeEngAlphbtBtns(pictureBoxEnglishSongs,LetterButtonEnglishSongs_Click); + InitializeEngSongsButton(); } - private void InitializeModifyButtonEnglishSongs() + private void InitializeEngSongsButton() { var data = LoadBtnConfigData(); - modifyButtonEnglishCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "modifyButtonEnglishSongs"); - var buttonImages = LoadButtonImages(data, "ModifyButtonImagesEnglish"); - modifyButtonEnglishSongs = CreateSpecialButton( - "btnModifyEnglishSongs", - modifyButtonEnglishCoords, - buttonImages.normal, - buttonImages.mouseOver, - buttonImages.mouseDown, - ModifyButtonEnglishSongs_Click - ); + modifyButtonEnglishSongs = new Button { Name = "modifyButtonEnglishSongs" }; + ConfigureButton(modifyButtonEnglishSongs, 650, 275, 72, 67, + new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesEnglish"]["normal"])), + new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesEnglish"]["mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesEnglish"]["mouseDown"])), + ModifyButtonEnglishSongs_Click); - this.Controls.Add(modifyButtonEnglishSongs); + pictureBoxEnglishSongs.Controls.Add(modifyButtonEnglishSongs); + + + clearButtonEnglishSongs = new Button { Name = "clearButtonEnglishSongs" }; + ConfigureButton(clearButtonEnglishSongs, 8, 275, 72, 67, + new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesEnglish"]["normal"])), + new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesEnglish"]["mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesEnglish"]["mouseDown"])), + ClearButtonEnglishSongs_Click); + + pictureBoxEnglishSongs.Controls.Add(clearButtonEnglishSongs); + + + closeButtonEnglishSongs = new Button { Name = "closeButtonEnglishSongs" }; + ConfigureButton(closeButtonEnglishSongs, 730, 275, 72, 67, + new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesEnglish"]["normal"])), + new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesEnglish"]["mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesEnglish"]["mouseDown"])), + CloseButtonEnglishSongs_Click); + + pictureBoxEnglishSongs.Controls.Add(closeButtonEnglishSongs); } - - private void ModifyButtonEnglishSongs_Click(object sender, EventArgs e) + private void InitializeEngAlphbtBtns(Control control, EventHandler handler) { - - if (this.Controls.Contains(inputBoxEnglishSongs) && inputBoxEnglishSongs.Text.Length > 0) + numberButtonsForSongs = new Button[10]; + letterButtonsForEnglishSongs = new Button[26]; + // 設置上排按鈕 + int x = 8; + for (int i = 0; i < 10; i++) { - inputBoxEnglishSongs.Text = inputBoxEnglishSongs.Text.Substring(0, inputBoxEnglishSongs.Text.Length - 1); + CreateNumberBtns(i, x, 65, control, handler); + x += 80; + } + + x = 8; + for (int i = 0; i < 10; i++) + { + CreateEngAlphbtBtns(i, x, 135, control, handler); + x += 80; + } + + x = 40; + for (int i = 10; i < 19; i++) + { + CreateEngAlphbtBtns(i, x, 205, control, handler); + x += 80; + } + // 設置下排按鈕 + x = 88; + for (int i = 19; i < 26; i++) + { + CreateEngAlphbtBtns(i, x, 275, control, handler); + x += 80; } } - - private void InitializeClearButtonEnglishSongs() + private void CreateEngAlphbtBtns(int index, int x, int y, Control control, EventHandler handler) { - var data = LoadBtnConfigData(); - clearButtonEnglishCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "clearButtonEnglishSongs"); - var buttonImages = LoadButtonImages(data, "ClearButtonImagesEnglish"); - - clearButtonEnglishSongs = CreateSpecialButton( - "btnClearEnglishSongs", - clearButtonEnglishCoords, - buttonImages.normal, - buttonImages.mouseOver, - buttonImages.mouseDown, - ClearButtonEnglishSongs_Click - ); - - this.Controls.Add(clearButtonEnglishSongs); - } - - private void ClearButtonEnglishSongs_Click(object sender, EventArgs e) - { - if (this.Controls.Contains(inputBoxEnglishSongs) && inputBoxEnglishSongs.Text.Length > 0) + try { - inputBoxEnglishSongs.Text = ""; + // 加載配置數據 + var data = LoadBtnConfigData(); + // 創建語音按鈕並設置其屬性 + letterButtonsForEnglishSongs[index] = new Button + { + Name = $"ButtonsForEnglish_{ButtonsEnglishSymbols[index]}", // 按鈕名稱設為語音符號名稱 + }; + + ConfigureButton(letterButtonsForEnglishSongs[index], x, y, 72, 67, + new Bitmap(Path.Combine(serverPath, data["EnglishLetterButtonImages"][$"button{index}_normal"])), + new Bitmap(Path.Combine(serverPath, data["EnglishLetterButtonImages"][$"button{index}_mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["EnglishLetterButtonImages"][$"button{index}_mouseDown"])), + handler); + + // 設置按鈕的 Tag 屬性為對應的語音符號 + letterButtonsForEnglishSongs[index].Tag = ButtonsEnglishSymbols[index]; + + // 將按鈕添加到表單的控制項集合中 + control.Controls.Add(letterButtonsForEnglishSongs[index]); + } + catch (Exception ex) + { + Console.WriteLine($"Error creating button at index {index}: {ex.Message}"); } } - - private void InitializeCloseButtonEnglishSongs() + private void CreateNumberBtns(int index, int x, int y, Control control, EventHandler handler) { - var data = LoadBtnConfigData(); - closeButtonEnglishCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "closeButtonEnglishSongs"); - var buttonImages = LoadButtonImages(data, "CloseButtonImagesEnglish"); + try + { + // 加載配置數據 + var data = LoadBtnConfigData(); + // 創建語音按鈕並設置其屬性 + numberButtonsForSongs[index] = new Button + { + Name = $"ButtonsForEnglish_{ButtonsNumberSymbols[index]}", // 按鈕名稱設為語音符號名稱 + }; - closeButtonEnglishSongs = CreateSpecialButton( - "btnCloseEnglishSongs", - closeButtonEnglishCoords, - buttonImages.normal, - buttonImages.mouseOver, - buttonImages.mouseDown, - CloseButtonEnglishSongs_Click - ); - - this.Controls.Add(closeButtonEnglishSongs); - } - - private void CloseButtonEnglishSongs_Click(object sender, EventArgs e) - { - - pictureBoxEnglishSongs.Visible = false; - englishSearchSongButton.BackgroundImage = englishSearchSongNormalBackground; - SetEnglishSongsAndButtonsVisibility(false); - FindEnglishSongs(); - } - private void FindEnglishSongs(){ - string searchText = inputBoxEnglishSongs.Text; - // 檢查是否為空字串或空白字元 - string query = string.IsNullOrWhiteSpace(searchText) - ? "SELECT * FROM song_library_cache ORDER BY song_id DESC LIMIT 1000;" - : $"SELECT * FROM song_library_cache WHERE song_name LIKE '{searchText}%' ORDER BY song_name DESC;"; - - var searchResults = SearchSongs_Mysql(query); - // 重置分頁 - currentPage = 0; - totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage); - // 更新多頁面面板的內容 - multiPagePanel.currentPageIndex = 0; - multiPagePanel.LoadSongs(searchResults); + ConfigureButton(numberButtonsForSongs[index], x, y, 72, 67, + new Bitmap(Path.Combine(serverPath, data["NumberButtonImages"][$"button{index}_normal"])), + new Bitmap(Path.Combine(serverPath, data["NumberButtonImages"][$"button{index}_mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["NumberButtonImages"][$"button{index}_mouseDown"])), + handler); + // 設置按鈕的 Tag 屬性為對應的語音符號 + numberButtonsForSongs[index].Tag = ButtonsNumberSymbols[index]; + // 將按鈕添加到表單的控制項集合中 + control.Controls.Add(numberButtonsForSongs[index]); + } + catch (Exception ex) + { + Console.WriteLine($"Error creating button at index {index}: {ex.Message}"); + } } private void InitializeInputBoxEnglishSongs() { /* 英文輸入介面設定,參考 config.ini */ try { - var parser = new FileIniDataParser(); - parser.Parser.Configuration.AssigmentSpacer = ""; - parser.Parser.Configuration.CommentString = "#"; - parser.Parser.Configuration.CaseInsensitive = true; - - - IniData data; - using (var reader = new StreamReader("img.ini", System.Text.Encoding.UTF8)) - { - data = parser.ReadData(reader); - } - - int x = int.Parse(data["InputBoxEnglishSongs"]["X"]); - int y = int.Parse(data["InputBoxEnglishSongs"]["Y"]); - int width = int.Parse(data["InputBoxEnglishSongs"]["Width"]); - int height = int.Parse(data["InputBoxEnglishSongs"]["Height"]); - string fontName = data["InputBoxEnglishSongs"]["FontName"]; - float fontSize = float.Parse(data["InputBoxEnglishSongs"]["FontSize"]); - FontStyle fontStyle = (FontStyle)Enum.Parse(typeof(FontStyle), data["InputBoxEnglishSongs"]["FontStyle"]); - Color foreColor = Color.FromName(data["InputBoxEnglishSongs"]["ForeColor"]); + string fontName = "Times New Roman"; + float fontSize = 26; + FontStyle fontStyle = FontStyle.Regular; + Color foreColor = Color.Black; inputBoxEnglishSongs = new RichTextBox { @@ -277,9 +165,9 @@ namespace DualScreenDemo Font = new Font(fontName, fontSize / 900 * Screen.PrimaryScreen.Bounds.Height, fontStyle) }; - ResizeAndPositionControl(inputBoxEnglishSongs, x, y, width, height); + ResizeAndPositionControl(inputBoxEnglishSongs, 10, 12, 455, 47); - this.Controls.Add(inputBoxEnglishSongs); + pictureBoxEnglishSongs.Controls.Add(inputBoxEnglishSongs); } catch (Exception ex) { @@ -291,32 +179,13 @@ namespace DualScreenDemo { try { - var parser = new FileIniDataParser(); - parser.Parser.Configuration.AssigmentSpacer = ""; - parser.Parser.Configuration.CommentString = "#"; - parser.Parser.Configuration.CaseInsensitive = true; - - IniData data; - using (var reader = new StreamReader("img.ini", System.Text.Encoding.UTF8)) - { - data = parser.ReadData(reader); - } - - int x = int.Parse(data["PictureBoxEnglishSongs"]["X"]); - int y = int.Parse(data["PictureBoxEnglishSongs"]["Y"]); - int width = int.Parse(data["PictureBoxEnglishSongs"]["Width"]); - int height = int.Parse(data["PictureBoxEnglishSongs"]["Height"]); - - Bitmap originalImage = new Bitmap(imagePath); - pictureBoxEnglishSongs.Image = originalImage; - - - ResizeAndPositionPictureBox(pictureBoxEnglishSongs, x, y, width, height); - + + ResizeAndPositionPictureBox(pictureBoxEnglishSongs, 390, 360, 808, 356); + pictureBoxEnglishSongs.Visible = true; } catch (Exception ex) @@ -330,116 +199,97 @@ namespace DualScreenDemo System.Action action = () => { SuspendLayout(); - - if (pictureBoxEnglishSongs == null) - { - Console.WriteLine("pictureBoxEnglishSongs is null"); - } - else - { - pictureBoxEnglishSongs.Visible = isVisible; - if (isVisible) pictureBoxEnglishSongs.BringToFront(); - pictureBoxEnglishSongs.Refresh(); - } - - if (numberButtonsForSongs == null) - { - Console.WriteLine("numberButtonsForSongs is null"); - } - else - { - foreach (var button in numberButtonsForSongs) - { - if (button == null) - { - Console.WriteLine("A button in numberButtonsForSongs is null"); - } - else - { - button.Visible = isVisible; - if (isVisible) button.BringToFront(); - button.Refresh(); - } - } - } - - if (letterButtonsForEnglishSongs == null) - { - Console.WriteLine("letterButtonsForEnglishSongs is null"); - } - else - { - foreach (var button in letterButtonsForEnglishSongs) - { - if (button == null) - { - Console.WriteLine("A button in letterButtonsForEnglishSongs is null"); - } - else - { - button.Visible = isVisible; - if (isVisible) button.BringToFront(); - button.Refresh(); - } - } - } - - if (modifyButtonEnglishSongs == null) - { - Console.WriteLine("modifyButtonEnglishSongs is null"); - } - else - { - modifyButtonEnglishSongs.Visible = isVisible; - if (isVisible) modifyButtonEnglishSongs.BringToFront(); - modifyButtonEnglishSongs.Refresh(); - } - - if (clearButtonEnglishSongs == null) - { - Console.WriteLine("clearButtonEnglishSongs is null"); - } - else - { - clearButtonEnglishSongs.Visible = isVisible; - if (isVisible) clearButtonEnglishSongs.BringToFront(); - clearButtonEnglishSongs.Refresh(); - } - - if (closeButtonEnglishSongs == null) - { - Console.WriteLine("closeButtonEnglishSongs is null"); - } - else - { - closeButtonEnglishSongs.Visible = isVisible; - if (isVisible) closeButtonEnglishSongs.BringToFront(); - closeButtonEnglishSongs.Refresh(); - } - - if (inputBoxEnglishSongs == null) - { - Console.WriteLine("inputBoxEnglishSongs is null"); - } - else - { - inputBoxEnglishSongs.Visible = isVisible; - if (isVisible) inputBoxEnglishSongs.BringToFront(); - inputBoxEnglishSongs.Refresh(); - } - + if (isVisible) SetUIVisible(pictureBoxEnglishSongs); + else CloseUI(pictureBoxEnglishSongs); ResumeLayout(); - PerformLayout(); + PerformLayout(); }; - if (this.InvokeRequired) + if (pictureBoxEnglishSongs.InvokeRequired) { - this.Invoke(action); + pictureBoxEnglishSongs.Invoke(action); } else { action(); } } + + private void EnglishSearchSongsButton_Click(object sender, EventArgs e) + { + zhuyinSearchSongButton.BackgroundImage = zhuyinSearchSongNormalBackground; + englishSearchSongButton.BackgroundImage = englishSearchSongActiveBackground; + pinyinSearchSongButton.BackgroundImage = pinyinSearchSongNormalBackground; + wordCountSearchSongButton.BackgroundImage = wordCountSearchSongNormalBackground; + handWritingSearchSongButton.BackgroundImage = handWritingSearchSongNormalBackground; + numberSearchSongButton.BackgroundImage = numberSearchSongNormalBackground; + + var configData = LoadBtnConfigData(); + string imagePath = Path.Combine(serverPath, configData["ImagePaths"]["EnglishSongs"]); + + ShowImageOnPictureBoxEnglishSongs(Path.Combine(serverPath, imagePath)); + // 鍵盤UI介面顯示設定 + SetWordCountSongsAndButtonsVisibility(false); + SetEnglishSongsAndButtonsVisibility(true); + SetPinYinSongsAndButtonsVisibility(false); + SetHandWritingForSongsAndButtonsVisibility(false); + SetSongIDSearchAndButtonsVisibility(false); + SetZhuYinSongsAndButtonsVisibility(false); + + ResetinputBox(); + pictureBoxEnglishSongs.Visible = true; + } + private void LetterButtonEnglishSongs_Click(object sender, EventArgs e) + { + + var button = sender as Button; + if (button != null && button.Tag != null) + { + if (inputBoxEnglishSongs.Visible) + { + inputBoxEnglishSongs.Text += button.Tag.ToString(); + } + } + } + + private void ModifyButtonEnglishSongs_Click(object sender, EventArgs e) + { + + if (pictureBoxEnglishSongs.Controls.Contains(inputBoxEnglishSongs) && inputBoxEnglishSongs.Text.Length > 0) + { + inputBoxEnglishSongs.Text = inputBoxEnglishSongs.Text.Substring(0, inputBoxEnglishSongs.Text.Length - 1); + } + } + private void ClearButtonEnglishSongs_Click(object sender, EventArgs e) + { + if (pictureBoxEnglishSongs.Controls.Contains(inputBoxEnglishSongs) && inputBoxEnglishSongs.Text.Length > 0) + { + inputBoxEnglishSongs.Text = ""; + } + } + private void CloseButtonEnglishSongs_Click(object sender, EventArgs e) + { + + pictureBoxEnglishSongs.Visible = false; + englishSearchSongButton.BackgroundImage = englishSearchSongNormalBackground; + SetEnglishSongsAndButtonsVisibility(false); + FindEnglishSongs(); + } + private void FindEnglishSongs() + { + string searchText = inputBoxEnglishSongs.Text; + // 檢查是否為空字串或空白字元 + string query = string.IsNullOrWhiteSpace(searchText) + ? "SELECT * FROM song_library_cache ORDER BY song_id DESC LIMIT 1000;" + : $"SELECT * FROM song_library_cache WHERE song_name LIKE '{searchText}%' ORDER BY song_name DESC;"; + + var searchResults = SearchSongs_Mysql(query); + // 重置分頁 + currentPage = 0; + totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage); + // 更新多頁面面板的內容 + multiPagePanel.currentPageIndex = 0; + multiPagePanel.LoadSongs(searchResults); + } } } \ No newline at end of file diff --git a/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.NumberSearch.cs b/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.NumberSearch.cs index 0a335f8..48316dd 100644 --- a/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.NumberSearch.cs +++ b/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.NumberSearch.cs @@ -1,65 +1,188 @@ using System.IO; -using System.Drawing.Imaging; -using IniParser; -using IniParser.Model; -using System.Text; using DBObj; - -/* - WordCountSongs -> SongIDSearch - WordCount -> SongID - numberWordCount -> numberSongID - NumberWordCount -> NumberSongID - inputBoxWordCountFontName -> inputBoxSongIDFontName - inputBoxWordCountFontSize -> inputBoxSongIDFontSize - inputBoxWordCountFontStyle -> inputBoxSongIDFontStyle - inputBoxWordCountForeColor -> inputBoxSongIDForeColor - LoadConfigDataforWordCountSongs -> LoadConfigDataforSongIDSearch - LoadButtonCoordinatesForWordCountSongs -> LoadButtonCoordinatesForSongIDSearch - LoadButtonImagesForWordCountSongs -> LoadButtonImagesForSongIDSearch - LoadSpecialButtonCoordinatesForWordCountSongs -> LoadSpecialButtonCoordinatesForSongIDSearch - RemoveWhiteBorderForWordCountSongs -> RemoveWhiteBorderForSongIDSearch - CreateSpecialButtonForWordCountSongs -> CreateSpecialButtonForSongIDSearch - LoadInputBoxConfigForWordCountSongs -> LoadInputBoxConfigForSongIDSearch -*/ - - namespace DualScreenDemo { public partial class PrimaryForm { private PictureBox pictureBoxSongIDSearch; - private Button[] numberSongIDButtonsForSongs; private Button modifyButtonSongIDSearch; private Button clearButtonSongIDSearch; private Button closeButtonSongIDSearch; private Button enterButtonSongIDSearch; - - private string[] numberSongIDSymbols; - private (int X, int Y, int Width, int Height)[] numberSongIDButtonCoords; - private Dictionary numberSongIDButtonImages; - - private (int X, int Y, int Width, int Height) modifyButtonSongIDCoords; - private (int X, int Y, int Width, int Height) clearButtonSongIDCoords; - private (int X, int Y, int Width, int Height) closeButtonSongIDCoords; - private (int X, int Y, int Width, int Height) enterButtonSongIDCoords; - private RichTextBox inputBoxSongIDSearch; - private (int X, int Y, int Width, int Height) inputBoxSongIDCoords; - private string inputBoxSongIDFontName; - private float inputBoxSongIDFontSize; - private FontStyle inputBoxSongIDFontStyle; - private Color inputBoxSongIDForeColor; - // private readonly SQLManager songListManager; - /// - /// 點擊「注音歌手搜尋」按鈕時執行的事件處理函式。 - /// 此函式負責更新按鈕的背景圖片、載入對應的歌手圖片,並切換相關 UI 控件的可見性。 - /// - /// 觸發事件的物件(通常是按鈕本身)。 - /// 事件參數。 + + private void InitializeButtonsForSongIDSearch() + { + InitializeInputBoxSongIDSearch(); + InitializeNumberSongIDButtons(pictureBoxSongIDSearch,NumberSongIDButton_Click); + InitializeSongIDButton(); + } + + private void InitializeSongIDButton() + { + // 加載配置數據 + var data = LoadBtnConfigData(); + + + // 初始化「清除」按鈕 + clearButtonSongIDSearch = new Button { Name = "clearButtonSongIDSearch" }; + ConfigureButton(clearButtonSongIDSearch, 55, 274, 72, 67, + new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesSongID"]["normal"])), + new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesSongID"]["mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesSongID"]["mouseDown"])), + ClearButtonSongIDSearch_Click); + + pictureBoxSongIDSearch.Controls.Add(clearButtonSongIDSearch); + + // 初始化「重填」按鈕 + modifyButtonSongIDSearch = new Button { Name = "modifyButtonSongIDSearch" }; + ConfigureButton(modifyButtonSongIDSearch, 136, 274, 72, 67, + new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesSongID"]["normal"])), + new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesSongID"]["mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesSongID"]["mouseDown"])), + ModifyButtonSongIDSearch_Click); + + pictureBoxSongIDSearch.Controls.Add(modifyButtonSongIDSearch); + + // 初始化「確認」按鈕 + enterButtonSongIDSearch = new Button { Name = "btnEnterWordCountSongs" }; + ConfigureButton(enterButtonSongIDSearch, 217, 274, 72, 67, + new Bitmap(Path.Combine(serverPath, data["EnterButtonImagesSongID"]["normal"])), + new Bitmap(Path.Combine(serverPath, data["EnterButtonImagesSongID"]["mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["EnterButtonImagesSongID"]["mouseDown"])), + SongIDSearch_Click); + + pictureBoxSongIDSearch.Controls.Add(enterButtonSongIDSearch); + + // 初始化「關閉」按鈕 + closeButtonSongIDSearch = new Button { Name = "closeButtonSongIDSearch" }; + ConfigureButton(closeButtonSongIDSearch, 298, 274, 72, 67, + new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesSongID"]["normal"])), + new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesSongID"]["mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesSongID"]["mouseDown"])), + CloseButtonClick); + + pictureBoxSongIDSearch.Controls.Add(closeButtonSongIDSearch); + } + private void InitializeNumberSongIDButtons(Control control, EventHandler handler) + { + // 初始化語音按鈕陣列,總共有 10 個按鈕 + numberSongIDButtonsForSongs = new Button[10]; + + // 設置上排數字按鈕 + int x = 10; + for (int i = 0; i < 5; i++) + { + CreateNumBtnSongIDButton(i, x, 120, control, handler); + x += 82; + } + // 設置下排數字按鈕 + x = 10; + for (int i = 5; i < 10; i++) + { + CreateNumBtnSongIDButton(i, x, 197, control, handler); + x += 82; + } + } + private void CreateNumBtnSongIDButton(int index, int x, int y,Control control,EventHandler handler) + { + try + { + // 加載配置數據 + var data = LoadBtnConfigData(); + // 創建語音按鈕並設置其屬性 + numberSongIDButtonsForSongs[index] = new Button + { + Name = $"numberWordCountButton_{numberWordCountSymbols[index]}", // 按鈕名稱設為語音符號名稱 + }; + + ConfigureButton(numberSongIDButtonsForSongs[index], x, y, 72, 67, + new Bitmap(Path.Combine(serverPath, data["NumberWordCountButtonImages"][$"button{index}_normal"])), + new Bitmap(Path.Combine(serverPath, data["NumberWordCountButtonImages"][$"button{index}_mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["NumberWordCountButtonImages"][$"button{index}_mouseDown"])), + handler); + + // 設置按鈕的 Tag 屬性為對應的語音符號 + numberSongIDButtonsForSongs[index].Tag = numberWordCountSymbols[index]; + + // 將按鈕添加到表單的控制項集合中 + control.Controls.Add(numberSongIDButtonsForSongs[index]); + } + catch (Exception ex) + { + Console.WriteLine($"Error creating button at index {index}: {ex.Message}"); + } + } + + private void ShowImageOnPictureBoxSongIDSearch(string imagePath) + { + // 加載原始圖片 + Bitmap originalImage = new Bitmap(imagePath); + // 設置圖片到 PictureBox + pictureBoxSongIDSearch.Image = originalImage; + // 調整 PictureBox 大小和位置 + ResizeAndPositionPictureBox(pictureBoxSongIDSearch, 778, 366, 420, 350); + // 顯示圖片 + pictureBoxSongIDSearch.Visible = true; + } + + private void InitializeInputBoxSongIDSearch() + { + try + { + // 創建一個 RichTextBox 控件來作為輸入框 + inputBoxSongIDSearch = new RichTextBox + { + Name = "inputBoxSongIDSearch", + ForeColor = Color.Black, // 設定文字顏色 + Font = new Font("Times New Roman", 26, FontStyle.Regular), // 設定字體樣式 + ScrollBars = RichTextBoxScrollBars.None // 不顯示滾動條 + }; + + // 調整和定位輸入框的位置及大小 + ResizeAndPositionControl(inputBoxSongIDSearch,10, 55, 400, 60); + + // 將輸入框加入到窗體的控件集合中 + pictureBoxSongIDSearch.Controls.Add(inputBoxSongIDSearch); + } + catch (Exception ex) + { + // 如果初始化過程中出現錯誤,則在控制台輸出錯誤信息 + Console.WriteLine("Error initializing inputBoxSongIDSearch: " + ex.Message); + } + } + + private void SetSongIDSearchAndButtonsVisibility(bool isVisible) + { + // 定義一個動作來處理控制項的顯示或隱藏 + System.Action action = () => + { + try + { + // 暫停控制項佈局的重新排版,提高效率 + SuspendLayout(); + if (isVisible) SetUIVisible(pictureBoxSongIDSearch); + else CloseUI(pictureBoxSongIDSearch); + } + catch (Exception ex) + { + Console.WriteLine("Error in SetSongIDSearchAndButtonsVisibility: " + ex.Message); + } + }; + + // 檢查是否需要在主執行緒外執行 + if (this.InvokeRequired) + { + this.Invoke(action); // 如果需要,透過主執行緒執行 + } + else + { + action(); // 否則直接執行 + } + } private void SongIDSearchSongsButton_Click(object sender, EventArgs e) { // 設定按鈕背景,將「注音搜尋」設為啟動狀態,其餘按鈕恢復為正常狀態 @@ -72,7 +195,7 @@ namespace DualScreenDemo // 載入設定檔,取得圖片路徑資訊 var configData = LoadBtnConfigData(); - + // 取得「注音歌手圖片」的完整路徑 string imagePath = Path.Combine(serverPath, configData["ImagePaths"]["SongIDSearch"]); @@ -80,463 +203,46 @@ namespace DualScreenDemo ShowImageOnPictureBoxSongIDSearch(Path.Combine(serverPath, imagePath)); // 鍵盤UI介面顯示設定 - SetWordCountSongsAndButtonsVisibility(false); + SetWordCountSongsAndButtonsVisibility(false); SetEnglishSongsAndButtonsVisibility(false); SetPinYinSongsAndButtonsVisibility(false); SetHandWritingForSongsAndButtonsVisibility(false); - SetSongIDSearchAndButtonsVisibility(true); + SetSongIDSearchAndButtonsVisibility(true); SetZhuYinSongsAndButtonsVisibility(false); - + ResetinputBox(); SetSongIDSearchAndButtonsVisibility(true); // 顯示字數搜尋相關控件 // 顯示「注音歌手搜尋」的圖片框 pictureBoxSongIDSearch.Visible = true; } - - - /// - /// 從 config.ini 設定檔中載入注音符號(NumberWordCount Symbols)。 - /// 讀取 ini 檔的 [NumberWordCountSymbols] 區塊,並將「Symbols」欄位的值解析為陣列。 - /// - private void LoadNumberSongIDSymbolsFromConfig() + private void NumberSongIDButton_Click(object sender, EventArgs e) { - // 建立 INI 檔案解析器 - var parser = new FileIniDataParser(); - - // 設定檔路徑 - string iniFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "img.ini"); - - // 載入設定檔,取得圖片路徑資訊 - var configData = LoadBtnConfigData(); - - // 取得 [NumberSongIDSymbols] 區塊中的 "Symbols" 欄位內容 - string symbols = configData["NumberSongIDSymbols"]["Symbols"]; - - // 將符號字串以逗號分隔,轉換為字串陣列 - numberSongIDSymbols = symbols.Split(','); - } - - - /// - /// 從 INI 設定數據中讀取注音符號 (NumberSongID Symbols)。 - /// - /// 已解析的 INI 設定數據。 - /// 回傳包含注音符號的字串陣列。 - private string[] LoadNumberSongIDSymbols(IniData data) - { - // 從 INI 檔案的 [NumberSongIDSymbols] 區塊取得 Symbols 欄位值 - string symbols = data["NumberSongIDSymbols"]["Symbols"]; - - // 以逗號分隔字串並轉換為字串陣列 - return symbols.Split(','); - } - - - /// - /// 從 INI 設定數據中載入按鈕座標資料。 - /// - /// 已解析的 INI 設定數據。 - /// 設定檔中按鈕座標所屬的區塊名稱。 - /// 按鈕數量。 - /// 回傳包含按鈕座標的陣列,每個元素是由 (X, Y, Width, Height) 組成的元組。 - private (int X, int Y, int Width, int Height)[] LoadButtonCoordinatesForSongIDSearch(IniData data, string section, int buttonCount) - { - var buttonList = new List<(int X, int Y, int Width, int Height)>(); - - // 迴圈讀取每個按鈕的座標設定 - for (int i = 1; i <= buttonCount; i++) + var button = sender as Button; + if (button != null && button.Tag != null) { - // 取得按鈕座標的字串 (格式: X,Y,Width,Height) - var coordString = data[section][$"button{i}"]; - var coords = coordString.Split(','); - // 將座標資料轉換為 (X, Y, Width, Height) 元組並加入清單 - buttonList.Add(( - int.Parse(coords[0]), // X 座標 - int.Parse(coords[1]), // Y 座標 - int.Parse(coords[2]), // 寬度 - int.Parse(coords[3]) // 高度 - )); - } - - // 回傳所有按鈕座標的陣列 - return buttonList.ToArray(); - } - - /// - /// 從 INI 設定數據中載入按鈕圖片檔案路徑資料 (包含正常、點擊、滑鼠移過圖片)。 - /// - /// 已解析的 INI 設定數據。 - /// 設定檔中按鈕圖片設定所屬的區塊名稱。 - /// 按鈕數量。 - /// 回傳一個字典,鍵是按鈕名稱,值是包含正常、點擊和滑鼠移過狀態的元組。 - private Dictionary LoadButtonImagesForSongIDSearch(IniData data, string section, int buttonCount) - { - var buttonImages = new Dictionary(); - - // 迴圈讀取每個按鈕的圖片設定 - for (int i = 0; i < 10; i++) - { - // 讀取按鈕的三種圖片狀態:正常、點擊、滑鼠移過 - buttonImages[$"button{i}"] = ( - data[section][$"button{i}_normal"], // 正常狀態圖片路徑 - data[section][$"button{i}_mouseDown"], // 點擊狀態圖片路徑 - data[section][$"button{i}_mouseOver"] // 滑鼠移過狀態圖片路徑 - ); - } - - // 回傳包含所有按鈕圖片路徑資料的字典 - return buttonImages; - } - - - /// - /// 從 INI 設定數據中載入特定按鈕的座標資料。 - /// - /// 已解析的 INI 設定數據。 - /// 設定檔中按鈕座標所屬的區塊名稱。 - /// 指定按鈕的鍵名 (如 "button1")。 - /// 回傳包含按鈕座標的元組 (X, Y, Width, Height)。 - private (int X, int Y, int Width, int Height) LoadSpecialButtonCoordinatesForSongIDSearch(IniData data, string section, string buttonKey) - { - // 取得按鈕座標的字串 (格式: X,Y,Width,Height) - var coords = data[section][buttonKey].Split(','); - - // 解析座標字串並回傳 (X, Y, Width, Height) 元組 - return (int.Parse(coords[0]), int.Parse(coords[1]), int.Parse(coords[2]), int.Parse(coords[3])); - } - - /// - /// 從 INI 設定數據中載入按鈕的圖片資料 (包含正常、點擊、滑鼠移過圖片)。 - /// - /// 已解析的 INI 設定數據。 - /// 設定檔中按鈕圖片設定所屬的區塊名稱。 - /// 回傳包含按鈕三種狀態圖片路徑的元組 (normal, mouseDown, mouseOver)。 - private (string normal, string mouseDown, string mouseOver) LoadButtonImagesForSongIDSearch(IniData data, string section) - { - // 讀取按鈕三種狀態的圖片路徑 - return ( - data[section]["normal"], // 正常狀態圖片路徑 - data[section]["mouseDown"], // 點擊狀態圖片路徑 - data[section]["mouseOver"] // 滑鼠移過狀態圖片路徑 - ); - } - - - /// - /// 初始化並設置語音按鈕的相關資料,包括符號、座標與圖片等。 - /// - private void InitializeNumberSongIDButtons() - { - // 載入配置資料 - var data = LoadBtnConfigData(); - - // 載入語音符號(如拼音、注音符號等) - numberSongIDSymbols = LoadNumberSongIDSymbols(data); - - // 載入按鈕座標資料 - numberSongIDButtonCoords = LoadButtonCoordinatesForSongIDSearch(data, "NumberSongIDButtonCoordinates", 10); - - // 載入按鈕圖片資料 - numberSongIDButtonImages = LoadButtonImagesForSongIDSearch(data, "NumberSongIDButtonImages", 10); - - // 初始化語音按鈕陣列,總共有 10 個按鈕 - numberSongIDButtonsForSongs = new Button[10]; - - // 設置每個語音按鈕 - for (int i = 0; i < 10; i++) - { - // 根據按鈕索引讀取其圖片資料 - var buttonImages = numberSongIDButtonImages[$"button{i}"]; - - // 創建並初始化語音按鈕,設定其背景圖片 - CreateNumberSongIDButton(i, buttonImages.normal, buttonImages.mouseDown, buttonImages.mouseOver); - } - } - - - /// - /// 創建一個語音按鈕,並為其設置圖片、座標、事件等屬性。 - /// - /// 按鈕的索引,用來獲取對應的語音符號、座標和圖片資料。 - /// 正常狀態下的圖片路徑。 - /// 點擊狀態下的圖片路徑。 - /// 滑鼠移過狀態下的圖片路徑。 - private void CreateNumberSongIDButton(int index, string normalImagePath, string mouseDownImagePath, string mouseOverImagePath) - { - try - { - // 創建語音按鈕並設置其屬性 - numberSongIDButtonsForSongs[index] = new Button + if (inputBoxSongIDSearch.Visible) { - Name = $"numberSongIDButton_{numberSongIDSymbols[index]}", // 按鈕名稱設為語音符號名稱 - BackgroundImage = Image.FromFile(Path.Combine(serverPath, normalImagePath)), // 設定背景圖片 - BackgroundImageLayout = ImageLayout.Stretch, // 設定圖片拉伸樣式 - FlatStyle = FlatStyle.Flat, // 設定為平面風格 - FlatAppearance = { BorderSize = 0 } // 設定無邊框 - }; - - // 調整按鈕大小並設置位置 - ResizeAndPositionButton(numberSongIDButtonsForSongs[index], numberSongIDButtonCoords[index].X, numberSongIDButtonCoords[index].Y, - numberSongIDButtonCoords[index].Width, numberSongIDButtonCoords[index].Height); - - // 從檔案中讀取正常、點擊和滑鼠懸停狀態的圖片 - Image normalImage = Image.FromFile(Path.Combine(serverPath, normalImagePath)); - Image mouseDownImage = Image.FromFile(Path.Combine(serverPath, mouseDownImagePath)); - Image mouseOverImage = Image.FromFile(Path.Combine(serverPath, mouseOverImagePath)); - - // 設置滑鼠事件:點擊、進入、離開等,改變按鈕的背景圖片 - numberSongIDButtonsForSongs[index].MouseDown += (s, e) => numberSongIDButtonsForSongs[index].BackgroundImage = mouseDownImage; - numberSongIDButtonsForSongs[index].MouseUp += (s, e) => numberSongIDButtonsForSongs[index].BackgroundImage = normalImage; - numberSongIDButtonsForSongs[index].MouseEnter += (s, e) => numberSongIDButtonsForSongs[index].BackgroundImage = mouseOverImage; - numberSongIDButtonsForSongs[index].MouseLeave += (s, e) => numberSongIDButtonsForSongs[index].BackgroundImage = normalImage; - - // 設置點擊事件處理方法 - numberSongIDButtonsForSongs[index].Click += NumberSongIDButton_Click; - - // 設置按鈕的 Tag 屬性為對應的語音符號 - numberSongIDButtonsForSongs[index].Tag = numberSongIDSymbols[index]; - - // 將按鈕添加到表單的控制項集合中 - this.Controls.Add(numberSongIDButtonsForSongs[index]); - } - catch (Exception ex) - { - // 捕捉錯誤並輸出錯誤訊息 - Console.WriteLine($"Error creating button at index {index}: {ex.Message}"); - } - } - - - /// - /// 初始化所有與注音歌手相關的按鈕,包括語音符號按鈕、特殊按鈕及輸入框。 - /// - private void InitializeButtonsForSongIDSearch() - { - // 從配置檔案加載注音符號並初始化按鈕 - LoadNumberSongIDSymbolsFromConfig(); - - // 初始化所有語音按鈕 - InitializeNumberSongIDButtons(); - - // 初始化注音歌手的特殊按鈕(例如音量、搜尋等) - InitializeSpecialButtonsForSongIDSearch(); - - // 初始化注音歌手的輸入框 - InitializeInputBoxSongIDSearch(); - } - - - /// - /// 移除圖像周圍的白色邊框,將邊框的像素透明化。 - /// - /// 待處理的圖像文件路徑。 - /// 處理後的圖像,其中白色邊框已被去除並替換為透明。 - private Image RemoveWhiteBorderForSongIDSearch(string imagePath) - { - // 創建一個 Bitmap 物件來加載圖像 - Bitmap bmp = new Bitmap(imagePath); - - // 定義圖像的矩形區域,這是我們將要操作的區域 - Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); - - // 鎖定圖像的位圖數據,以便進行直接修改 - BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat); - - IntPtr ptr = bmpData.Scan0; // 獲取位圖數據的起始位置 - int bytes = Math.Abs(bmpData.Stride) * bmp.Height; // 計算圖像的總字節數 - byte[] rgbValues = new byte[bytes]; // 用來存儲圖像的像素數據 - System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes); // 從圖像數據中複製像素數據到 rgbValues 陣列 - - // 遍歷每個像素點,檢查是否為白色邊框 - for (int y = 0; y < bmp.Height; y++) - { - for (int x = 0; x < bmp.Width; x++) - { - int position = (y * bmpData.Stride) + (x * 4); // 計算當前像素的位址 - byte b = rgbValues[position]; // 藍色分量 - byte g = rgbValues[position + 1]; // 綠色分量 - byte r = rgbValues[position + 2]; // 紅色分量 - byte a = rgbValues[position + 3]; // alpha 分量(透明度) - - // 如果當前像素在圖像邊緣且為白色 (255, 255, 255),則將其設為透明 - if ((x < 5 || x > bmp.Width - 5 || y < 5 || y > bmp.Height - 5) && r == 255 && g == 255 && b == 255) - { - // 將白色像素的 RGB 設置為 255, 255, 255 且 alpha 設為 0 (透明) - rgbValues[position] = 255; - rgbValues[position + 1] = 255; - rgbValues[position + 2] = 255; - rgbValues[position + 3] = 0; // 透明 - } + inputBoxSongIDSearch.Text += button.Tag.ToString(); } } - - // 將修改後的像素數據重新複製回位圖數據 - System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes); - - // 解鎖圖像數據 - bmp.UnlockBits(bmpData); - - // 返回處理後的圖像 - return bmp; } - - - /// - /// 初始化與注音歌手相關的特殊按鈕,包括修改、清除和關閉按鈕。 - /// - private void InitializeSpecialButtonsForSongIDSearch() - { - // 初始化修改按鈕 - InitializeModifyButtonSongIDSearch(); - - // 初始化清除按鈕 - InitializeClearButtonSongIDSearch(); - // 初始化確認按鈕 - InitializeEnterButtonSongIDSearch(); - // 初始化關閉按鈕 - InitializeCloseButtonSongIDSearch(); - } - - - /// - /// 初始化「修改」按鈕,設定按鈕的坐標、圖片和點擊事件。 - /// - private void InitializeModifyButtonSongIDSearch() - { - // 加載配置數據 - var data = LoadBtnConfigData(); - - // 讀取按鈕坐標 - modifyButtonSongIDCoords = LoadSpecialButtonCoordinatesForSongIDSearch(data, "SpecialButtonCoordinates", "modifyButtonSongIDSearch"); - - // 加載按鈕圖片(正常、鼠標懸停、鼠標按下) - var buttonImages = LoadButtonImagesForSongIDSearch(data, "ModifyButtonImagesSongID"); - - // 創建「修改」按鈕,並設置坐標、圖片及點擊事件 - modifyButtonSongIDSearch = CreateSpecialButtonForSongIDSearch( - "btnModifySongIDSearch", // 按鈕名稱 - modifyButtonSongIDCoords, // 按鈕坐標 - buttonImages.normal, // 正常狀態圖片 - buttonImages.mouseOver, // 鼠標懸停圖片 - buttonImages.mouseDown, // 鼠標按下圖片 - ModifyButtonSongIDSearch_Click // 按鈕點擊事件 - ); - } - - /// - /// 處理「修改」按鈕的點擊事件,該事件會刪除輸入框中的最後一個字符。 - /// - /// 觸發事件的對象 - /// 事件參數 private void ModifyButtonSongIDSearch_Click(object sender, EventArgs e) { // 如果輸入框不為空,且包含輸入內容,則刪除最後一個字符 - if (this.Controls.Contains(inputBoxSongIDSearch) && inputBoxSongIDSearch.Text.Length > 0) + if (pictureBoxSongIDSearch.Controls.Contains(inputBoxSongIDSearch) && inputBoxSongIDSearch.Text.Length > 0) { inputBoxSongIDSearch.Text = inputBoxSongIDSearch.Text.Substring(0, inputBoxSongIDSearch.Text.Length - 1); } } - - - /// - /// 初始化「清除」按鈕,設定按鈕的坐標、圖片和點擊事件。 - /// - private void InitializeClearButtonSongIDSearch() - { - // 加載配置數據 - var data = LoadBtnConfigData(); - - // 讀取按鈕坐標 - clearButtonSongIDCoords = LoadSpecialButtonCoordinatesForSongIDSearch(data, "SpecialButtonCoordinates", "clearButtonSongIDSearch"); - - // 加載按鈕圖片(正常、鼠標懸停、鼠標按下) - var buttonImages = LoadButtonImagesForSongIDSearch(data, "ClearButtonImagesSongID"); - - // 創建「清除」按鈕,並設置坐標、圖片及點擊事件 - clearButtonSongIDSearch = CreateSpecialButtonForSongIDSearch( - "btnClearSongIDSearch", // 按鈕名稱 - clearButtonSongIDCoords, // 按鈕坐標 - buttonImages.normal, // 正常狀態圖片 - buttonImages.mouseOver, // 鼠標懸停圖片 - buttonImages.mouseDown, // 鼠標按下圖片 - ClearButtonSongIDSearch_Click // 按鈕點擊事件 - ); - } - - private void InitializeEnterButtonSongIDSearch() - { - // 加載配置數據 - var data = LoadBtnConfigData(); - - // 讀取按鈕坐標 - enterButtonSongIDCoords = LoadSpecialButtonCoordinatesForSongIDSearch(data, "SpecialButtonCoordinates", "enterButtonSongIDSearch"); - - // 加載按鈕圖片(正常、鼠標懸停、鼠標按下) - var buttonImages = LoadButtonImagesForSongIDSearch(data, "EnterButtonImagesSongID"); - - // 創建「清除」按鈕,並設置坐標、圖片及點擊事件 - enterButtonSongIDSearch = CreateSpecialButtonForSongIDSearch( - "btnEnterSongIDSearch", // 按鈕名稱 - enterButtonSongIDCoords, // 按鈕坐標 - buttonImages.normal, // 正常狀態圖片 - buttonImages.mouseOver, // 鼠標懸停圖片 - buttonImages.mouseDown, // 鼠標按下圖片 - SongIDSearch_Click // 按鈕點擊事件 - ); - } - - /// - /// 處理「清除」按鈕的點擊事件,該事件會清空輸入框中的所有文本。 - /// - /// 觸發事件的對象 - /// 事件參數 private void ClearButtonSongIDSearch_Click(object sender, EventArgs e) { // 如果輸入框不為空,則清空該框的文本內容 - if (this.Controls.Contains(inputBoxSongIDSearch) && inputBoxSongIDSearch.Text.Length > 0) + if (pictureBoxSongIDSearch.Controls.Contains(inputBoxSongIDSearch) && inputBoxSongIDSearch.Text.Length > 0) { inputBoxSongIDSearch.Text = ""; } } - - - /// - /// 初始化「關閉」按鈕,設定按鈕的坐標、圖片和點擊事件。 - /// - private void InitializeCloseButtonSongIDSearch() - { - // 加載配置數據 - var data = LoadBtnConfigData(); - - // 讀取按鈕坐標 - closeButtonSongIDCoords = LoadSpecialButtonCoordinatesForSongIDSearch(data, "SpecialButtonCoordinates", "closeButtonSongIDSearch"); - - // 加載按鈕圖片(正常、鼠標懸停、鼠標按下) - var buttonImages = LoadButtonImagesForSongIDSearch(data, "CloseButtonImagesSongID"); - // 創建「關閉」按鈕,並設置坐標、圖片及點擊事件 - closeButtonSongIDSearch = CreateSpecialButtonForSongIDSearch( - "btnCloseSongIDSearch", // 按鈕名稱 - closeButtonSongIDCoords, // 按鈕坐標 - buttonImages.normal, // 正常狀態圖片 - buttonImages.mouseOver, // 鼠標懸停圖片 - buttonImages.mouseDown, // 鼠標按下圖片 - CloseButtonClick // 按鈕點擊事件 - ); - } - - - /// - /// 「關閉」按鈕的點擊事件處理方法。 - /// 隱藏 SongID 歌手圖片框以及與其相關的按鈕。 - /// - /// 觸發事件的對象,這裡是關閉按鈕。 - /// 事件參數。 - private void SongIDSearch_Click(object sender, EventArgs e) - { - FindNumberSongs(); // 搜尋歌曲 - inputBoxSongIDSearch.Text = ""; - } private void CloseButtonClick(object sender, EventArgs e) { pictureBoxSongIDSearch.Visible = false; @@ -545,16 +251,22 @@ namespace DualScreenDemo closeButtonSongIDSearch.Visible = false; enterButtonSongIDSearch.Visible = false; inputBoxSongIDSearch.Visible = false; - for(int i=0; i <= 9; i++) + for (int i = 0; i <= 9; i++) { numberSongIDButtonsForSongs[i].Visible = false; } - // 隱藏 SongID 歌手圖片框 - numberSearchSongButton.BackgroundImage = numberSearchSongNormalBackground; + // 隱藏 SongID 歌手圖片框 + numberSearchSongButton.BackgroundImage = numberSearchSongNormalBackground; // 隱藏與 SongID 歌手相關的所有按鈕 - + } - private void FindNumberSongs(){ + private void SongIDSearch_Click(object sender, EventArgs e) + { + FindNumberSongs(); // 搜尋歌曲 + inputBoxSongIDSearch.Text = ""; + } + private void FindNumberSongs() + { var data = LoadBtnConfigData(); string searchText = inputBoxSongIDSearch.Text; @@ -577,7 +289,8 @@ namespace DualScreenDemo //multiPagePanel.LoadSongs(searchResults); //判斷跳轉點播介面 - if (searchResults.Count!=0 && searchResults[0] is SongData) { + if (searchResults.Count != 0 && searchResults[0] is SongData) + { currentSelectedSong = searchResults[0] as SongData; this.DoubleBuffered = true; this.SuspendLayout(); @@ -590,322 +303,5 @@ namespace DualScreenDemo } - /// - /// 創建一個特殊的按鈕,並設定其顯示屬性、事件處理和位置。 - /// - /// 按鈕的名稱。 - /// 按鈕的坐標和大小,包含 X, Y, 寬度和高度。 - /// 按鈕正常狀態下的背景圖片路徑。 - /// 鼠標懸停時按鈕的背景圖片路徑。 - /// 鼠標點擊時按鈕的背景圖片路徑。 - /// 按鈕的點擊事件處理程序。 - /// 創建並返回的按鈕對象。 - private Button CreateSpecialButtonForSongIDSearch(string name, (int X, int Y, int Width, int Height) coords, string normalImagePath, string mouseOverImagePath, string mouseDownImagePath, EventHandler clickEventHandler) - { - // 創建按鈕並設定基本屬性 - var button = new Button - { - Name = name, - FlatStyle = FlatStyle.Flat, - FlatAppearance = { BorderSize = 0, MouseDownBackColor = Color.Transparent, MouseOverBackColor = Color.Transparent }, - BackgroundImageLayout = ImageLayout.Stretch, - BackgroundImage = Image.FromFile(Path.Combine(serverPath, normalImagePath)) - }; - // 設定按鈕的大小和位置 - ResizeAndPositionButton(button, coords.X, coords.Y, coords.Width, coords.Height); - - // 設定鼠標事件:進入、離開、按下、放開 - button.MouseEnter += (sender, e) => button.BackgroundImage = Image.FromFile(Path.Combine(serverPath, mouseOverImagePath)); - button.MouseLeave += (sender, e) => button.BackgroundImage = Image.FromFile(Path.Combine(serverPath, normalImagePath)); - button.MouseDown += (sender, e) => button.BackgroundImage = Image.FromFile(Path.Combine(serverPath, mouseDownImagePath)); - button.MouseUp += (sender, e) => button.BackgroundImage = Image.FromFile(Path.Combine(serverPath, normalImagePath)); - - // 註冊點擊事件處理 - button.Click += clickEventHandler; - - // 將按鈕添加到控件集合中 - this.Controls.Add(button); - - return button; - } - - - /// - /// 初始化 SongID 歌手的輸入框,並設定其屬性與事件處理程序。 - /// - private void InitializeInputBoxSongIDSearch() - { - try - { - // 加載輸入框配置 - LoadInputBoxConfigForSongIDSearch(); - - // 創建一個 RichTextBox 控件來作為輸入框 - inputBoxSongIDSearch = new RichTextBox - { - Name = "inputBoxSongIDSearch", - ForeColor = inputBoxSongIDForeColor, // 設定文字顏色 - Font = new Font(inputBoxSongIDFontName, inputBoxSongIDFontSize, inputBoxSongIDFontStyle), // 設定字體樣式 - ScrollBars = RichTextBoxScrollBars.None // 不顯示滾動條 - }; - - // 調整和定位輸入框的位置及大小 - ResizeAndPositionControl(inputBoxSongIDSearch, inputBoxSongIDCoords.X, inputBoxSongIDCoords.Y, inputBoxSongIDCoords.Width, inputBoxSongIDCoords.Height); - - // 將輸入框加入到窗體的控件集合中 - this.Controls.Add(inputBoxSongIDSearch); - } - catch (Exception ex) - { - // 如果初始化過程中出現錯誤,則在控制台輸出錯誤信息 - Console.WriteLine("Error initializing inputBoxSongIDSearch: " + ex.Message); - } - } - - - /// - /// 從配置文件 `config.ini` 中加載輸入框的設置,包括位置、大小、字體等屬性。 - /// - private void LoadInputBoxConfigForSongIDSearch() - { - try - { - // 創建 INI 解析器 - var parser = new FileIniDataParser(); - string iniFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "img.ini"); - - - IniData data; - // 打開並讀取配置文件 - using (var reader = new StreamReader(iniFilePath, Encoding.UTF8)) - { - data = parser.ReadData(reader); - } - - // 從配置中加載輸入框的坐標和大小 - inputBoxSongIDCoords = ( - int.Parse(data["InputBoxSongIDSearch"]["X"]), // 輸入框的 X 坐標 - int.Parse(data["InputBoxSongIDSearch"]["Y"]), // 輸入框的 Y 坐標 - int.Parse(data["InputBoxSongIDSearch"]["Width"]), // 輸入框的寬度 - int.Parse(data["InputBoxSongIDSearch"]["Height"]) // 輸入框的高度 - ); - - // 從配置中加載字體屬性 - inputBoxSongIDFontName = data["InputBoxSongIDSearch"]["FontName"]; // 字體名稱 - inputBoxSongIDFontSize = float.Parse(data["InputBoxSongIDSearch"]["FontSize"]); // 字體大小 - inputBoxSongIDFontStyle = (FontStyle)Enum.Parse(typeof(FontStyle), data["InputBoxSongIDSearch"]["FontStyle"]); // 字體樣式 - inputBoxSongIDForeColor = Color.FromName(data["InputBoxSongIDSearch"]["ForeColor"]); // 字體顏色 - - } - catch (Exception ex) - { - // 若發生錯誤,顯示錯誤信息 - Console.WriteLine("Error loading inputBox configuration: " + ex.Message); - } - } - - - /// - /// 存儲 `pictureBoxSongIDSearch` 控制項的坐標和大小設置。 - /// - /// - /// 這個元組包含了 `X`、`Y` 坐標以及 `Width`、`Height` 大小,用於配置 `pictureBoxSongIDSearch` 的位置和大小。 - /// - private (int X, int Y, int Width, int Height) pictureBoxSongIDSongCoords; - - /// - /// 從配置檔案中讀取 `PictureBoxSongIDSearch` 控制項的坐標和大小設置。 - /// - private void LoadPictureBoxSongIDSongCoordsFromConfig() - { - var parser = new FileIniDataParser(); - string iniPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "img.ini"); - IniData data = parser.ReadFile(iniPath); - - - var coords = data["PictureBoxSongIDSearch"]; - pictureBoxSongIDSongCoords = ( - int.Parse(coords["X"]), - int.Parse(coords["Y"]), - int.Parse(coords["Width"]), - int.Parse(coords["Height"]) - ); - } - - - /// - /// 顯示圖片並根據配置文件設置顯示區域的大小和位置。 - /// - /// 圖片的路徑。 - private void ShowImageOnPictureBoxSongIDSearch(string imagePath) - { - // 讀取配置文件中的顯示區域設置 - LoadPictureBoxSongIDSongCoordsFromConfig(); - - // 加載原始圖片 - Bitmap originalImage = new Bitmap(imagePath); - - // 創建顯示區域,根據配置文件中的坐標和大小設置 - Rectangle displayArea = new Rectangle(pictureBoxSongIDSongCoords.X, pictureBoxSongIDSongCoords.Y, pictureBoxSongIDSongCoords.Width, pictureBoxSongIDSongCoords.Height); - - // 設置圖片到 PictureBox - pictureBoxSongIDSearch.Image = originalImage; - - // 調整 PictureBox 大小和位置 - ResizeAndPositionPictureBox(pictureBoxSongIDSearch, displayArea.X, displayArea.Y, displayArea.Width, displayArea.Height); - - // 顯示圖片 - pictureBoxSongIDSearch.Visible = true; - } - - - /// - /// 設置注音歌手相關控制項(包括圖片框、按鈕和輸入框)的顯示或隱藏狀態。 - /// - /// 指定控件是否可見。True 為顯示,False 為隱藏。 - private void SetSongIDSearchAndButtonsVisibility(bool isVisible) - { - // 定義一個動作來處理控制項的顯示或隱藏 - System.Action action = () => - { - try - { - // 暫停控制項佈局的重新排版,提高效率 - SuspendLayout(); - - // 檢查並設置圖片框的可見性 - if (pictureBoxSongIDSearch == null) - { - Console.WriteLine("pictureBoxSongIDSearch is null"); - } - else - { - pictureBoxSongIDSearch.Visible = isVisible; - if (isVisible) pictureBoxSongIDSearch.BringToFront(); // 如果顯示,將其置於最前 - } - - // 檢查並設置拼音按鈕的可見性 - if (numberSongIDButtonsForSongs == null) - { - Console.WriteLine("numberSongIDButtonsForSongs is null"); - } - else - { - foreach (var button in numberSongIDButtonsForSongs) - { - if (button == null) - { - Console.WriteLine("One of the numberSongIDButtonsForSongs is null"); - } - else - { - button.Visible = isVisible; - if (isVisible) button.BringToFront(); // 如果顯示,將其置於最前 - } - } - } - - // 檢查並設置修改按鈕的可見性 - if (modifyButtonSongIDSearch == null) - { - Console.WriteLine("modifyButtonSongIDSearch is null"); - } - else - { - modifyButtonSongIDSearch.Visible = isVisible; - if (isVisible) modifyButtonSongIDSearch.BringToFront(); // 如果顯示,將其置於最前 - } - - // 檢查並設置清除按鈕的可見性 - if (clearButtonSongIDSearch == null) - { - Console.WriteLine("clearButtonSongIDSearch is null"); - } - else - { - clearButtonSongIDSearch.Visible = isVisible; - if (isVisible) clearButtonSongIDSearch.BringToFront(); // 如果顯示,將其置於最前 - } - - // 檢查並設置關閉按鈕的可見性 - if (closeButtonSongIDSearch == null) - { - Console.WriteLine("closeButtonSongIDSearch is null"); - } - else - { - closeButtonSongIDSearch.Visible = isVisible; - if (isVisible) closeButtonSongIDSearch.BringToFront(); // 如果顯示,將其置於最前 - } - - // 檢查並設置關閉按鈕的可見性 - if (enterButtonSongIDSearch == null) - { - Console.WriteLine("enterButtonSongIDSearch is null"); - } - else - { - enterButtonSongIDSearch.Visible = isVisible; - if (isVisible) enterButtonSongIDSearch.BringToFront(); // 如果顯示,將其置於最前 - } - - // 檢查並設置輸入框的可見性 - if (inputBoxSongIDSearch == null) - { - Console.WriteLine("inputBoxSongIDSearch is null"); - } - else - { - inputBoxSongIDSearch.Visible = isVisible; - if (isVisible) inputBoxSongIDSearch.BringToFront(); // 如果顯示,將其置於最前 - } - - // 恢復控制項的佈局重新排版 - ResumeLayout(); - PerformLayout(); - - // 刷新所有控制項的顯示 - pictureBoxSongIDSearch?.Refresh(); - if (numberSongIDButtonsForSongs != null) - { - foreach (var button in numberSongIDButtonsForSongs) - { - button?.Refresh(); // 刷新每個按鈕 - } - } - modifyButtonSongIDSearch?.Refresh(); - clearButtonSongIDSearch?.Refresh(); - closeButtonSongIDSearch?.Refresh(); - inputBoxSongIDSearch?.Refresh(); - } - catch (Exception ex) - { - Console.WriteLine("Error in SetSongIDSearchAndButtonsVisibility: " + ex.Message); - } - }; - - // 檢查是否需要在主執行緒外執行 - if (this.InvokeRequired) - { - this.Invoke(action); // 如果需要,透過主執行緒執行 - } - else - { - action(); // 否則直接執行 - } - } - private void NumberSongIDButton_Click(object sender, EventArgs e) - { - var button = sender as Button; - if (button != null && button.Tag != null) - { - - if (inputBoxSongIDSearch.Visible) - { - inputBoxSongIDSearch.Text += button.Tag.ToString(); - } - } - } - } } \ No newline at end of file diff --git a/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.PinyinSearch.cs b/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.PinyinSearch.cs index f58d4f1..d95ccb7 100644 --- a/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.PinyinSearch.cs +++ b/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.PinyinSearch.cs @@ -1,6 +1,4 @@ using System.IO; -using IniParser; -using IniParser.Model; namespace DualScreenDemo { @@ -10,15 +8,193 @@ namespace DualScreenDemo private PictureBox pictureBoxPinYinSongs; // 存放拼音按鈕的陣列 private Button[] letterButtonsForPinYinSongs; + private string[] AlphabetSymbols=["Q","W","E","R","T","Y","U","I","O","P", + "A","S","D","F","G","H","J","K","L", + "Z","X","C","V","B","N","M"]; // 特殊功能按鈕(修改、清除、關閉) private Button modifyButtonPinYinSongs; private Button clearButtonPinYinSongs; private Button closeButtonPinYinSongs; // 用於顯示輸入文字的輸入框 private RichTextBox inputBoxPinYinSongs; - /// - /// 拼音歌曲搜尋按鈕點擊事件 - /// + + + // 初始化拼音輸入相關的 UI 控件 + private void InitializeButtonsForPinYinSongs() + { + InitializeInputBoxPinYinSongs(); + InitializePinYinSongsButton(); + InitializeAlphbtBtns(pictureBoxPinYinSongs,LetterButtonPinYinSongs_Click); + } + + // 初始化拼音輸入框 (RichTextBox) + private void InitializeInputBoxPinYinSongs() + { + try + { + //字型設定 + string fontName = "Times New Roman"; + float fontSize = 26; + FontStyle fontStyle = FontStyle.Regular; + Color foreColor = Color.Black; + + // 創建拼音輸入框 (RichTextBox) + inputBoxPinYinSongs = new RichTextBox + { + Visible = false, // 預設為隱藏 + Name = "inputBoxPinYinSongs", // 設定控制項名稱 + ForeColor = foreColor, // 設定文字顏色 + Font = new Font( + fontName, + fontSize / 900 * Screen.PrimaryScreen.Bounds.Height, // 根據螢幕大小調整字體 + fontStyle + ) + }; + + // 設定輸入框的位置與大小 + ResizeAndPositionControl(inputBoxPinYinSongs, 20,25, 448, 57); + + pictureBoxPinYinSongs.Controls.Add(inputBoxPinYinSongs); + } + catch (Exception ex) + { + Console.WriteLine($"An error occurred: {ex.Message}"); + } + } + private void InitializePinYinSongsButton() + { + var data = LoadBtnConfigData(); + + modifyButtonPinYinSongs = new Button { Name = "modifyButtonPinYinSongs" }; + ConfigureButton(modifyButtonPinYinSongs, 650, 264, 72, 67, + new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesPinYin"]["normal"])), + new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesPinYin"]["mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesPinYin"]["mouseDown"])), + ModifyButtonPinYinSongs_Click); + + pictureBoxPinYinSongs.Controls.Add(modifyButtonPinYinSongs); + + + clearButtonPinYinSongs = new Button { Name = "clearButtonPinYinSongs" }; + ConfigureButton(clearButtonPinYinSongs, 8, 264, 72, 67, + new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesPinYin"]["normal"])), + new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesPinYin"]["mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesPinYin"]["mouseDown"])), + ClearButtonPinYinSongs_Click); + + pictureBoxPinYinSongs.Controls.Add(clearButtonPinYinSongs); + + + closeButtonPinYinSongs = new Button { Name = "closeButtonPinYinSongs" }; + ConfigureButton(closeButtonPinYinSongs, 730, 264, 72, 67, + new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesPinYin"]["normal"])), + new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesPinYin"]["mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesPinYin"]["mouseDown"])), + CloseButtonPinYinSongs_Click); + + pictureBoxPinYinSongs.Controls.Add(closeButtonPinYinSongs); + } + + private void InitializeAlphbtBtns(Control control, EventHandler handler) + { + // 初始化字母按鈕陣列,總共有 26 個按鈕 + letterButtonsForPinYinSongs = new Button[26]; + + // 設置上排按鈕 + int x = 8; + for (int i = 0; i < 10; i++) + { + CreateAlphbtBtns(i, x, 100, control, handler); + x += 80; + } + + x = 40; + for (int i = 10; i < 19; i++) + { + CreateAlphbtBtns(i, x, 182, control, handler); + x += 80; + } + // 設置下排按鈕 + x = 88; + for (int i = 19; i < 26; i++) + { + CreateAlphbtBtns(i, x, 264, control, handler); + x += 80; + } + } + private void CreateAlphbtBtns(int index, int x, int y,Control control,EventHandler handler) + { + try + { + // 加載配置數據 + var data = LoadBtnConfigData(); + // 創建語音按鈕並設置其屬性 + letterButtonsForPinYinSongs[index] = new Button + { + Name = $"PinYinLetterButtons_{AlphabetSymbols[index]}", // 按鈕名稱設為語音符號名稱 + }; + + ConfigureButton(letterButtonsForPinYinSongs[index], x, y, 72, 67, + new Bitmap(Path.Combine(serverPath, data["PinYinLetterButtonImages"][$"button{index}_normal"])), + new Bitmap(Path.Combine(serverPath, data["PinYinLetterButtonImages"][$"button{index}_mouseOver"])), + new Bitmap(Path.Combine(serverPath, data["PinYinLetterButtonImages"][$"button{index}_mouseDown"])), + handler); + + // 設置按鈕的 Tag 屬性為對應的語音符號 + letterButtonsForPinYinSongs[index].Tag = AlphabetSymbols[index]; + + // 將按鈕添加到表單的控制項集合中 + control.Controls.Add(letterButtonsForPinYinSongs[index]); + } + catch (Exception ex) + { + Console.WriteLine($"Error creating button at index {index}: {ex.Message}"); + } + } + + // 顯示拼音歌曲圖片 + // 圖片路徑 + private void ShowImageOnPictureBoxPinYinSongs(string imagePath) + { + // 使用指定的圖片路徑建立 Bitmap 影像 + Bitmap originalImage = new Bitmap(imagePath); + + // 將載入的圖片設定為 pictureBoxPinYinSongs 的影像 + pictureBoxPinYinSongs.Image = originalImage; + + // 調整 PictureBox 的大小與位置 + ResizeAndPositionPictureBox(pictureBoxPinYinSongs, 390, 360, 808, 356); + // 顯示 PictureBox + pictureBoxPinYinSongs.Visible = true; + + } + + // 設定拼音模式的 UI 是否可見 + // 是否可見 + private void SetPinYinSongsAndButtonsVisibility(bool isVisible) + { + // 定義一個委派 (Action),用於更新 UI 控件的可見性 + System.Action action = () => + { + SuspendLayout(); + if (isVisible) SetUIVisible(pictureBoxPinYinSongs); + else CloseUI(pictureBoxPinYinSongs); + }; + + // 如果當前執行緒不是 UI 執行緒,則使用 Invoke 確保執行於 UI 執行緒 + if (this.InvokeRequired) + { + this.Invoke(action); + } + else + { + action(); + } + + } + + #region 按鈕點擊事件 + // 拼音歌曲搜尋按鈕點擊事件 private void PinyinSearchSongsButton_Click(object sender, EventArgs e) { // 更新搜尋模式按鈕的背景圖 @@ -46,52 +222,9 @@ namespace DualScreenDemo ResetinputBox(); pictureBoxPinYinSongs.Visible = true; - } - /// - /// 初始化拼音按鈕 - /// - private void InitializeLetterButtonsForPinYinSongs() - { - // 從設定檔 (config.ini) 讀取配置數據 - var data = LoadBtnConfigData(); + } - // 從配置數據中載入拼音字母按鈕的影像 (包含正常、點擊、滑鼠懸停三種狀態) - var buttonImages = LoadButtonImages(data, "PinYinLetterButtonImages", 26); - - // 定義 QWERTY 鍵盤排列的字母順序 - string qwertyLayout = "QWERTYUIOPASDFGHJKLZXCVBNM"; - - // 初始化拼音按鈕陣列,長度為 26(對應英文字母) - letterButtonsForPinYinSongs = new Button[26]; - - // 迴圈遍歷 26 個字母,依序建立按鈕 - for (int i = 0; i < 26; i++) - { - // 從配置檔案讀取當前按鈕的座標資訊 (X, Y, Width, Height) - var coords = data["PinYinLetterButtonCoordinates"][$"button{i}"].Split(','); - - // 建立拼音按鈕,並設定名稱、座標、影像與事件處理函式 - letterButtonsForPinYinSongs[i] = CreateButton( - $"letterButton_{qwertyLayout[i]}", // 按鈕名稱,例如 "letterButton_Q" - (int.Parse(coords[0]), int.Parse(coords[1]), int.Parse(coords[2]), int.Parse(coords[3])), // 解析座標數據 - buttonImages[$"button{i}"].normal, // 正常狀態影像 - buttonImages[$"button{i}"].mouseDown, // 按下狀態影像 - buttonImages[$"button{i}"].mouseOver, // 滑鼠懸停狀態影像 - LetterButtonPinYinSongs_Click // 點擊事件處理函式 - ); - - // 設定按鈕的標籤 (Tag) 為對應的字母,例如 Q、W、E... - letterButtonsForPinYinSongs[i].Tag = qwertyLayout[i]; - - // 將按鈕新增到表單的控制項集合中,讓其顯示在介面上 - this.Controls.Add(letterButtonsForPinYinSongs[i]); - } - } - /// - /// 處理拼音按鈕點擊事件 - /// - /// 觸發事件按鈕 - /// 事件參數 + // 處理拼音按鈕點擊事件 private void LetterButtonPinYinSongs_Click(object sender, EventArgs e) { // 嘗試將觸發事件的物件轉換為 Button 類型 @@ -108,149 +241,26 @@ namespace DualScreenDemo } } } - - /// - /// 初始化拼音輸入相關的 UI 控件,包括字母按鈕、特殊功能按鈕(修改、清除、關閉),以及拼音輸入框。 - /// - private void InitializeButtonsForPinYinSongs() - { - // 初始化拼音字母按鈕,根據 QWERTY 鍵盤佈局建立對應的按鈕 - InitializeLetterButtonsForPinYinSongs(); - - // 初始化特殊功能按鈕(修改、清除、關閉) - InitializeSpecialButtonsForPinYinSongs(); - - // 初始化拼音輸入框,使用者可透過輸入拼音來搜尋歌曲 - InitializeInputBoxPinYinSongs(); - } - - /// - /// 初始化拼音輸入的特殊功能按鈕,包括: - /// 1. 修改按鈕 - 刪除輸入框中的最後一個字母 - /// 2. 清除按鈕 - 清空輸入框的內容 - /// 3. 關閉按鈕 - 隱藏拼音輸入的 UI 元件 - /// - private void InitializeSpecialButtonsForPinYinSongs() - { - // 初始化「修改」按鈕(刪除輸入框最後一個字母) - InitializeModifyButtonPinYinSongs(); - - // 初始化「清除」按鈕(清空輸入框內容) - InitializeClearButtonPinYinSongs(); - - // 初始化「關閉」按鈕(關閉拼音輸入 UI) - InitializeCloseButtonPinYinSongs(); - } - - - /// - /// 初始化「修改」按鈕,提供刪除拼音輸入框最後一個字母的功能。 - /// - private void InitializeModifyButtonPinYinSongs() - { - // 讀取設定檔,載入特殊按鈕的配置資料 - var data = LoadBtnConfigData(); - - // 從設定檔取得「修改按鈕」的座標與大小 - modifyButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "modifyButtonPinYinSongs"); - - // 讀取「修改按鈕」的圖片資源(一般狀態、滑鼠懸停、按下) - var buttonImages = LoadButtonImages(data, "ModifyButtonImagesPinYin"); - - // 創建「修改」按鈕,並綁定點擊事件 - modifyButtonPinYinSongs = CreateSpecialButton( - "btnModifyPinYinSongs", // 按鈕名稱 - modifyButtonPinYinCoords, // 設定按鈕的座標與大小 - buttonImages.normal, // 設定按鈕的正常狀態圖片 - buttonImages.mouseOver, // 設定按鈕的滑鼠懸停圖片 - buttonImages.mouseDown, // 設定按鈕的按下狀態圖片 - ModifyButtonPinYinSongs_Click // 綁定按鈕的點擊事件處理函式 - ); - } - - /// - /// 「修改」按鈕點擊事件:刪除拼音輸入框 (inputBoxPinYinSongs) 中的最後一個字母。 - /// + // 「修改」按鈕點擊事件:刪除拼音輸入框中的最後一個字母。 private void ModifyButtonPinYinSongs_Click(object sender, EventArgs e) { // 確保 inputBoxPinYinSongs 存在於視窗控制項集合內,且輸入框內有文字 - if (this.Controls.Contains(inputBoxPinYinSongs) && inputBoxPinYinSongs.Text.Length > 0) + if (pictureBoxPinYinSongs.Controls.Contains(inputBoxPinYinSongs) && inputBoxPinYinSongs.Text.Length > 0) { // 刪除輸入框內的最後一個字母 inputBoxPinYinSongs.Text = inputBoxPinYinSongs.Text.Substring(0, inputBoxPinYinSongs.Text.Length - 1); } } - - - /// - /// 初始化「清除」按鈕 (clearButtonPinYinSongs),用於清空拼音輸入框 (inputBoxPinYinSongs)。 - /// - private void InitializeClearButtonPinYinSongs() - { - // 從設定檔載入資料 - var data = LoadBtnConfigData(); - - // 讀取「清除」按鈕的座標配置 (X, Y, Width, Height) - clearButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "clearButtonPinYinSongs"); - - // 載入「清除」按鈕的圖片 (一般狀態、滑鼠懸停、按下時的圖片) - var buttonImages = LoadButtonImages(data, "ClearButtonImagesPinYin"); - - // 建立「清除」按鈕,設定對應的座標與圖片,並綁定點擊事件 - clearButtonPinYinSongs = CreateSpecialButton( - "btnClearPinYinSongs", // 按鈕名稱 - clearButtonPinYinCoords, // 設定按鈕的座標與大小 - buttonImages.normal, // 設定按鈕的正常狀態圖片 - buttonImages.mouseOver, // 設定按鈕的滑鼠懸停圖片 - buttonImages.mouseDown, // 設定按鈕的按下狀態圖片 - ClearButtonPinYinSongs_Click // 綁定按鈕的點擊事件處理函式 - ); - } - - /// - /// 清空拼音輸入框的內容。 - /// 當使用者點擊清除按鈕時,若輸入框存在且有內容,則將其清空。 - /// + // 當使用者點擊清除按鈕時,若輸入框存在且有內容,則將其清空。 private void ClearButtonPinYinSongs_Click(object sender, EventArgs e) - { + { // 檢查視窗內是否包含 inputBoxPinYinSongs 控制項,且輸入框內是否有文字 - if (this.Controls.Contains(inputBoxPinYinSongs) && inputBoxPinYinSongs.Text.Length > 0) + if (pictureBoxPinYinSongs.Controls.Contains(inputBoxPinYinSongs) && inputBoxPinYinSongs.Text.Length > 0) { // 清空拼音輸入框的內容 inputBoxPinYinSongs.Text = ""; } } - - /// - /// 初始化「關閉」按鈕 (closeButtonPinYinSongs),用於隱藏拼音輸入介面。 - /// - private void InitializeCloseButtonPinYinSongs() - { - // 讀取設定檔中的按鈕配置數據 - var data = LoadBtnConfigData(); - - // 從設定檔中取得「關閉」按鈕的座標 (X, Y, Width, Height) - closeButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "closeButtonPinYinSongs"); - - // 從設定檔中讀取「關閉」按鈕的圖片 (一般狀態、滑鼠懸停、按下時的圖片) - var buttonImages = LoadButtonImages(data, "CloseButtonImagesPinYin"); - - // 建立「關閉」按鈕,設定名稱、座標、圖片及點擊事件 - closeButtonPinYinSongs = CreateSpecialButton( - "btnClosePinYinSongs", // 按鈕名稱 - closeButtonPinYinCoords, // 設定按鈕的座標與大小 - buttonImages.normal, // 設定按鈕的正常狀態圖片 - buttonImages.mouseOver, // 設定按鈕的滑鼠懸停圖片 - buttonImages.mouseDown, // 設定按鈕的按下狀態圖片 - CloseButtonPinYinSongs_Click // 綁定按鈕的點擊事件處理函式 - ); - } - - /// - /// 關閉拼音輸入模式,隱藏相關 UI 元件。 - /// - /// 觸發事件的按鈕。 - /// 事件參數。 private void CloseButtonPinYinSongs_Click(object sender, EventArgs e) { // 隱藏拼音輸入的背景圖片 (可能是 UI 中的輸入框背景) @@ -259,7 +269,6 @@ namespace DualScreenDemo // 設定拼音輸入框與所有相關按鈕的可見性為 false SetPinYinSongsAndButtonsVisibility(false); FindPinYinSongs(); - } private void FindPinYinSongs(){ string searchText = inputBoxPinYinSongs.Text; @@ -276,230 +285,6 @@ namespace DualScreenDemo multiPagePanel.currentPageIndex = 0; multiPagePanel.LoadSongs(searchResults); } - /// - /// 初始化拼音輸入框 (RichTextBox),並從 config.ini 讀取相關設定。 - /// - private void InitializeInputBoxPinYinSongs() - { - try - { - // 創建一個 INI 檔案解析器 - var parser = new FileIniDataParser(); - - // 配置解析器的參數 - parser.Parser.Configuration.AssigmentSpacer = ""; // 設定 = 兩側沒有空格 - parser.Parser.Configuration.CommentString = "#"; // 使用 # 作為註解符號 - parser.Parser.Configuration.CaseInsensitive = true; // 參數名稱不區分大小寫 - - IniData data; // 儲存解析後的 INI 數據 - - // 讀取 config.ini 文件,使用 UTF-8 編碼 - using (var reader = new StreamReader("img.ini", System.Text.Encoding.UTF8)) - { - data = parser.ReadData(reader); - } - - // **從 INI 檔案讀取拼音輸入框的位置與大小** - int x = int.Parse(data["InputBoxPinYinSongs"]["X"]); // X 座標 - int y = int.Parse(data["InputBoxPinYinSongs"]["Y"]); // Y 座標 - int width = int.Parse(data["InputBoxPinYinSongs"]["Width"]); // 寬度 - int height = int.Parse(data["InputBoxPinYinSongs"]["Height"]); // 高度 - - // **讀取字型設定** - string fontName = data["InputBoxPinYinSongs"]["FontName"]; // 字型名稱 - float fontSize = float.Parse(data["InputBoxPinYinSongs"]["FontSize"]); // 字體大小 - FontStyle fontStyle = (FontStyle)Enum.Parse(typeof(FontStyle), data["InputBoxPinYinSongs"]["FontStyle"]); // 字體樣式 - Color foreColor = Color.FromName(data["InputBoxPinYinSongs"]["ForeColor"]); // 文字顏色 - - // 創建拼音輸入框 (RichTextBox) - inputBoxPinYinSongs = new RichTextBox - { - Visible = false, // 預設為隱藏 - Name = "inputBoxPinYinSongs", // 設定控制項名稱 - ForeColor = foreColor, // 設定文字顏色 - Font = new Font( - fontName, - fontSize / 900 * Screen.PrimaryScreen.Bounds.Height, // 根據螢幕大小調整字體 - fontStyle - ) - }; - - // 設定輸入框的位置與大小 - ResizeAndPositionControl(inputBoxPinYinSongs, x, y, width, height); - - // **綁定 TextChanged 事件 (當輸入內容改變時觸發搜尋)** - /*inputBoxPinYinSongs.TextChanged += (sender, e) => - { - string searchText = inputBoxPinYinSongs.Text; - - // 根據拼音前綴篩選歌曲 - var searchResults = allSongs.Where(song => song.PinyinNotation.StartsWith(searchText)).ToList(); - - currentPage = 0; // 重置當前頁面索引 - currentSongList = searchResults; // 更新搜尋結果 - totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage); // 計算總頁數 - - // 更新 UI,顯示搜尋結果 - multiPagePanel.currentPageIndex = 0; - multiPagePanel.LoadSongs(currentSongList); - };*/ - - // 將拼音輸入框加入視窗中 - this.Controls.Add(inputBoxPinYinSongs); - } - catch (Exception ex) - { - // 發生錯誤時輸出錯誤訊息 (避免程式崩潰) - Console.WriteLine($"An error occurred: {ex.Message}"); - } - } - /// - /// 存儲 PictureBoxPinYinSongs 的座標與尺寸信息。 - /// - /// - /// 此元組包含以下四個值: - /// X:X 座標 - /// , Y:Y 座標 - /// , Width:寬度 - /// , Height:高度 - /// - private (int X, int Y, int Width, int Height) pictureBoxPinYinSongCoords; - - /// - /// 從 config.ini 配置檔案中載入 PictureBoxPinYinSongs 的座標與尺寸設定。 - /// - private void LoadPictureBoxPinYinSongCoordsFromConfig() - { - // 創建一個 INI 檔案解析器 - var parser = new FileIniDataParser(); - - // 讀取 config.ini 文件並解析成 IniData 對象 - string iniPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "img.ini"); - IniData data = parser.ReadFile(iniPath); - - - // 取得 PictureBoxPinYinSongs 區段的設定值 - var coords = data["PictureBoxPinYinSongs"]; - - // 解析 X, Y, Width, Height,並存入 pictureBoxPinYinSongCoords - pictureBoxPinYinSongCoords = ( - int.Parse(coords["X"]), // 解析 X 座標 - int.Parse(coords["Y"]), // 解析 Y 座標 - int.Parse(coords["Width"]), // 解析 寬度 - int.Parse(coords["Height"]) // 解析 高度 - ); - } - /// - /// 顯示拼音歌曲圖片 - /// - /// 圖片路徑 - private void ShowImageOnPictureBoxPinYinSongs(string imagePath) - { - // 從設定檔載入 PictureBox 的座標與大小 - LoadPictureBoxPinYinSongCoordsFromConfig(); - - // 使用指定的圖片路徑建立 Bitmap 影像 - Bitmap originalImage = new Bitmap(imagePath); - - // 建立一個矩形,表示 PictureBox 應該顯示的範圍 - Rectangle displayArea = new Rectangle( - pictureBoxPinYinSongCoords.X, // 設定 X 座標 - pictureBoxPinYinSongCoords.Y, // 設定 Y 座標 - pictureBoxPinYinSongCoords.Width, // 設定 寬度 - pictureBoxPinYinSongCoords.Height // 設定 高度 - ); - - // 將載入的圖片設定為 pictureBoxPinYinSongs 的影像 - pictureBoxPinYinSongs.Image = originalImage; - - // 調整 PictureBox 的大小與位置,使其符合 displayArea 的設定 - ResizeAndPositionPictureBox( - pictureBoxPinYinSongs, - displayArea.X, - displayArea.Y, - displayArea.Width, - displayArea.Height - ); - - // 顯示 PictureBox - pictureBoxPinYinSongs.Visible = true; - - } - /// - /// 設定拼音模式的 UI 是否可見 - /// - /// 是否可見 - private void SetPinYinSongsAndButtonsVisibility(bool isVisible) - { - // 定義一個委派 (Action),用於更新 UI 控件的可見性 - System.Action action = () => - { - // 暫停佈局更新,以防止 UI 閃爍或重繪時出現異常 - SuspendLayout(); - - // 設定 pictureBoxPinYinSongs 的可見性 - pictureBoxPinYinSongs.Visible = isVisible; - if (isVisible) pictureBoxPinYinSongs.BringToFront(); // 確保顯示時位於最前方 - - // 設定所有拼音字母按鈕的可見性 - foreach (var button in letterButtonsForPinYinSongs) - { - button.Visible = isVisible; - if (isVisible) button.BringToFront(); - } - - // 設定 modifyButtonPinYinSongs (修改按鈕) 的可見性 - if (modifyButtonPinYinSongs != null) - { - modifyButtonPinYinSongs.Visible = isVisible; - if (isVisible) modifyButtonPinYinSongs.BringToFront(); - } - - // 設定 clearButtonPinYinSongs (清除按鈕) 的可見性 - if (clearButtonPinYinSongs != null) - { - clearButtonPinYinSongs.Visible = isVisible; - if (isVisible) clearButtonPinYinSongs.BringToFront(); - } - - // 設定 closeButtonPinYinSongs (關閉按鈕) 的可見性 - closeButtonPinYinSongs.Visible = isVisible; - if (isVisible) closeButtonPinYinSongs.BringToFront(); - - // 設定 inputBoxPinYinSongs (輸入框) 的可見性 - inputBoxPinYinSongs.Visible = isVisible; - if (isVisible) inputBoxPinYinSongs.BringToFront(); - - // 恢復佈局,允許 UI 更新 - ResumeLayout(); - PerformLayout(); - - // 刷新 pictureBoxPinYinSongs,確保畫面更新 - pictureBoxPinYinSongs.Refresh(); - - // 刷新拼音字母按鈕 - foreach (var button in letterButtonsForPinYinSongs) - { - button.Refresh(); - } - - // 刷新其他按鈕與輸入框 - modifyButtonPinYinSongs.Refresh(); - clearButtonPinYinSongs.Refresh(); - closeButtonPinYinSongs.Refresh(); - inputBoxPinYinSongs.Refresh(); - }; - - // 如果當前執行緒不是 UI 執行緒,則使用 Invoke 確保執行於 UI 執行緒 - if (this.InvokeRequired) - { - this.Invoke(action); - } - else - { - action(); - } - - } + #endregion } } \ No newline at end of file diff --git a/Program.cs b/Program.cs index c3f7575..3e9aff6 100644 --- a/Program.cs +++ b/Program.cs @@ -14,7 +14,7 @@ namespace DualScreenDemo private static PrimaryForm primaryForm; // 儲存實例的參考 public static Room room = new Room(); - public static string verSion = "Server V2.10 202508270919"; + public static string verSion = "Server V2.10 202508291614"; [STAThread] static void Main() diff --git a/Services/MediaService.cs b/Services/MediaService.cs index 9976209..06427fb 100644 --- a/Services/MediaService.cs +++ b/Services/MediaService.cs @@ -74,8 +74,6 @@ namespace DualScreenDemo.Services return duration > 0 && Math.Abs(duration - time) < 1000; } - private bool _isTransitioning = false; - public void LoadMedia(string filePath, int audioTrackIndex = 0) { diff --git a/VideoPlayerForm.cs b/VideoPlayerForm.cs index d1cf1b6..372cc74 100644 --- a/VideoPlayerForm.cs +++ b/VideoPlayerForm.cs @@ -347,9 +347,11 @@ namespace DualScreenDemo { string pathToPlay = song.getFile(); //同步畫面播放器載入media設置參數 + PrimaryForm.Instance.videoView0.Visible = false; _mediaService0.LoadMedia(pathToPlay, 0); _mediaService0.Player.Media.AddOption(":no-audio"); _mediaService0.Player.AspectRatio = "8:5"; + PrimaryForm.Instance.videoView0.Visible = true; //影片畫面播放器載入media設置聲道 _mediaService1.LoadMedia(pathToPlay, song.isPublicSong ? 0 : 1); //公播時註銷原唱按鈕事件 diff --git a/img.ini b/img.ini index 68eba89..9ac58ce 100644 --- a/img.ini +++ b/img.ini @@ -394,35 +394,13 @@ Y = 354 Width = 808 Height = 356 -[PictureBoxEnglishSingers] -X = 390 -Y = 350 -Width = 808 -Height = 356 - -[PictureBoxPinYinSingers] -X = 390 -Y = 350 -Width = 808 -Height = 356 - [PictureBoxZhuYinSongs] X = 390 Y = 350 Width = 808 Height = 356 -[PictureBoxEnglishSongs] -X = 390 -Y = 350 -Width = 808 -Height = 356 -[PictureBoxPinYinSongs] -X = 390 -Y = 350 -Width = 808 -Height = 356 [PhoneticSymbols] Symbols=ㄅ,ㄉ,ㄍ,ㄐ,ㄓ,ㄗ,ㄛ,ㄡ,ㄤ,ㄧ,ㄆ,ㄊ,ㄎ,ㄑ,ㄔ,ㄘ,ㄜ,ㄢ,ㄦ,ㄨ,ㄇ,ㄋ,ㄏ,ㄒ,ㄕ,ㄙ,ㄞ,ㄣ,ㄩ,ㄈ,ㄌ, ,ㄖ,ㄚ,ㄠ @@ -472,30 +450,11 @@ closeButtonZhuYinSingers = 1112,632,71,66 modifyButtonZhuYinSongs =1035,632,71,66 clearButtonZhuYinSongs = 408,632,71,66 closeButtonZhuYinSongs = 1114,632,71,66 -modifyButtonEnglishSingers = 1032,633,70,66 -clearButtonEnglishSingers = 408,633,70,66 -closeButtonEnglishSingers = 1110,633,70,66 -modifyButtonPinYinSingers = 1032,612,70,84 -clearButtonPinYinSingers = 408,612,70,84 -closeButtonPinYinSingers = 1110,612,70,84 -modifyButtonEnglishSongs = 1032,633,70,66 -clearButtonEnglishSongs = 408,633,70,66 -closeButtonEnglishSongs = 1110,633,70,66 -modifyButtonPinYinSongs = 1032,612,70,84 -clearButtonPinYinSongs = 408,612,70,84 -closeButtonPinYinSongs = 1110,612,70,84 -modifyButtonWordCountSongs = 926,624,72,67 -clearButtonWordCountSongs = 845,624,72,67 -enterButtonWordCountSongs=1007,624,72,67 -closeButtonWordCountSongs = 1088,624,72,67 -modifyButtonWordCountSingers = 926,624,72,67 -clearButtonWordCountSingers = 845,624,72,67 -enterButtonWordCountSingers=1007,624,72,67 -closeButtonWordCountSingers = 1088,624,72,67 -modifyButtonSongIDSearch = 826,626,94,87 -clearButtonSongIDSearch = 721,626,93,87 -closeButtonSongIDSearch = 1038,626,94,87 -enterButtonSongIDSearch = 931,626,94,87 + + + + + [ModifyButtonImagesZhuYin] normal = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(拼音按鍵)_←.png @@ -630,17 +589,7 @@ button34_normal = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星 button34_mouseDown = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(注音按鍵)_ㄠ 複本.png button34_mouseOver = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(注音按鍵)_ㄠ.png -[NumberButtonCoordinates] -button1 = 408,418,70,66 -button2 = 486,418,70,66 -button3 = 564,418,70,66 -button4 = 642,418,70,66 -button5 = 720,417,70,66 -button6 = 798,418,70,66 -button7 = 876,418,70,66 -button8 = 954,418,70,66 -button9 = 1033,418,70,66 -button10 = 1111,418,70,66 + [NumberButtonImages] button0_normal = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(英文按鍵)_1.png @@ -674,33 +623,7 @@ button9_normal = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星 button9_mouseDown = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(英文按鍵)_0 複本.png button9_mouseOver = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(英文按鍵)_0.png -[EnglishLetterButtonCoordinates] -button0 = 408,490,70,66 -button1 = 486,490,70,66 -button2 = 564,490,70,66 -button3 = 642,490,70,66 -button4 = 720,489,70,66 -button5 = 798,490,70,66 -button6 = 876,490,70,66 -button7 = 954,490,70,66 -button8 = 1033,490,70,66 -button9 = 1111,490,70,66 -button10 = 449,561,70,66 -button11 = 527,561,70,66 -button12 = 605,561,70,66 -button13 = 683,561,70,66 -button14 = 761,561,70,66 -button15 = 839,561,70,66 -button16 = 917,561,70,66 -button17 = 995,561,70,66 -button18 = 1073,561,70,66 -button19 = 486,633,70,66 -button20 = 564,633,70,66 -button21 = 642,633,70,66 -button22 = 720,634,70,66 -button23 = 798,633,70,66 -button24 = 876,633,70,66 -button25 = 954,633,70,66 + [EnglishLetterButtonImages] button0_normal = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(英文按鍵)_Q.png @@ -797,43 +720,8 @@ normal = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢( mouseOver = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(英文按鍵)_關閉.png mouseDown = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(英文按鍵)_關閉 複本.png -[InputBoxEnglishSingers] -X = 408 -Y = 361 -Width = 444 -Height = 47 -FontName = Times New Roman -FontSize = 26 -FontStyle = Regular -ForeColor = Black -[PinYinLetterButtonCoordinates] -button0 = 408,438,70,82 -button1 = 486,438,70,82 -button2 = 564,438,70,82 -button3 = 642,438,70,82 -button4 = 720,438,70,82 -button5 = 798,438,70,82 -button6 = 876,438,70,82 -button7 = 954,438,70,82 -button8 = 1032,438,70,82 -button9 = 1110,438,70,82 -button10 = 447,526,70,82 -button11 = 525,526,70,82 -button12 = 603,526,70,82 -button13 = 681,526,70,82 -button14 = 759,526,70,82 -button15 = 837,526,70,82 -button16 = 915,526,70,82 -button17 = 993,526,70,82 -button18 = 1071,526,70,82 -button19 = 486,614,70,82 -button20 = 564,614,70,82 -button21 = 642,614,70,82 -button22 = 720,614,70,82 -button23 = 798,614,70,82 -button24 = 876,614,70,82 -button25 = 954,614,70,82 + [PinYinLetterButtonImages] button0_normal = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(拼音按鍵)_Q.png @@ -930,15 +818,7 @@ normal = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢( mouseOver = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(拼音按鍵)_關閉.png mouseDown = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(拼音按鍵)_關閉 複本.png -[InputBoxPinYinSingers] -X = 408 -Y = 371 -Width = 444 -Height = 57 -FontName = Times New Roman -FontSize = 26 -FontStyle = Regular -ForeColor = Black + [RefillButtonImagesHandWriting] normal = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(手寫按鍵)_重填.png @@ -965,25 +845,6 @@ FontSize=26 FontStyle=Bold ForeColor=Black -[InputBoxEnglishSongs] -X = 408 -Y = 361 -Width = 444 -Height = 47 -FontName = Times New Roman -FontSize = 26 -FontStyle = Regular -ForeColor = Black - -[InputBoxPinYinSongs] -X = 408 -Y = 371 -Width = 444 -Height = 57 -FontName = Times New Roman -FontSize = 26 -FontStyle = Regular -ForeColor = Black [NumberWordCountButtonImages] @@ -1018,13 +879,12 @@ button9_normal = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名 button9_mouseDown = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢(字數按鍵)_0 複本.png button9_mouseOver = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢(字數按鍵)_0.png - -[ClearButtonImagesWordCount] +[ModifyButtonImagesWordCount] normal = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢(手寫按鍵)_清除.png mouseOver = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢(手寫按鍵)_清除.png mouseDown = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢(手寫按鍵)_清除 複本.png -[ModifyButtonImagesWordCount] +[ClearButtonImagesWordCount] normal = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢(手寫按鍵)_重填.png mouseOver = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢(手寫按鍵)_重填.png mouseDown = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢(手寫按鍵)_重填 複本.png @@ -1039,37 +899,9 @@ normal = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢( mouseOver = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢(字數按鍵)_確認.png mouseDown = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢(字數按鍵)_確認 複本.png -[PictureBoxSongIDSearch] -X = 645 -Y = 280 -Width = 554 -Height = 442 -[InputBoxSongIDSearch] -X = 660 -Y = 360 -Width = 528 -Height = 63 -FontName = Times New Roman -FontSize = 26 -FontStyle = Regular -ForeColor = Black -[NumberSongIDSymbols] -Symbols=1,2,3,4,5,6,7,8,9,0 -[NumberSongIDButtonCoordinates] -button0 = 652,550,94,87 -button1 = 665,435,94,87 -button2 = 771,435,94,87 -button3 = 879,435,94,87 -button4 = 985,435,94,87 -button5 = 1092,435,94,87 -button6 = 665,532,94,87 -button7 = 772,532,94,87 -button8 = 879,532,94,87 -button9 = 985,532,94,87 -button10 = 1092,532,94,87 [NumberSongIDButtonImages] button0_normal = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢(編號按鍵)_1.png @@ -1123,21 +955,5 @@ normal = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢( mouseOver = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢(編號按鍵)_確認.png mouseDown = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢(編號按鍵)_確認 複本.png -[PictureBoxWordCountSingers] -X = 790 -Y = 350 -Width = 420 -Height = 350 -[InputBoxWordCountSingers] -X = 800 -Y = 405 -Width = 400 -Height = 60 -FontName = Times New Roman -FontSize = 26 -FontStyle = Regular -ForeColor = Black -[ImageSrc] -path=\\sshost\KTVSuperstar \ No newline at end of file