using System.IO; namespace DualScreenDemo { public partial class PrimaryForm { // 拼音歌曲的 PictureBox 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) { // 更新搜尋模式按鈕的背景圖 zhuyinSearchSongButton.BackgroundImage = zhuyinSearchSongNormalBackground; englishSearchSongButton.BackgroundImage = englishSearchSongNormalBackground; pinyinSearchSongButton.BackgroundImage = pinyinSearchSongActiveBackground; wordCountSearchSongButton.BackgroundImage = wordCountSearchSongNormalBackground; handWritingSearchSongButton.BackgroundImage = handWritingSearchSongNormalBackground; numberSearchSongButton.BackgroundImage = numberSearchSongNormalBackground; // 讀取 config.ini 並獲取拼音圖片的路徑 var configData = LoadBtnConfigData(); string pinyinImagePath = Path.Combine(serverPath, configData["ImagePaths"]["PinYinSongs"]); // 顯示拼音歌曲圖片 ShowImageOnPictureBoxPinYinSongs(Path.Combine(serverPath, pinyinImagePath)); // 鍵盤UI介面顯示設定 SetWordCountSongsAndButtonsVisibility(false); SetEnglishSongsAndButtonsVisibility(false); SetPinYinSongsAndButtonsVisibility(true); SetHandWritingForSongsAndButtonsVisibility(false); SetSongIDSearchAndButtonsVisibility(false); SetZhuYinSongsAndButtonsVisibility(false); ResetinputBox(); pictureBoxPinYinSongs.Visible = true; } // 處理拼音按鈕點擊事件 private void LetterButtonPinYinSongs_Click(object sender, EventArgs e) { // 嘗試將觸發事件的物件轉換為 Button 類型 var button = sender as Button; // 檢查按鈕是否為 null,並確保該按鈕的 Tag 屬性不為 null if (button != null && button.Tag != null) { // 確保輸入框 (inputBoxPinYinSongs) 是可見狀態 if (inputBoxPinYinSongs.Visible) { // 將按鈕的標籤 (Tag) 轉換為字串,並附加到輸入框的文字內容中 inputBoxPinYinSongs.Text += button.Tag.ToString(); } } } // 「修改」按鈕點擊事件:刪除拼音輸入框中的最後一個字母。 private void ModifyButtonPinYinSongs_Click(object sender, EventArgs e) { // 確保 inputBoxPinYinSongs 存在於視窗控制項集合內,且輸入框內有文字 if (pictureBoxPinYinSongs.Controls.Contains(inputBoxPinYinSongs) && inputBoxPinYinSongs.Text.Length > 0) { // 刪除輸入框內的最後一個字母 inputBoxPinYinSongs.Text = inputBoxPinYinSongs.Text.Substring(0, inputBoxPinYinSongs.Text.Length - 1); } } // 當使用者點擊清除按鈕時,若輸入框存在且有內容,則將其清空。 private void ClearButtonPinYinSongs_Click(object sender, EventArgs e) { // 檢查視窗內是否包含 inputBoxPinYinSongs 控制項,且輸入框內是否有文字 if (pictureBoxPinYinSongs.Controls.Contains(inputBoxPinYinSongs) && inputBoxPinYinSongs.Text.Length > 0) { // 清空拼音輸入框的內容 inputBoxPinYinSongs.Text = ""; } } private void CloseButtonPinYinSongs_Click(object sender, EventArgs e) { // 隱藏拼音輸入的背景圖片 (可能是 UI 中的輸入框背景) pictureBoxPinYinSongs.Visible = false; pinyinSearchSongButton.BackgroundImage = pinyinSearchSongNormalBackground; // 設定拼音輸入框與所有相關按鈕的可見性為 false SetPinYinSongsAndButtonsVisibility(false); FindPinYinSongs(); } private void FindPinYinSongs(){ string searchText = inputBoxPinYinSongs.Text; // 在這裡添加搜尋歌曲的邏輯 // 例如:根據輸入框的內容搜尋歌曲 string query = string.IsNullOrWhiteSpace(searchText) ? "SELECT * FROM song_library_cache ORDER BY song_id DESC LIMIT 1000;" : $"SELECT * FROM song_library_cache WHERE pinyin_abbr 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); } #endregion } }