superstar_v2/PrimaryFormParts/SongSearch/PrimaryForm.SongSearch.PinyinSearch.cs
jasonchenwork 9b6772686c 2508291614
控制項從屬設定更正
程式碼重構/瘦身
調整減少videoview閃爍
已點歌曲頁面自動定位邏輯調整
2025-08-29 16:15:54 +08:00

290 lines
13 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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}");
}
}
// 顯示拼音歌曲圖片
// <param name="imagePath">圖片路徑</param>
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 是否可見
// <param name="isVisible">是否可見</param>
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
}
}