diff --git a/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.NumberSearch.cs b/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.NumberSearch.cs
index f7edf9e..64012c3 100644
--- a/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.NumberSearch.cs
+++ b/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.NumberSearch.cs
@@ -8,95 +8,138 @@ namespace DualScreenDemo
{
public partial class PrimaryForm
{
+ ///
+ /// 「數字搜尋」按鈕點擊事件
+ /// 1. 更新所有搜尋按鈕的背景圖片,使「數字搜尋」顯示為啟動狀態
+ /// 2. 在 `pictureBoxSongIDSearch` 顯示對應的圖片
+ /// 3. 顯示「數字搜尋」相關 UI 元素
+ ///
private void NumberSearchButton2_Click(object sender, EventArgs e)
{
+ // 更新搜尋按鈕的背景圖片 (將所有按鈕設為未選中狀態,僅數字搜尋為選中狀態)
zhuyinSearchSongButton.BackgroundImage = zhuyinSearchSongNormalBackground;
englishSearchSongButton.BackgroundImage = englishSearchSongNormalBackground;
pinyinSearchSongButton.BackgroundImage = pinyinSearchSongNormalBackground;
wordCountSearchSongButton.BackgroundImage = wordCountSearchSongNormalBackground;
handWritingSearchSongButton.BackgroundImage = handWritingSearchNormalBackground;
- numberSearchSongButton.BackgroundImage = numberSearchSongActiveBackground;
+ numberSearchSongButton.BackgroundImage = numberSearchSongActiveBackground; // 設定數字搜尋為選中狀態
+ // 在 `pictureBoxSongIDSearch` 顯示數字搜尋的 UI 圖片
ShowImageOnPictureBoxSongIDSearch(Path.Combine(Application.StartupPath, @"themes\superstar\6-1.png"));
+ // 顯示與數字搜尋相關的 UI 元素
SetPictureBoxSongIDSearchAndButtonsVisibility(true);
pictureBoxSongIDSearch.Visible = true;
}
+ ///
+ /// 在 pictureBoxSongIDSearch 中顯示指定路徑的圖片,並對其進行裁切與調整大小
+ /// 1. 加載原始圖片
+ /// 2. 裁切圖片以符合 UI 需求
+ /// 3. 設定 pictureBoxSongIDSearch 的圖片
+ /// 4. 調整 pictureBoxSongIDSearch 的位置與大小
+ /// 5. 顯示 pictureBoxSongIDSearch
+ ///
+ /// 要顯示的圖片路徑
private void ShowImageOnPictureBoxSongIDSearch(string imagePath)
{
-
+ // 1. 加載原始圖片
Bitmap originalImage = new Bitmap(imagePath);
-
+ // 2. 定義裁切區域 (左上角 x=593, y=135, 寬=507, 高=508)
Rectangle cropArea = new Rectangle(593, 135, 507, 508);
-
+ // 3. 進行圖片裁切
Bitmap croppedImage = CropImage(originalImage, cropArea);
-
+ // 4. 設定 `pictureBoxSongIDSearch` 的圖片
pictureBoxSongIDSearch.Image = croppedImage;
-
-
+
+ // 5. 調整 `pictureBoxSongIDSearch` 的大小與位置 (基於 cropArea 並加上偏移量)
ResizeAndPositionPictureBox(pictureBoxSongIDSearch, cropArea.X + offsetXSongID, cropArea.Y + offsetYSongID, cropArea.Width, cropArea.Height);
-
+
+ // 6. 顯示 `pictureBoxSongIDSearch`
pictureBoxSongIDSearch.Visible = true;
}
+
+ ///
+ /// 當使用者點擊「修改按鈕」時,刪除 `inputBoxSongIDSearch` 輸入框內的最後一個字元。
+ ///
+ /// 觸發事件的對象(按鈕)
+ /// 事件參數
private void ModifyButtonSongIDSearch_Click(object sender, EventArgs e)
{
-
+ // 確保 `inputBoxSongIDSearch` 內有文字,避免 `Substring` 發生錯誤
if (inputBoxSongIDSearch.Text.Length > 0)
{
-
+ // 刪除輸入框內的最後一個字元
inputBoxSongIDSearch.Text = inputBoxSongIDSearch.Text.Substring(0, inputBoxSongIDSearch.Text.Length - 1);
}
}
+
+ ///
+ /// 當使用者點擊「關閉按鈕」時,隱藏歌曲編號搜尋的相關 UI 元件。
+ ///
+ /// 觸發事件的對象(按鈕)
+ /// 事件參數
private void CloseButtonSongIDSearch_Click(object sender, EventArgs e)
{
-
+ // 隱藏歌曲編號搜尋的相關 UI 元件(包含輸入框、按鈕、圖片等)
SetPictureBoxSongIDSearchAndButtonsVisibility(false);
}
+ ///
+ /// 控制歌曲編號搜尋的 UI 顯示與隱藏。
+ /// 當 為 true 時,顯示 UI 元件。
+ /// 當 為 false 時,隱藏 UI 元件。
+ ///
+ /// 是否顯示 UI
private void SetPictureBoxSongIDSearchAndButtonsVisibility(bool isVisible)
{
+ // 定義 UI 更新的 Action
System.Action action = () =>
{
+ // 暫停佈局更新,提高效能
SuspendLayout();
-
+ // 控制歌曲編號搜尋圖片的顯示/隱藏
pictureBoxSongIDSearch.Visible = isVisible;
-
+ // 如果顯示圖片,則將其置頂
if (isVisible) pictureBoxSongIDSearch.BringToFront();
-
+ // 控制「修改」和「關閉」按鈕的可見性
modifyButtonSongIDSearch.Visible = isVisible;
closeButtonSongIDSearch.Visible = isVisible;
-
+ // 如果按鈕顯示,則置頂
if (isVisible)
{
modifyButtonSongIDSearch.BringToFront();
closeButtonSongIDSearch.BringToFront();
}
-
+ // 控制數字按鈕的可見性
foreach (Button button in numberButtonsSongIDSearch)
{
button.Visible = isVisible;
+ // 使按鈕顯示時位於最上層
if (isVisible)
button.BringToFront();
}
+ // 控制輸入框的可見性
inputBoxSongIDSearch.Visible = isVisible;
if (isVisible) inputBoxSongIDSearch.BringToFront();
+ // 恢復佈局更新
ResumeLayout();
};
+ // 如果當前執行緒不是 UI 執行緒,則使用 Invoke 呼叫
if (this.InvokeRequired)
{
this.Invoke(action);
@@ -106,113 +149,140 @@ namespace DualScreenDemo
action();
}
}
+
+ ///
+ /// 初始化數字輸入 (Song ID Search) 相關按鈕與輸入框。
+ /// 這些按鈕用於數字輸入、刪除 (Modify) 及關閉 (Close) 功能。
+ ///
private void InitializeButtonsForPictureBoxSongIDSearch()
{
-
+ // 數字按鈕的座標陣列 (左上角 X, 左上角 Y, 右下角 X, 右下角 Y)
int[,] coords = new int[,]
{
- {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}
+ {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)1920;
float heightRatio = screenH / (float)900;
+ // 初始化數字按鈕陣列
numberButtonsSongIDSearch = new Button[10];
+ // 建立數字按鈕
for (int i = 0; i < numberButtonsSongIDSearch.Length; i++)
{
numberButtonsSongIDSearch[i] = new Button();
-
+ // 設定按鈕大小與位置
ConfigureButton(
numberButtonsSongIDSearch[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,
+ coords[i, 0], // X 座標
+ coords[i, 1], // Y 座標
+ coords[i, 2] - coords[i, 0], // 按鈕寬度
+ coords[i, 3] - coords[i, 1], // 按鈕高度
+ resizedNormalStateImageFor6_1, // 一般狀態圖片
+ resizedMouseOverImageFor6_1, // 滑鼠懸停圖片
+ resizedMouseDownImageFor6_1, // 按下時圖片
null
);
+ // 重新計算按鈕位置,確保適應不同解析度
int newXForSongID = (int)(((numberButtonsSongIDSearch[i].Location.X / widthRatio) + offsetXSongID) * widthRatio);
int newYForSongID = (int)(((numberButtonsSongIDSearch[i].Location.Y / heightRatio) + offsetYSongID) * heightRatio);
numberButtonsSongIDSearch[i].Location = new Point(newXForSongID, newYForSongID);
-
+ // 設定按鈕名稱與 Tag (數字值)
numberButtonsSongIDSearch[i].Name = "NumberButtonSongIDSearch" + i;
-
numberButtonsSongIDSearch[i].Tag = (i + 1).ToString();
- if (i == 9)
+ if (i == 9) // 最後一個按鈕 (實際上應為數字 "0")
{
numberButtonsSongIDSearch[i].Name = "NumberButtonSongIDSearch0";
numberButtonsSongIDSearch[i].Tag = "0";
}
-
+ // 設定按鈕的點擊事件
numberButtonsSongIDSearch[i].Click += SongIDSearchButton_Click;
-
+ // 加入畫面
this.Controls.Add(numberButtonsSongIDSearch[i]);
}
-
- modifyButtonSongIDSearch = new Button {
+ // 初始化「刪除」按鈕 (Modify)
+ modifyButtonSongIDSearch = new Button
+ {
Name = "ModifyButtonSongIDSearch",
Tag = "Modify",
Visible = false
};
- ConfigureButton(modifyButtonSongIDSearch, 978, 292, 1081 - 978, 397 - 292, resizedNormalStateImageFor6_1, resizedMouseOverImageFor6_1, resizedMouseDownImageFor6_1, ModifyButtonSongIDSearch_Click);
+ ConfigureButton(modifyButtonSongIDSearch, 978, 292, 1081 - 978, 397 - 292,
+ resizedNormalStateImageFor6_1, resizedMouseOverImageFor6_1, resizedMouseDownImageFor6_1, ModifyButtonSongIDSearch_Click);
+
+ // 調整刪除按鈕位置以適應不同解析度
int newX = (int)(((modifyButtonSongIDSearch.Location.X / widthRatio) + offsetXSongID) * widthRatio);
- int newY = (int)(((modifyButtonSongIDSearch.Location.Y / widthRatio) + offsetYSongID) * heightRatio);
+ int newY = (int)(((modifyButtonSongIDSearch.Location.Y / heightRatio) + offsetYSongID) * heightRatio);
modifyButtonSongIDSearch.Location = new Point(newX, newY);
+
this.Controls.Add(modifyButtonSongIDSearch);
-
-
- closeButtonSongIDSearch = new Button {
+
+ // 初始化「關閉」按鈕 (Close)
+ closeButtonSongIDSearch = new Button
+ {
Name = "CloseButtonSongIDSearch",
Tag = "Close",
Visible = false
};
-
- ConfigureButton(closeButtonSongIDSearch, 982, 147, 1082 - 982, 250 - 147, resizedNormalStateImageFor6_1, resizedMouseOverImageFor6_1, resizedMouseDownImageFor6_1, CloseButtonSongIDSearch_Click);
+
+ ConfigureButton(closeButtonSongIDSearch, 982, 147, 1082 - 982, 250 - 147,
+ resizedNormalStateImageFor6_1, resizedMouseOverImageFor6_1, resizedMouseDownImageFor6_1, CloseButtonSongIDSearch_Click);
+
+ // 調整關閉按鈕位置以適應不同解析度
newX = (int)(((closeButtonSongIDSearch.Location.X / widthRatio) + offsetXSongID) * widthRatio);
- newY = (int)(((closeButtonSongIDSearch.Location.Y / widthRatio) + offsetYSongID) * heightRatio);
+ newY = (int)(((closeButtonSongIDSearch.Location.Y / heightRatio) + offsetYSongID) * heightRatio);
closeButtonSongIDSearch.Location = new Point(newX, newY);
+
this.Controls.Add(closeButtonSongIDSearch);
- inputBoxSongIDSearch = new RichTextBox();
- inputBoxSongIDSearch.Name = "inputBoxSongIDSearch";
- ResizeAndPositionControl(inputBoxSongIDSearch, 645 + offsetXSongID, 197 + offsetXSongID, 986 - 645, 281 - 197);
- inputBoxSongIDSearch.ForeColor = Color.Black;
- inputBoxSongIDSearch.Font = new Font("細明體", (float)26 / 900 * Screen.PrimaryScreen.Bounds.Height, FontStyle.Regular);
+ // 初始化輸入框 (RichTextBox)
+ inputBoxSongIDSearch = new RichTextBox
+ {
+ Name = "inputBoxSongIDSearch",
+ ForeColor = Color.Black,
+ Font = new Font("細明體", (float)26 / 900 * Screen.PrimaryScreen.Bounds.Height, FontStyle.Regular)
+ };
+ // 調整輸入框大小與位置
+ ResizeAndPositionControl(inputBoxSongIDSearch, 645 + offsetXSongID, 197 + offsetXSongID, 986 - 645, 281 - 197);
+
+ // 當輸入框內容改變時,自動搜尋歌曲
inputBoxSongIDSearch.TextChanged += (sender, e) =>
{
string searchText = inputBoxSongIDSearch.Text;
-
+
+ // 使用 LINQ 搜尋符合條件的歌曲 (以輸入的數字開頭)
var searchResults = allSongs.Where(song => song.SongNumber.StartsWith(searchText)).ToList();
+
+ // 重設分頁與歌曲列表
currentPage = 0;
currentSongList = searchResults;
totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage);
+ // 更新歌曲顯示
multiPagePanel.currentPageIndex = 0;
multiPagePanel.LoadSongs(currentSongList);
};
@@ -220,16 +290,25 @@ namespace DualScreenDemo
this.Controls.Add(inputBoxSongIDSearch);
}
+
+ ///
+ /// 數字按鈕點擊事件,將按鈕上的數字 (Tag 值) 加入到 inputBoxSongIDSearch 中。
+ ///
+ /// 觸發事件的按鈕
+ /// 事件參數
private void SongIDSearchButton_Click(object sender, EventArgs e)
{
-
-
+ // 嘗試將 sender 轉型為 Button
var button = sender as Button;
+
+ // 確保按鈕不為 null 且具有 Tag 屬性 (Tag 屬性存放數字)
if (button != null && button.Tag != null)
{
+ // 將按鈕的 Tag 值 (數字) 加入到輸入框
inputBoxSongIDSearch.Text += button.Tag.ToString();
}
}
+
}
}
\ No newline at end of file
diff --git a/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.cs b/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.cs
index 37823f2..0f3daaa 100644
--- a/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.cs
+++ b/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.cs
@@ -4,9 +4,13 @@ using System.Windows.Forms;
namespace DualScreenDemo
{
- /* 建構子創立,程式進入初始位置,所有搜尋初始化設置 */
+ /*
+ * 主要視窗 (PrimaryForm) 的部分定義
+ * 負責初始化搜尋按鈕並處理歌曲搜尋 UI 相關邏輯
+ */
public partial class PrimaryForm
{
+ // 各種歌曲搜尋按鈕及其對應的背景圖片 (一般狀態 / 啟動狀態)
private Button zhuyinSearchSongButton;
private Bitmap zhuyinSearchSongNormalBackground;
private Bitmap zhuyinSearchSongActiveBackground;
@@ -26,8 +30,15 @@ namespace DualScreenDemo
private Bitmap numberSearchSongNormalBackground;
private Bitmap numberSearchSongActiveBackground;
+ ///
+ /// 點擊「歌曲搜尋」按鈕時的事件處理函式
+ /// 1. 更新導航按鈕的背景圖片,使「歌曲搜尋」按鈕顯示為啟動狀態
+ /// 2. 隱藏其他搜尋/分類 UI,僅顯示歌曲搜尋選單
+ /// 3. 若有 QR Code 顯示,則將其隱藏
+ ///
private void SongSearchButton_Click(object sender, EventArgs e)
{
+ // 更新導航按鈕的背景圖片
newSongAlertButton.BackgroundImage = newSongAlertNormalBackground;
hotPlayButton.BackgroundImage = hotPlayNormalBackground;
singerSearchButton.BackgroundImage = singerSearchNormalBackground;
@@ -41,7 +52,7 @@ namespace DualScreenDemo
deliciousFoodButton.BackgroundImage = deliciousFoodNormalBackground;
isOnOrderedSongsPage = false;
-
+ // 隱藏其他 UI
SetHotSongButtonsVisibility(false);
SetNewSongButtonsVisibility(false);
SetSingerSearchButtonsVisibility(false);
@@ -51,14 +62,15 @@ namespace DualScreenDemo
SetZhuYinSingersAndButtonsVisibility(false);
SetZhuYinSongsAndButtonsVisibility(false);
SetEnglishSingersAndButtonsVisibility(false);
-
SetPinYinSingersAndButtonsVisibility(false);
SetPinYinSongsAndButtonsVisibility(false);
SetPictureBoxToggleLightAndButtonsVisibility(false);
SetPictureBoxSceneSoundEffectsAndButtonsVisibility(false);
+
+ // 顯示歌曲搜尋選單按鈕
SetSongSearchButtonsVisibility(true);
-
+ // 隱藏 QR Code (若有)
if (pictureBoxQRCode != null)
{
pictureBoxQRCode.Visible = false;
@@ -66,12 +78,25 @@ namespace DualScreenDemo
}
}
+ ///
+ /// 設定「歌曲搜尋」相關按鈕的可見性
+ ///
+ /// 是否顯示
private void SetSongSearchButtonsVisibility(bool isVisible)
{
- pictureBox4.Visible = isVisible;
+ pictureBox4.Visible = isVisible; // 控制搜尋 UI 背景的可見性
- Button[] songSearchButtons = { zhuyinSearchSongButton, englishSearchSongButton, wordCountSearchSongButton, pinyinSearchSongButton, handWritingSearchSongButton, numberSearchSongButton };
+ // 歌曲搜尋的按鈕陣列
+ Button[] songSearchButtons = {
+ zhuyinSearchSongButton,
+ englishSearchSongButton,
+ wordCountSearchSongButton,
+ pinyinSearchSongButton,
+ handWritingSearchSongButton,
+ numberSearchSongButton
+ };
+ // 設定按鈕可見性,若顯示則移至最前
foreach (var button in songSearchButtons)
{
button.Visible = isVisible;
@@ -82,25 +107,41 @@ namespace DualScreenDemo
}
}
+ ///
+ /// 初始化所有「歌曲搜尋」按鈕
+ /// 依據不同的搜尋方式 (注音、英文、拼音、筆劃、手寫、數字) 建立對應按鈕
+ ///
private void InitializeButtonsForSongSearch()
{
-
- InitializeSearchButton(ref zhuyinSearchSongButton, "zhuyinSearchSongButton", 1214, 230, 209, 59, ref zhuyinSearchSongNormalBackground, ref zhuyinSearchSongActiveBackground, normalStateImageSongQuery, mouseDownImageSongQuery, ZhuyinSearchSongsButton_Click);
+ // 初始化「注音搜尋」按鈕
+ InitializeSearchButton(ref zhuyinSearchSongButton, "zhuyinSearchSongButton",
+ 1214, 230, 209, 59, ref zhuyinSearchSongNormalBackground, ref zhuyinSearchSongActiveBackground,
+ normalStateImageSongQuery, mouseDownImageSongQuery, ZhuyinSearchSongsButton_Click);
-
- InitializeSearchButton(ref englishSearchSongButton, "englishSearchSongButton", 1214, 293, 209, 58, ref englishSearchSongNormalBackground, ref englishSearchSongActiveBackground, normalStateImageSongQuery, mouseDownImageSongQuery, EnglishSearchSongsButton_Click);
+ // 初始化「英文搜尋」按鈕
+ InitializeSearchButton(ref englishSearchSongButton, "englishSearchSongButton",
+ 1214, 293, 209, 58, ref englishSearchSongNormalBackground, ref englishSearchSongActiveBackground,
+ normalStateImageSongQuery, mouseDownImageSongQuery, EnglishSearchSongsButton_Click);
-
- InitializeSearchButton(ref pinyinSearchSongButton, "pinyinSearchSongButton", 1214, 356, 209, 58, ref pinyinSearchSongNormalBackground, ref pinyinSearchSongActiveBackground, normalStateImageSongQuery, mouseDownImageSongQuery, PinyinSearchSongsButton_Click);
+ // 初始化「拼音搜尋」按鈕
+ InitializeSearchButton(ref pinyinSearchSongButton, "pinyinSearchSongButton",
+ 1214, 356, 209, 58, ref pinyinSearchSongNormalBackground, ref pinyinSearchSongActiveBackground,
+ normalStateImageSongQuery, mouseDownImageSongQuery, PinyinSearchSongsButton_Click);
-
- InitializeSearchButton(ref wordCountSearchSongButton, "wordCountSearchSongButton", 1214, 418, 209, 59, ref wordCountSearchSongNormalBackground, ref wordCountSearchSongActiveBackground, normalStateImageSongQuery, mouseDownImageSongQuery, WordCountSearchSong_Click);
+ // 初始化「筆劃搜尋」按鈕
+ InitializeSearchButton(ref wordCountSearchSongButton, "wordCountSearchSongButton",
+ 1214, 418, 209, 59, ref wordCountSearchSongNormalBackground, ref wordCountSearchSongActiveBackground,
+ normalStateImageSongQuery, mouseDownImageSongQuery, WordCountSearchSong_Click);
-
- InitializeSearchButton(ref handWritingSearchSongButton, "handWritingSearchSongButton", 1214, 481, 209, 59, ref handWritingSearchSongNormalBackground, ref handWritingSearchSongActiveBackground, normalStateImageSongQuery, mouseDownImageSongQuery, HandWritingSearchButtonForSongs_Click);
+ // 初始化「手寫搜尋」按鈕
+ InitializeSearchButton(ref handWritingSearchSongButton, "handWritingSearchSongButton",
+ 1214, 481, 209, 59, ref handWritingSearchSongNormalBackground, ref handWritingSearchSongActiveBackground,
+ normalStateImageSongQuery, mouseDownImageSongQuery, HandWritingSearchButtonForSongs_Click);
-
- InitializeSearchButton(ref numberSearchSongButton, "numberSearchSongButton", 1214, 544, 209, 58, ref numberSearchSongNormalBackground, ref numberSearchSongActiveBackground, normalStateImageSongQuery, mouseDownImageSongQuery, NumberSearchButton2_Click);
+ // 初始化「數字搜尋」按鈕
+ InitializeSearchButton(ref numberSearchSongButton, "numberSearchSongButton",
+ 1214, 544, 209, 58, ref numberSearchSongNormalBackground, ref numberSearchSongActiveBackground,
+ normalStateImageSongQuery, mouseDownImageSongQuery, NumberSearchButton2_Click);
}
}
-}
\ No newline at end of file
+}