From 3b3111d2271532e2651ded643fa935db1f567ef1 Mon Sep 17 00:00:00 2001 From: jasonchenwork Date: Wed, 19 Mar 2025 09:35:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=8C=E6=9B=B2=E6=9F=A5=E8=A9=A2=E5=AD=97?= =?UTF-8?q?=E6=95=B8=E8=A8=BB=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PrimaryForm.SongSearch.WordCountSearch.cs | 347 ++++++++++-------- 1 file changed, 201 insertions(+), 146 deletions(-) diff --git a/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.WordCountSearch.cs b/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.WordCountSearch.cs index 7a4ed07..e8d7b13 100644 --- a/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.WordCountSearch.cs +++ b/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.WordCountSearch.cs @@ -8,182 +8,237 @@ namespace DualScreenDemo { public partial class PrimaryForm { - + /// + /// 當使用者點擊「詞數查歌」按鈕時,切換到詞數查歌模式,更新 UI 並顯示對應的查歌界面。 + /// + /// 觸發事件的按鈕。 + /// 事件參數。 private void WordCountSearchSong_Click(object sender, EventArgs e) { - zhuyinSearchSongButton.BackgroundImage = zhuyinSearchSongNormalBackground; - englishSearchSongButton.BackgroundImage = englishSearchSongNormalBackground; - pinyinSearchSongButton.BackgroundImage = pinyinSearchSongNormalBackground; - wordCountSearchSongButton.BackgroundImage = wordCountSearchSongActiveBackground; - handWritingSearchSongButton.BackgroundImage = handWritingSearchNormalBackground; - numberSearchSongButton.BackgroundImage = numberSearchSongNormalBackground; + // 設定查歌模式按鈕的背景圖片 + zhuyinSearchSongButton.BackgroundImage = zhuyinSearchSongNormalBackground; // 注音查歌(普通狀態) + englishSearchSongButton.BackgroundImage = englishSearchSongNormalBackground; // 英文查歌(普通狀態) + pinyinSearchSongButton.BackgroundImage = pinyinSearchSongNormalBackground; // 拼音查歌(普通狀態) + wordCountSearchSongButton.BackgroundImage = wordCountSearchSongActiveBackground; // 詞數查歌(選中狀態) + handWritingSearchSongButton.BackgroundImage = handWritingSearchNormalBackground; // 手寫查歌(普通狀態) + numberSearchSongButton.BackgroundImage = numberSearchSongNormalBackground; // 數字查歌(普通狀態) + // 顯示詞數查歌對應的圖片 ShowImageOnPictureBoxWordCount(Path.Combine(Application.StartupPath, @"themes\superstar\6-1.png")); + // 設定詞數查歌的 PictureBox 和按鈕的可見性 SetPictureBoxWordCountAndButtonsVisibility(true); - pictureBoxWordCount.Visible = true; - } + pictureBoxWordCount.Visible = true; // 顯示 PictureBoxWordCount + } + /// + /// 顯示詞數查歌對應的圖片 + /// + /// 圖片路徑 private void ShowImageOnPictureBoxWordCount(string imagePath) { + // 載入原始圖片 Bitmap originalImage = new Bitmap(imagePath); - + // 定義裁切區域 (起始座標: 593, 135,寬度: 507,高度: 508) Rectangle cropArea = new Rectangle(593, 135, 507, 508); - + // 裁切圖片,獲得指定範圍的影像 Bitmap croppedImage = CropImage(originalImage, cropArea); - + // 將裁切後的圖片顯示在 pictureBoxWordCount 上 pictureBoxWordCount.Image = croppedImage; - - - ResizeAndPositionPictureBox(pictureBoxWordCount, cropArea.X + offsetXWordCount, cropArea.Y + offsetXWordCount, cropArea.Width, cropArea.Height); - + + // 調整 pictureBoxWordCount 的大小與位置 + ResizeAndPositionPictureBox(pictureBoxWordCount, + cropArea.X + offsetXWordCount, // X 座標 (包含位移量) + cropArea.Y + offsetYWordCount, // Y 座標 (包含位移量) + cropArea.Width, // 寬度 + cropArea.Height // 高度 + ); + + // 顯示 pictureBoxWordCount pictureBoxWordCount.Visible = true; + } - private void InitializeButtonsForPictureBoxWordCount() - { - - int[,] coords = new int[,] + /// + /// 初始化「詞數查歌」模式的按鈕與輸入框,並根據螢幕解析度進行調整。 + /// + private void InitializeButtonsForPictureBoxWordCount() { - {651, 292, 752, 400}, - {760, 292, 861, 400}, - {869, 292, 972, 399}, - {652, 401, 752, 502}, - {760, 401, 861, 504}, - {869, 398, 972, 502}, - {651, 502, 753, 607}, - {759, 504, 863, 607}, - {869, 503, 973, 608}, - {981, 501, 1083, 609} - }; - - int screenW = Screen.PrimaryScreen.Bounds.Width; - int screenH = Screen.PrimaryScreen.Bounds.Height; - - - float widthRatio = screenW / (float)1440; - float heightRatio = screenH / (float)900; - - numberButtonsWordCount = new Button[10]; - - for (int i = 0; i < numberButtonsWordCount.Length; i++) - { - numberButtonsWordCount[i] = new Button(); - - - ConfigureButton( - numberButtonsWordCount[i], - coords[i, 0], - coords[i, 1], - coords[i, 2] - coords[i, 0], - coords[i, 3] - coords[i, 1], - - resizedNormalStateImageFor6_1, - resizedMouseOverImageFor6_1, - resizedMouseDownImageFor6_1, - null - ); - - int newXForWordCount = (int)(((numberButtonsWordCount[i].Location.X / widthRatio) + offsetXWordCount) * widthRatio); - int newYForWordCount = (int)(((numberButtonsWordCount[i].Location.Y / heightRatio) + offsetYWordCount) * heightRatio); - numberButtonsWordCount[i].Location = new Point(newXForWordCount, newYForWordCount); - - - numberButtonsWordCount[i].Name = "NumberButtonWordCount" + i; - - numberButtonsWordCount[i].Tag = (i + 1).ToString(); - if (i == 9) + // 定義數字按鈕的座標範圍 (左上角 X, Y 以及右下角 X, Y) + int[,] coords = new int[,] { - numberButtonsWordCount[i].Name = "NumberButtonWordCount0"; - numberButtonsWordCount[i].Tag = "0"; + {651, 292, 752, 400}, // 1 + {760, 292, 861, 400}, // 2 + {869, 292, 972, 399}, // 3 + {652, 401, 752, 502}, // 4 + {760, 401, 861, 504}, // 5 + {869, 398, 972, 502}, // 6 + {651, 502, 753, 607}, // 7 + {759, 504, 863, 607}, // 8 + {869, 503, 973, 608}, // 9 + {981, 501, 1083, 609} // 0 + }; + + // 取得螢幕解析度 + int screenW = Screen.PrimaryScreen.Bounds.Width; + int screenH = Screen.PrimaryScreen.Bounds.Height; + + // 計算寬高比例,供座標縮放使用 + float widthRatio = screenW / (float)1440; + float heightRatio = screenH / (float)900; + + // 建立數字按鈕陣列 + numberButtonsWordCount = new Button[10]; + + // 依序建立 0-9 按鈕 + for (int i = 0; i < numberButtonsWordCount.Length; i++) + { + numberButtonsWordCount[i] = new Button(); + + // 設定按鈕屬性 (位置、大小、圖片) + ConfigureButton( + numberButtonsWordCount[i], + coords[i, 0], + coords[i, 1], + coords[i, 2] - coords[i, 0], // 計算按鈕寬度 + coords[i, 3] - coords[i, 1], // 計算按鈕高度 + resizedNormalStateImageFor6_1, + resizedMouseOverImageFor6_1, + resizedMouseDownImageFor6_1, + null + ); + + // 調整按鈕位置,使其適應不同解析度 + int newXForWordCount = (int)(((numberButtonsWordCount[i].Location.X / widthRatio) + offsetXWordCount) * widthRatio); + int newYForWordCount = (int)(((numberButtonsWordCount[i].Location.Y / heightRatio) + offsetYWordCount) * heightRatio); + numberButtonsWordCount[i].Location = new Point(newXForWordCount, newYForWordCount); + + // 設定按鈕名稱 + numberButtonsWordCount[i].Name = "NumberButtonWordCount" + i; + numberButtonsWordCount[i].Tag = (i + 1).ToString(); + + // 處理按鈕 0 的特殊名稱與標籤 + if (i == 9) + { + numberButtonsWordCount[i].Name = "NumberButtonWordCount0"; + numberButtonsWordCount[i].Tag = "0"; + } + + // 設定點擊事件 + numberButtonsWordCount[i].Click += WordCountButton_Click; + + // 將按鈕加入視窗控制項 + this.Controls.Add(numberButtonsWordCount[i]); } - - numberButtonsWordCount[i].Click += WordCountButton_Click; + // 建立「修改」按鈕 (Modify) + modifyButtonWordCount = new Button { + Name = "ModifyButtonWordCount", + Tag = "Modify", + Visible = false + }; + ConfigureButton(modifyButtonWordCount, 978, 292, 1081 - 978, 397 - 292, + resizedNormalStateImageFor6_1, resizedMouseOverImageFor6_1, resizedMouseDownImageFor6_1, + ModifyButtonWordCount_Click); - - this.Controls.Add(numberButtonsWordCount[i]); + // 調整「修改」按鈕的位置 + int newX = (int)(((modifyButtonWordCount.Location.X / widthRatio) + offsetXWordCount) * widthRatio); + int newY = (int)(((modifyButtonWordCount.Location.Y / heightRatio) + offsetYWordCount) * heightRatio); + modifyButtonWordCount.Location = new Point(newX, newY); + + // 加入「修改」按鈕至視窗 + this.Controls.Add(modifyButtonWordCount); + + // 建立「關閉」按鈕 (Close) + closeButtonWordCount = new Button { + Name = "CloseButtonWordCount", + Tag = "Close", + Visible = false + }; + ConfigureButton(closeButtonWordCount, 982, 147, 1082 - 982, 250 - 147, + resizedNormalStateImageFor6_1, resizedMouseOverImageFor6_1, resizedMouseDownImageFor6_1, + CloseButtonWordCount_Click); + + // 調整「關閉」按鈕的位置 + newX = (int)(((closeButtonWordCount.Location.X / widthRatio) + offsetXWordCount) * widthRatio); + newY = (int)(((closeButtonWordCount.Location.Y / heightRatio) + offsetYWordCount) * heightRatio); + closeButtonWordCount.Location = new Point(newX, newY); + + // 加入「關閉」按鈕至視窗 + this.Controls.Add(closeButtonWordCount); + + // 建立輸入框 (RichTextBox) 供使用者輸入詞數 + inputBoxWordCount = new RichTextBox(); + inputBoxWordCount.Name = "inputBoxWordCount"; + + // 設定輸入框位置與大小 + ResizeAndPositionControl(inputBoxWordCount, 645 + offsetXWordCount, 197 + offsetYWordCount, 986 - 645, 281 - 197); + inputBoxWordCount.ForeColor = Color.Black; + inputBoxWordCount.Font = new Font("細明體", (float)26 / 900 * Screen.PrimaryScreen.Bounds.Height, FontStyle.Regular); + + // 設定輸入框內容變更時的處理邏輯 + inputBoxWordCount.TextChanged += (sender, e) => + { + string searchText = inputBoxWordCount.Text; + int targetLength = 0; + + // 檢查輸入的是否為數字 + if (int.TryParse(searchText, out targetLength)) + { + // 根據詞數長度篩選歌曲 + var searchResults = allSongs.Where(song => song.Song.Replace(" ", "").Length == targetLength).ToList(); + currentPage = 0; + currentSongList = searchResults; + totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage); + + // 更新多頁面面板 + multiPagePanel.currentPageIndex = 0; + multiPagePanel.LoadSongs(currentSongList); + } + else + { + // 若輸入非數字,則清空當前歌曲列表 + currentSongList.Clear(); + } + }; + + // 加入輸入框至視窗 + this.Controls.Add(inputBoxWordCount); } - - modifyButtonWordCount = new Button { - Name = "ModifyButtonWordCount", - Tag = "Modify", - Visible = false - }; - - ConfigureButton(modifyButtonWordCount, 978, 292, 1081 - 978, 397 - 292, resizedNormalStateImageFor6_1, resizedMouseOverImageFor6_1, resizedMouseDownImageFor6_1, ModifyButtonWordCount_Click); - int newX = (int)(((modifyButtonWordCount.Location.X / widthRatio) + offsetXWordCount) * widthRatio); - int newY = (int)(((modifyButtonWordCount.Location.Y / widthRatio) + offsetYWordCount) * heightRatio); - modifyButtonWordCount.Location = new Point(newX, newY); - this.Controls.Add(modifyButtonWordCount); - - - closeButtonWordCount = new Button { - Name = "CloseButtonWordCount", - Tag = "Close", - Visible = false - }; - - ConfigureButton(closeButtonWordCount, 982, 147, 1082 - 982, 250 - 147, resizedNormalStateImageFor6_1, resizedMouseOverImageFor6_1, resizedMouseDownImageFor6_1, CloseButtonWordCount_Click); - newX = (int)(((closeButtonWordCount.Location.X / widthRatio) + offsetXWordCount) * widthRatio); - newY = (int)(((closeButtonWordCount.Location.Y / widthRatio) + offsetYWordCount) * heightRatio); - closeButtonWordCount.Location = new Point(newX, newY); - this.Controls.Add(closeButtonWordCount); - - inputBoxWordCount = new RichTextBox(); - inputBoxWordCount.Name = "inputBoxWordCount"; - ResizeAndPositionControl(inputBoxWordCount, 645 + offsetXWordCount, 197 + offsetYWordCount, 986 - 645, 281 - 197); - inputBoxWordCount.ForeColor = Color.Black; - inputBoxWordCount.Font = new Font("細明體", (float)26 / 900 * Screen.PrimaryScreen.Bounds.Height, FontStyle.Regular); - - inputBoxWordCount.TextChanged += (sender, e) => - { - string searchText = inputBoxWordCount.Text; - int targetLength = 0; - - - if (int.TryParse(searchText, out targetLength)) - { - - var searchResults = allSongs.Where(song => song.Song.Replace(" ", "").Length == targetLength).ToList(); - currentPage = 0; - currentSongList = searchResults; - totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage); - - multiPagePanel.currentPageIndex = 0; - multiPagePanel.LoadSongs(currentSongList); - } - else - { - - currentSongList.Clear(); - } - }; - - this.Controls.Add(inputBoxWordCount); - } - private void WordCountButton_Click(object sender, EventArgs e) - { - - - var button = sender as Button; - if (button != null && button.Tag != null) + /// + /// 處理數字按鈕的點擊事件,將按鈕對應的數字 (Tag) 加入輸入框 inputBoxWordCount 中。 + /// + /// 觸發事件的按鈕 + /// 事件參數 + private void WordCountButton_Click(object sender, EventArgs e) { - inputBoxWordCount.Text += button.Tag.ToString(); - } - } + // 嘗試將 sender 轉換為 Button 類型 + var button = sender as Button; - private void CloseButtonWordCount_Click(object sender, EventArgs e) - { - - SetPictureBoxWordCountAndButtonsVisibility(false); - } + // 確保按鈕不為空,且擁有有效的 Tag 值 + if (button != null && button.Tag != null) + { + // 將按鈕的 Tag 值 (數字) 追加到輸入框中 + inputBoxWordCount.Text += button.Tag.ToString(); + } + } + + /// + /// 關閉詞數輸入界面,隱藏相關的 PictureBox 和按鈕。 + /// + /// 觸發事件的按鈕。 + /// 事件參數。 + private void CloseButtonWordCount_Click(object sender, EventArgs e) + { + // 設定詞數輸入界面及其按鈕的可見性為 false,使其隱藏 + SetPictureBoxWordCountAndButtonsVisibility(false); + } } } \ No newline at end of file