2509011155

程式碼重構 座標資料從ini併入程式內
Media設定參數先將clock設定註解
This commit is contained in:
jasonchenwork 2025-09-01 11:58:11 +08:00
parent 1d9705af79
commit 9d5ab28d96
4 changed files with 409 additions and 1297 deletions

View File

@ -1,8 +1,5 @@
using System.IO; using System.IO;
using IniParser;
using IniParser.Model;
/* Song Search with ZhuYin */
namespace DualScreenDemo namespace DualScreenDemo
{ {
public partial class PrimaryForm public partial class PrimaryForm
@ -12,14 +9,224 @@ namespace DualScreenDemo
//存放注音按鈕的陣列 //存放注音按鈕的陣列
private Button[] phoneticButtonsForSongs; private Button[] phoneticButtonsForSongs;
//特殊功能按鈕(修改、清除、關閉) //特殊功能按鈕(修改、清除、關閉)
private string[] ButtonsPhoneticSymbols = ["ㄅ","ㄉ","ㄍ","ㄐ","ㄓ","ㄗ","ㄛ","ㄡ","ㄤ","ㄧ",
"ㄆ","ㄊ","ㄎ","ㄑ","ㄔ","ㄘ","ㄜ","ㄢ","ㄦ","ㄨ",
"ㄇ","ㄋ","ㄏ","ㄒ","ㄕ","ㄙ","ㄞ","ㄣ","ㄩ",
"ㄈ","ㄌ","","ㄖ","ㄚ","ㄠ"];
private Button modifyButtonZhuYinSongs; private Button modifyButtonZhuYinSongs;
private Button clearButtonZhuYinSongs; private Button clearButtonZhuYinSongs;
private Button closeButtonZhuYinSongs; private Button closeButtonZhuYinSongs;
//用於顯示輸入文字的輸入框 //用於顯示輸入文字的輸入框
private RichTextBox inputBoxZhuYinSongs; private RichTextBox inputBoxZhuYinSongs;
/// <summary>
/// 注音歌曲搜尋按鈕點擊事件 private void InitializeButtonsForZhuYinSongs()
/// </summary> {
// 4. 初始化輸入框 (用於顯示使用者輸入的注音符號)
InitializeInputBoxZhuYinSongs();
InitializeBopomofoSongsButton();
InitializePhoneticSymbolBtns(pictureBoxZhuYinSongs,PhoneticButton_Click);
}
private void InitializeBopomofoSongsButton()
{
var data = LoadBtnConfigData();
modifyButtonZhuYinSongs = new Button { Name = "modifyButtonZhuYinSongs" };
ConfigureButton(modifyButtonZhuYinSongs, 650, 275, 72, 67,
new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesZhuYin"]["normal"])),
new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesZhuYin"]["mouseOver"])),
new Bitmap(Path.Combine(serverPath, data["ModifyButtonImagesZhuYin"]["mouseDown"])),
ModifyButtonZhuYinSongs_Click);
pictureBoxZhuYinSongs.Controls.Add(modifyButtonZhuYinSongs);
clearButtonZhuYinSongs = new Button { Name = "clearButtonZhuYinSongs" };
ConfigureButton(clearButtonZhuYinSongs, 8, 275, 72, 67,
new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesZhuYin"]["normal"])),
new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesZhuYin"]["mouseOver"])),
new Bitmap(Path.Combine(serverPath, data["ClearButtonImagesZhuYin"]["mouseDown"])),
ClearButtonZhuYinSongs_Click);
pictureBoxZhuYinSongs.Controls.Add(clearButtonZhuYinSongs);
closeButtonZhuYinSongs = new Button { Name = "closeButtonZhuYinSongs" };
ConfigureButton(closeButtonZhuYinSongs, 730, 275, 72, 67,
new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesZhuYin"]["normal"])),
new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesZhuYin"]["mouseOver"])),
new Bitmap(Path.Combine(serverPath, data["CloseButtonImagesZhuYin"]["mouseDown"])),
CloseButtonZhuYinSongs_Click);
pictureBoxZhuYinSongs.Controls.Add(closeButtonZhuYinSongs);
}
private void InitializePhoneticSymbolBtns(Control control, EventHandler handler)
{
phoneticButtonsForSongs = new Button[35];
// 設置上排按鈕
int x = 8;
for (int i = 0; i < 10; i++)
{
CreatePhoneticSymbolBtns(i, x, 65, control, handler);
x += 80;
}
x = 8;
for (int i = 10; i < 20; i++)
{
CreatePhoneticSymbolBtns(i, x, 135, control, handler);
x += 80;
}
x = 40;
for (int i = 20; i < 29; i++)
{
CreatePhoneticSymbolBtns(i, x, 205, control, handler);
x += 80;
}
// 設置下排按鈕
x = 88;
for (int i = 29; i < 32; i++)
{
CreatePhoneticSymbolBtns(i, x, 275, control, handler);
x += 80;
}
x += 80;
for (int i = 32; i < 35; i++)
{
CreatePhoneticSymbolBtns(i, x, 275, control, handler);
x += 80;
}
}
private void CreatePhoneticSymbolBtns(int index, int x, int y, Control control, EventHandler handler)
{
try
{
// 加載配置數據
var data = LoadBtnConfigData();
// 創建語音按鈕並設置其屬性
phoneticButtonsForSongs[index] = new Button
{
Name = $"phoneticButtonsForSongs_{ButtonsPhoneticSymbols[index]}", // 按鈕名稱設為語音符號名稱
};
if (index == 31)
{
ConfigureButton(phoneticButtonsForSongs[index], x, y, 154, 67,
new Bitmap(Path.Combine(serverPath, data["PhoneticButtonImages"][$"button{index}_normal"])),
new Bitmap(Path.Combine(serverPath, data["PhoneticButtonImages"][$"button{index}_mouseOver"])),
new Bitmap(Path.Combine(serverPath, data["PhoneticButtonImages"][$"button{index}_mouseDown"])),
handler);
}
else
{
ConfigureButton(phoneticButtonsForSongs[index], x, y, 72, 67,
new Bitmap(Path.Combine(serverPath, data["PhoneticButtonImages"][$"button{index}_normal"])),
new Bitmap(Path.Combine(serverPath, data["PhoneticButtonImages"][$"button{index}_mouseOver"])),
new Bitmap(Path.Combine(serverPath, data["PhoneticButtonImages"][$"button{index}_mouseDown"])),
handler);
}
// 設置按鈕的 Tag 屬性為對應的語音符號
phoneticButtonsForSongs[index].Tag = ButtonsPhoneticSymbols[index];
// 將按鈕添加到表單的控制項集合中
control.Controls.Add(phoneticButtonsForSongs[index]);
}
catch (Exception ex)
{
Console.WriteLine($"Error creating button at index {index}: {ex.Message}");
}
}
// 初始化注音輸入框 (RichTextBox),設定外觀、事件處理及位置大小
private void InitializeInputBoxZhuYinSongs()
{
try
{
string fontName = "Times New Roman";
float fontSize = 26;
FontStyle fontStyle = FontStyle.Regular;
Color foreColor = Color.Black;
inputBoxZhuYinSongs = new RichTextBox
{
Name = "inputBoxZhuYinSongs",
ForeColor = foreColor, // 設定文字顏色
Font = new Font(fontName, fontSize / 900 * Screen.PrimaryScreen.Bounds.Height, fontStyle),
ScrollBars = RichTextBoxScrollBars.None // 禁用滾動條
};
// 調整輸入框大小與位置
ResizeAndPositionControl(inputBoxZhuYinSongs, 10, 12, 455, 47);
// 將輸入框加入到 UI 控制項
pictureBoxZhuYinSongs.Controls.Add(inputBoxZhuYinSongs);
}
catch (Exception ex)
{
Console.WriteLine("Error initializing inputBoxZhuYinSongs: " + ex.Message);
}
}
// 在 pictureBoxZhuYinSongs 上顯示指定路徑的圖片,並根據設定調整其大小與位置。
private void ShowImageOnPictureBoxZhuYinSongs(string imagePath)
{
// 讀取圖片檔案並載入 Bitmap 物件
Bitmap originalImage = new Bitmap(imagePath);
// 設定 PictureBox 的圖片
pictureBoxZhuYinSongs.Image = originalImage;
// 調整 PictureBox 的大小與位置,使其符合設定
ResizeAndPositionPictureBox(pictureBoxZhuYinSongs,390, 360, 808, 356);
// 顯示 PictureBox
pictureBoxZhuYinSongs.Visible = true;
}
// 設定注音歌曲相關的 PictureBox、按鈕和輸入框的可見性。
private void SetZhuYinSongsAndButtonsVisibility(bool isVisible)
{
// 定義要執行的操作,設定各控件的可見性
System.Action action = () =>
{
try
{
// 暫停佈局邏輯,防止在調整控件可見性時觸發不必要的佈局計算,提升性能
SuspendLayout();
if (isVisible) SetUIVisible(pictureBoxZhuYinSongs);
else CloseUI(pictureBoxZhuYinSongs);
ResumeLayout();
PerformLayout();
}
catch (Exception ex)
{
// 捕捉並輸出異常資訊,方便除錯
Console.WriteLine("Error in SetZhuYinSongsAndButtonsVisibility: " + ex.Message);
}
};
// 如果當前執行緒需要呼叫 Invoke 方法才能修改控件,則使用 Invoke
if (this.InvokeRequired)
{
this.Invoke(action);
}
else
{
action();
}
}
private void ZhuyinSearchSongsButton_Click(object sender, EventArgs e) private void ZhuyinSearchSongsButton_Click(object sender, EventArgs e)
{ {
//更新搜尋模式按鈕的背景圖 //更新搜尋模式按鈕的背景圖
@ -42,252 +249,27 @@ namespace DualScreenDemo
ResetinputBox(); ResetinputBox();
pictureBoxZhuYinSongs.Visible = true; pictureBoxZhuYinSongs.Visible = true;
} }
/// <summary>
/// 初始化注音按鈕 (Phonetic Buttons) 並載入其對應的圖片與座標
/// <para>1. 讀取 config.ini 設定檔,獲取按鈕的相關數據 (符號、座標、圖片)</para>
/// <para>2. 解析注音符號並儲存至 phoneticSymbols 陣列</para>
/// <para>3. 解析按鈕的座標資訊,存入 phoneticButtonCoords</para>
/// <para>4. 解析按鈕的圖片 (正常狀態、按下狀態、懸停狀態),存入 phoneticButtonImages。</para>
/// <para>5. 依序建立 35 個注音按鈕,並套用對應的圖片與事件處理函數。</para>
/// </summary>
private void InitializePhoneticButtonsForSongs()
{
// 1. 從設定檔 (config.ini) 讀取配置數據,包含按鈕座標、圖片等
var data = LoadBtnConfigData();
// 2. 讀取注音符號列表,這些符號將用於顯示在按鈕上
phoneticSymbols = LoadPhoneticSymbols(data);
// 3. 從設定檔載入 **注音按鈕的座標**,每個按鈕都有對應的 (X, Y, Width, Height)
phoneticButtonCoords = LoadButtonCoordinates(data, "PhoneticButtonCoordinates", 35);
// 4. 從設定檔載入 **注音按鈕的圖片**,每個按鈕都有正常、按下、懸停三種狀態
phoneticButtonImages = LoadButtonImages(data, "PhoneticButtonImages", 35);
// 5. 建立 35 個注音按鈕的陣列 (每個按鈕對應一個注音符號)
phoneticButtonsForSongs = new Button[35];
// 6. 迴圈建立所有的注音按鈕
for (int i = 0; i < 35; i++)
{
// 取得當前按鈕的圖片 (從已載入的 phoneticButtonImages 字典中獲取)
var buttonImages = phoneticButtonImages[$"button{i}"];
// 建立單個注音按鈕,並設定其圖片與點擊事件
CreatePhoneticButtonForSongs(
i, // 按鈕索引 (對應於 phoneticSymbols)
buttonImages.normal, // 按鈕的普通狀態圖片
buttonImages.mouseDown, // 按下時的圖片
buttonImages.mouseOver // 滑鼠懸停時的圖片
);
}
}
/// <summary>
/// 建立單個注音按鈕,並設定其圖片、大小、位置,以及滑鼠事件。
/// </summary>
/// <param name="index">按鈕索引 (對應於 phoneticSymbols)</param>
/// <param name="normalImagePath">按鈕的普通狀態圖片路徑</param>
/// <param name="mouseDownImagePath">按鈕被按下時的圖片路徑</param>
/// <param name="mouseOverImagePath">滑鼠懸停時的圖片路徑</param>
private void CreatePhoneticButtonForSongs(int index, string normalImagePath, string mouseDownImagePath, string mouseOverImagePath)
{
try
{
// 1. 創建按鈕並初始化屬性
phoneticButtonsForSongs[index] = new Button
{
Name = $"phoneticButton_{phoneticSymbols[index]}", // 設定按鈕名稱,方便識別
BackgroundImage = Image.FromFile(Path.Combine(serverPath, normalImagePath)), // 設定預設背景圖
BackgroundImageLayout = ImageLayout.Stretch, // 背景圖自動填滿按鈕
FlatStyle = FlatStyle.Flat, // 設定按鈕為扁平樣式
FlatAppearance = { BorderSize = 0 } // 移除按鈕的邊框
};
// 2. 設定按鈕的大小與位置
ResizeAndPositionButton(
phoneticButtonsForSongs[index],
phoneticButtonCoords[index].X,
phoneticButtonCoords[index].Y,
phoneticButtonCoords[index].Width,
phoneticButtonCoords[index].Height
);
// 3. 載入三種狀態的圖片
Image normalImage = Image.FromFile(Path.Combine(serverPath, normalImagePath));
Image mouseDownImage = Image.FromFile(Path.Combine(serverPath, mouseDownImagePath));
Image mouseOverImage = Image.FromFile(Path.Combine(serverPath, mouseOverImagePath));
// 4. 設定滑鼠事件,改變背景圖
phoneticButtonsForSongs[index].MouseDown += (s, e) => phoneticButtonsForSongs[index].BackgroundImage = mouseDownImage;
phoneticButtonsForSongs[index].MouseUp += (s, e) => phoneticButtonsForSongs[index].BackgroundImage = normalImage;
phoneticButtonsForSongs[index].MouseEnter += (s, e) => phoneticButtonsForSongs[index].BackgroundImage = mouseOverImage;
phoneticButtonsForSongs[index].MouseLeave += (s, e) => phoneticButtonsForSongs[index].BackgroundImage = normalImage;
// 5. 設定按鈕的點擊事件 (當按下按鈕時,觸發 PhoneticButton_Click)
phoneticButtonsForSongs[index].Click += PhoneticButton_Click;
// 6. 存入對應的注音符號,方便之後的處理
phoneticButtonsForSongs[index].Tag = phoneticSymbols[index];
// 7. 將按鈕加入視窗
this.Controls.Add(phoneticButtonsForSongs[index]);
}
catch (Exception ex)
{
// 例外處理,確保按鈕建立失敗時不影響其他部分
Console.WriteLine($"Error creating button at index {index}: {ex.Message}");
}
}
/// <summary>
/// 初始化注音輸入界面的所有按鈕和輸入框。
/// </summary>
private void InitializeButtonsForZhuYinSongs()
{
// 1. 從設定檔 (config.ini) 載入注音符號
LoadPhoneticSymbolsFromConfig();
// 2. 初始化 35 個注音按鈕
InitializePhoneticButtonsForSongs();
// 3. 初始化特殊按鈕 (例如:刪除、確定、返回按鈕)
InitializeSpecialButtonsForZhuYinSongs();
// 4. 初始化輸入框 (用於顯示使用者輸入的注音符號)
InitializeInputBoxZhuYinSongs();
}
/// <summary>
/// 初始化注音輸入界面的特殊按鈕,包括「修改」、「清除」和「關閉」。
/// </summary>
private void InitializeSpecialButtonsForZhuYinSongs()
{
// 1. 初始化「修改」按鈕 (刪除上一個輸入的注音符號)
InitializeModifyButtonZhuYinSongs();
// 2. 初始化「清除」按鈕 (清空所有輸入內容)
InitializeClearButtonZhuYinSongs();
// 3. 初始化「關閉」按鈕 (關閉注音輸入介面)
InitializeCloseButtonZhuYinSongs();
}
/// <summary>
/// 初始化「修改」按鈕,讓使用者可以刪除上一個輸入的注音符號。
/// </summary>
private void InitializeModifyButtonZhuYinSongs()
{
// 1. 讀取設定檔 (config.ini) 來獲取特殊按鈕的座標與圖像資訊
var data = LoadBtnConfigData();
// 2. 從設定檔讀取「修改」按鈕的座標數據
modifyButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "modifyButtonZhuYinSongs");
// 3. 從設定檔讀取「修改」按鈕的圖像 (Normal、MouseOver、MouseDown)
var buttonImages = LoadButtonImages(data, "ModifyButtonImagesZhuYin");
// 4. 使用座標與圖像來建立「修改」按鈕,並綁定點擊事件
modifyButtonZhuYinSongs = CreateSpecialButton(
"btnModifyZhuYinSongs", // 按鈕名稱
modifyButtonZhuYinCoords, // 按鈕座標
buttonImages.normal, // 預設 (normal) 圖像
buttonImages.mouseOver, // 滑鼠移過 (hover) 圖像
buttonImages.mouseDown, // 按下 (pressed) 圖像
ModifyButtonZhuYinSongs_Click // 綁定按鈕點擊事件
);
}
/// <summary>
/// 「修改」按鈕的點擊事件,刪除輸入框內的最後一個注音符號。
/// </summary>
private void ModifyButtonZhuYinSongs_Click(object sender, EventArgs e) private void ModifyButtonZhuYinSongs_Click(object sender, EventArgs e)
{ {
// 1. 確保輸入框 (inputBoxZhuYinSongs) 存在於目前的視窗控制項中 // 1. 確保輸入框 (inputBoxZhuYinSongs) 存在於目前的視窗控制項中
if (this.Controls.Contains(inputBoxZhuYinSongs) && inputBoxZhuYinSongs.Text.Length > 0) if (pictureBoxZhuYinSongs.Controls.Contains(inputBoxZhuYinSongs) && inputBoxZhuYinSongs.Text.Length > 0)
{ {
// 2. 刪除輸入框中的最後一個字元 (即移除最後一個注音符號) // 2. 刪除輸入框中的最後一個字元 (即移除最後一個注音符號)
inputBoxZhuYinSongs.Text = inputBoxZhuYinSongs.Text.Substring(0, inputBoxZhuYinSongs.Text.Length - 1); inputBoxZhuYinSongs.Text = inputBoxZhuYinSongs.Text.Substring(0, inputBoxZhuYinSongs.Text.Length - 1);
} }
} }
/// <summary>
/// 初始化「清除」按鈕,並從設定檔載入其位置與圖片資源。
/// </summary>
private void InitializeClearButtonZhuYinSongs()
{
// 1. 從設定檔 (config.ini) 讀取配置數據
var data = LoadBtnConfigData();
// 2. 讀取「清除」按鈕的座標設定 (從 "SpecialButtonCoordinates" 內的 "clearButtonZhuYinSongs" 取得)
clearButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "clearButtonZhuYinSongs");
// 3. 讀取「清除」按鈕的圖片 (正常、滑鼠懸停、按下狀態)
var buttonImages = LoadButtonImages(data, "ClearButtonImagesZhuYin");
// 4. 建立「清除」按鈕,並設定對應的事件處理函式 (ClearButtonZhuYinSongs_Click)
clearButtonZhuYinSongs = CreateSpecialButton(
"btnClearZhuYinSongs", // 按鈕名稱
clearButtonZhuYinCoords, // 按鈕座標與大小
buttonImages.normal, // 正常狀態圖片
buttonImages.mouseOver, // 滑鼠懸停圖片
buttonImages.mouseDown, // 按下時圖片
ClearButtonZhuYinSongs_Click // 點擊事件處理函式
);
}
/// <summary>
/// 當使用者點擊「清除」按鈕時,將輸入框 (inputBoxZhuYinSongs) 的內容清空。
/// </summary>
/// <param name="sender">觸發事件的按鈕。</param>
/// <param name="e">事件參數。</param>
private void ClearButtonZhuYinSongs_Click(object sender, EventArgs e) private void ClearButtonZhuYinSongs_Click(object sender, EventArgs e)
{ {
// 1. 確保視窗內包含「注音輸入框」(inputBoxZhuYinSongs),且輸入框內有文字 // 1. 確保視窗內包含「注音輸入框」(inputBoxZhuYinSongs),且輸入框內有文字
if (this.Controls.Contains(inputBoxZhuYinSongs) && inputBoxZhuYinSongs.Text.Length > 0) if (pictureBoxZhuYinSongs.Controls.Contains(inputBoxZhuYinSongs) && inputBoxZhuYinSongs.Text.Length > 0)
{ {
// 2. 清空輸入框內容 // 2. 清空輸入框內容
inputBoxZhuYinSongs.Text = ""; inputBoxZhuYinSongs.Text = "";
} }
} }
/// <summary>
/// 初始化注音輸入的關閉按鈕,從設定檔讀取按鈕座標與圖片,並設置點擊事件
/// </summary>
private void InitializeCloseButtonZhuYinSongs()
{
// 讀取設定檔數據
var data = LoadBtnConfigData();
// 從設定檔讀取關閉按鈕的座標
closeButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "closeButtonZhuYinSongs");
// 從設定檔讀取關閉按鈕的圖片
var buttonImages = LoadButtonImages(data, "CloseButtonImagesZhuYin");
// 創建關閉按鈕並綁定點擊事件
closeButtonZhuYinSongs = CreateSpecialButton(
"btnCloseZhuYinSongs", // 按鈕名稱
closeButtonZhuYinCoords, // 按鈕座標
buttonImages.normal, // 正常狀態圖片
buttonImages.mouseOver, // 滑鼠懸停圖片
buttonImages.mouseDown, // 按下圖片
CloseButtonZhuYinSongs_Click // 綁定點擊事件
);
}
/// <summary>
/// 關閉注音輸入介面,隱藏相關 UI 元件
/// </summary>
/// <param name="sender">觸發事件的按鈕 (關閉按鈕)</param>
/// <param name="e">事件參數</param>
private void CloseButtonZhuYinSongs_Click(object sender, EventArgs e) private void CloseButtonZhuYinSongs_Click(object sender, EventArgs e)
{ {
// 隱藏注音輸入的圖片 // 隱藏注音輸入的圖片
@ -297,10 +279,9 @@ namespace DualScreenDemo
SetZhuYinSongsAndButtonsVisibility(false); SetZhuYinSongsAndButtonsVisibility(false);
FindZhuYiSongs(); // 查詢歌曲 FindZhuYiSongs(); // 查詢歌曲
} }
/// <summary>
/// 查詢歌曲(字數查詢),連接資料庫並執行 SQL 查詢。 private void FindZhuYiSongs()
/// </summary> {
private void FindZhuYiSongs(){
string searchText = inputBoxZhuYinSongs.Text; string searchText = inputBoxZhuYinSongs.Text;
// 在這裡添加搜尋歌曲的邏輯 // 在這裡添加搜尋歌曲的邏輯
// 例如:根據輸入框的內容搜尋歌曲 // 例如:根據輸入框的內容搜尋歌曲
@ -318,240 +299,5 @@ namespace DualScreenDemo
multiPagePanel.LoadSongs(searchResults); multiPagePanel.LoadSongs(searchResults);
} }
/// <summary>
/// 初始化注音輸入框 (RichTextBox),設定外觀、事件處理及位置大小
/// </summary>
private void InitializeInputBoxZhuYinSongs()
{
try
{
// 讀取輸入框的配置,例如字體、顏色、大小等
LoadInputBoxConfig();
// 建立注音輸入框並套用讀取到的設定
inputBoxZhuYinSongs = new RichTextBox
{
Name = "inputBoxZhuYinSongs",
ForeColor = inputBoxForeColor, // 設定文字顏色
Font = new Font(inputBoxFontName, inputBoxFontSize, inputBoxFontStyle), // 設定字體
ScrollBars = RichTextBoxScrollBars.None // 禁用滾動條
};
// 調整輸入框大小與位置
ResizeAndPositionControl(inputBoxZhuYinSongs, inputBoxZhuYinCoords.X, inputBoxZhuYinCoords.Y,
inputBoxZhuYinCoords.Width, inputBoxZhuYinCoords.Height);
// 將輸入框加入到 UI 控制項
this.Controls.Add(inputBoxZhuYinSongs);
}
catch (Exception ex)
{
Console.WriteLine("Error initializing inputBoxZhuYinSongs: " + ex.Message);
}
}
/// <summary>
/// 存儲 PictureBoxZhuYinSongs 的座標與尺寸信息。
/// </summary>
/// <remarks>
/// 此元組包含以下四個值:
/// XX 座標
/// , YY 座標
/// , Width寬度
/// , Height高度
/// </remarks>
private (int X, int Y, int Width, int Height) pictureBoxZhuYinSongCoords;
/// <summary>
/// 從設定檔 (config.ini) 讀取 PictureBoxZhuYinSongs 的座標與尺寸
/// </summary>
private void LoadPictureBoxZhuYinSongCoordsFromConfig()
{
// 建立 INI 檔案解析器
var parser = new FileIniDataParser();
// 讀取 config.ini 設定檔的內容
string iniPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "img.ini");
IniData data = parser.ReadFile(iniPath);
// 取得 "PictureBoxZhuYinSongs" 段落的設定數據
var coords = data["PictureBoxZhuYinSongs"];
// 解析座標與尺寸,並存入 pictureBoxZhuYinSongCoords
pictureBoxZhuYinSongCoords = (
int.Parse(coords["X"]), // 讀取 X 座標
int.Parse(coords["Y"]), // 讀取 Y 座標
int.Parse(coords["Width"]), // 讀取寬度
int.Parse(coords["Height"]) // 讀取高度
);
}
/// <summary>
/// 在 pictureBoxZhuYinSongs 上顯示指定路徑的圖片,並根據設定調整其大小與位置。
/// </summary>
/// <param name="imagePath">要顯示的圖片檔案路徑</param>
private void ShowImageOnPictureBoxZhuYinSongs(string imagePath)
{
// 從 config.ini 讀取 PictureBox 的座標與尺寸
LoadPictureBoxZhuYinSongCoordsFromConfig();
// 讀取圖片檔案並載入 Bitmap 物件
Bitmap originalImage = new Bitmap(imagePath);
// 設定圖片顯示區域,使用從設定檔讀取的座標與尺寸
Rectangle displayArea = new Rectangle(
pictureBoxZhuYinSongCoords.X,
pictureBoxZhuYinSongCoords.Y,
pictureBoxZhuYinSongCoords.Width,
pictureBoxZhuYinSongCoords.Height
);
// 設定 PictureBox 的圖片
pictureBoxZhuYinSongs.Image = originalImage;
// 調整 PictureBox 的大小與位置,使其符合設定
ResizeAndPositionPictureBox(
pictureBoxZhuYinSongs,
displayArea.X,
displayArea.Y,
displayArea.Width,
displayArea.Height
);
// 顯示 PictureBox
pictureBoxZhuYinSongs.Visible = true;
}
/// <summary>
/// 設定注音歌曲相關的 PictureBox、按鈕和輸入框的可見性。
/// </summary>
/// <param name="isVisible">若為 true則顯示這些控件否則隱藏。</param>
private void SetZhuYinSongsAndButtonsVisibility(bool isVisible)
{
// 定義要執行的操作,設定各控件的可見性
System.Action action = () =>
{
try
{
// 暫停佈局邏輯,防止在調整控件可見性時觸發不必要的佈局計算,提升性能
SuspendLayout();
// 檢查並設定 pictureBoxZhuYinSongs 的可見性
if (pictureBoxZhuYinSongs == null)
{
Console.WriteLine("pictureBoxZhuYinSongs is null");
}
else
{
pictureBoxZhuYinSongs.Visible = isVisible;
if (isVisible) pictureBoxZhuYinSongs.BringToFront();
}
// 檢查並設定 phoneticButtonsForSongs 陣列中每個按鈕的可見性
if (phoneticButtonsForSongs == null)
{
Console.WriteLine("phoneticButtonsForSongs is null");
}
else
{
foreach (var button in phoneticButtonsForSongs)
{
if (button == null)
{
Console.WriteLine("One of the phoneticButtonsForSongs is null");
}
else
{
button.Visible = isVisible;
if (isVisible) button.BringToFront();
}
}
}
// 檢查並設定 modifyButtonZhuYinSongs 的可見性
if (modifyButtonZhuYinSongs == null)
{
Console.WriteLine("modifyButtonZhuYinSongs is null");
}
else
{
modifyButtonZhuYinSongs.Visible = isVisible;
if (isVisible) modifyButtonZhuYinSongs.BringToFront();
}
// 檢查並設定 clearButtonZhuYinSongs 的可見性
if (clearButtonZhuYinSongs == null)
{
Console.WriteLine("clearButtonZhuYinSongs is null");
}
else
{
clearButtonZhuYinSongs.Visible = isVisible;
if (isVisible) clearButtonZhuYinSongs.BringToFront();
}
// 檢查並設定 closeButtonZhuYinSongs 的可見性
if (closeButtonZhuYinSongs == null)
{
Console.WriteLine("closeButtonZhuYinSongs is null");
}
else
{
closeButtonZhuYinSongs.Visible = isVisible;
if (isVisible) closeButtonZhuYinSongs.BringToFront();
}
// 檢查並設定 inputBoxZhuYinSongs 的可見性
if (inputBoxZhuYinSongs == null)
{
Console.WriteLine("inputBoxZhuYinSongs is null");
}
else
{
inputBoxZhuYinSongs.Visible = isVisible;
if (isVisible) inputBoxZhuYinSongs.BringToFront();
}
// 恢復佈局邏輯,允許佈局計算
ResumeLayout();
// 強制控件立即執行佈局邏輯,確保佈局更新立即生效
PerformLayout();
// 刷新各控件,確保其狀態立即更新
pictureBoxZhuYinSongs?.Refresh();
if (phoneticButtonsForSongs != null)
{
foreach (var button in phoneticButtonsForSongs)
{
button?.Refresh();
}
}
modifyButtonZhuYinSongs?.Refresh();
clearButtonZhuYinSongs?.Refresh();
closeButtonZhuYinSongs?.Refresh();
inputBoxZhuYinSongs?.Refresh();
}
catch (Exception ex)
{
// 捕捉並輸出異常資訊,方便除錯
Console.WriteLine("Error in SetZhuYinSongsAndButtonsVisibility: " + ex.Message);
}
};
// 如果當前執行緒需要呼叫 Invoke 方法才能修改控件,則使用 Invoke
if (this.InvokeRequired)
{
this.Invoke(action);
}
else
{
action();
}
}
} }
} }

View File

@ -98,13 +98,13 @@ namespace DualScreenDemo.Services
private Media addMediaOption(Media media, int audioTrackIndex) private Media addMediaOption(Media media, int audioTrackIndex)
{ {
media.AddOption(":avcodec-hw=dxva2"); media.AddOption(":avcodec-hw=dxva2");
media.AddOption(":drop-late-frames");
media.AddOption(":audio-output=directsound"); media.AddOption(":audio-output=directsound");
media.AddOption(":drop-late-frames");
media.AddOption(":network-caching=300"); media.AddOption(":network-caching=300");
media.AddOption(":live-caching=300"); media.AddOption(":live-caching=300");
media.AddOption(":file-caching=300"); media.AddOption(":file-caching=300");
media.AddOption(":clock-jitter=0"); // media.AddOption(":clock-jitter=0");
media.AddOption(":clock-synchro=0"); // media.AddOption(":clock-synchro=0");
media.AddOption($":audio-track={audioTrackIndex}"); media.AddOption($":audio-track={audioTrackIndex}");
return media; return media;
} }

87
img.ini
View File

@ -388,73 +388,6 @@ WordCountSongs = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名
WordCountSingers = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(字數按鍵)_背景.png WordCountSingers = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(字數按鍵)_背景.png
SongIDSearch = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢(編號按鍵)_背景.png SongIDSearch = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢(編號按鍵)_背景.png
[PictureBoxZhuYinSingers]
X = 390
Y = 354
Width = 808
Height = 356
[PictureBoxZhuYinSongs]
X = 390
Y = 350
Width = 808
Height = 356
[PhoneticSymbols]
Symbols=ㄅ,ㄉ,ㄍ,ㄐ,ㄓ,ㄗ,ㄛ,ㄡ,ㄤ,ㄧ,ㄆ,ㄊ,ㄎ,ㄑ,ㄔ,ㄘ,ㄜ,ㄢ,ㄦ,ㄨ,ㄇ,ㄋ,ㄏ,ㄒ,ㄕ,ㄙ,ㄞ,ㄣ,ㄩ,ㄈ,ㄌ, ,ㄖ,ㄚ,ㄠ
[PhoneticButtonCoordinates]
button0 = 341,418,71,66
button1 = 406,418,71,66
button2 = 484,418,71,66
button3 = 562,418,71,66
button4 = 640,418,71,66
button5 = 718,417,71,66
button6 = 795,418,71,66
button7 = 873,418,71,66
button8 = 951,418,71,66
button9 = 1030,418,71,66
button10 = 1109,418,71,66
button11 = 406,489,71,66
button12 = 484,489,71,66
button13 = 562,489,71,66
button14 = 640,489,71,66
button15 = 718,489,71,66
button16 = 795,489,71,66
button17 = 873,489,71,66
button18 = 951,489,71,66
button19 = 1030,489,71,66
button20 = 1109,489,71,66
button21 = 446,561,71,66
button22 = 524,561,71,66
button23 = 602,561,71,66
button24 = 680,561,71,66
button25 = 758,561,71,66
button26 = 836,561,71,66
button27 = 914,561,71,66
button28 = 992,561,71,66
button29 = 1070,561,71,66
button30 = 484,632,71,66
button31 = 562,632,71,66
button32 = 640,632,153,66
button33 = 800,632,71,66
button34 = 878,632,71,66
button35 = 956,632,71,66
[SpecialButtonCoordinates]
modifyButtonZhuYinSingers = 1034,632,71,66
clearButtonZhuYinSingers = 409,632,71,66
closeButtonZhuYinSingers = 1112,632,71,66
modifyButtonZhuYinSongs =1035,632,71,66
clearButtonZhuYinSongs = 408,632,71,66
closeButtonZhuYinSongs = 1114,632,71,66
[ModifyButtonImagesZhuYin] [ModifyButtonImagesZhuYin]
normal = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(拼音按鍵)_←.png normal = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(拼音按鍵)_←.png
@ -471,16 +404,7 @@ normal = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(
mouseOver = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(注音按鍵)_關閉.png mouseOver = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(注音按鍵)_關閉.png
mouseDown = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(注音按鍵)_關閉 複本.png mouseDown = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(注音按鍵)_關閉 複本.png
[InputBoxZhuYinSingers]
X = 408
Y = 361
Width = 444
Height = 47
FontName = 微軟正黑體
FontSize = 26
FontStyle = Regular
ForeColor = Black
[PhoneticButtonImages] [PhoneticButtonImages]
button0_normal = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(注音按鍵)_ㄅ.png button0_normal = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(注音按鍵)_ㄅ.png
@ -835,17 +759,6 @@ normal = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(
mouseOver = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(手寫按鍵)_關閉.png mouseOver = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(手寫按鍵)_關閉.png
mouseDown = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(手寫按鍵)_關閉 複本.png mouseDown = themes\superstar\button\4.查詢\3.歌星查詢按鍵\3.歌星查詢(手寫按鍵)_關閉 複本.png
[InputBoxZhuYinSongs]
X=150
Y=264
Width=596
Height=63
FontName=微軟正黑體
FontSize=26
FontStyle=Bold
ForeColor=Black
[NumberWordCountButtonImages] [NumberWordCountButtonImages]
button0_normal = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢(字數按鍵)_1.png button0_normal = themes\superstar\button\4.查詢\4.歌名查詢按鍵\4.歌名查詢(字數按鍵)_1.png