test #1
6
.gitignore
vendored
@ -3,5 +3,7 @@ Superstar.mdf
|
|||||||
Superstar_log.ldf
|
Superstar_log.ldf
|
||||||
.vs
|
.vs
|
||||||
build.bat
|
build.bat
|
||||||
DualScreenKTVPlayStation.exe
|
*.exe
|
||||||
themes/superstar/_www/
|
bin/logfile.txt
|
||||||
|
bin/secondary_graph.grf
|
||||||
|
bin/mainlog.txt
|
||||||
|
@ -1 +0,0 @@
|
|||||||
netsh http add urlacl url=http://192.168.11.7:9090/ user=Everyone
|
|
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 37 KiB |
@ -7,13 +7,19 @@ using System.Threading.Tasks;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using DBObj;
|
||||||
|
using OverlayFormObj;
|
||||||
namespace DualScreenDemo
|
namespace DualScreenDemo
|
||||||
{
|
{
|
||||||
public class CommandHandler
|
public class CommandHandler
|
||||||
{
|
{
|
||||||
public static bool readyForSongListInput = false;
|
public static bool readyForSongListInput = false;
|
||||||
|
private readonly int _maxHistoryLength = 6; // 最多保留 6 筆
|
||||||
|
private readonly Queue<string> _indataHistory = new Queue<string>();
|
||||||
|
|
||||||
|
private int _wrongInputCountfor62 = 0; // 錯誤輸入計數器
|
||||||
|
private int _wrongInputCountfor61 = 0; // 錯誤輸入計數器
|
||||||
|
private const int MaxWrongLimit = 3; // 錯誤輸入限制次數
|
||||||
private readonly SongListManager songListManager;
|
private readonly SongListManager songListManager;
|
||||||
|
|
||||||
public CommandHandler(SongListManager songListManager)
|
public CommandHandler(SongListManager songListManager)
|
||||||
@ -21,15 +27,10 @@ namespace DualScreenDemo
|
|||||||
this.songListManager = songListManager;
|
this.songListManager = songListManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//關機錨點
|
||||||
public async Task ProcessData(string indata)
|
public async Task ProcessData(string indata)
|
||||||
{
|
{
|
||||||
string filePath = Path.Combine(Application.StartupPath, "dataLog.txt");
|
AddToHistory(indata);
|
||||||
if (CheckLogForShutdown(filePath))
|
|
||||||
{
|
|
||||||
Console.WriteLine("Shutdown condition met. Application will now close.");
|
|
||||||
ShutdownComputer();
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (indata)
|
switch (indata)
|
||||||
{
|
{
|
||||||
case "A261A4":
|
case "A261A4":
|
||||||
@ -40,6 +41,9 @@ namespace DualScreenDemo
|
|||||||
break;
|
break;
|
||||||
case "A263A4":
|
case "A263A4":
|
||||||
ClearDisplay();
|
ClearDisplay();
|
||||||
|
_wrongInputCountfor62 = 0; // 重置計數器
|
||||||
|
_wrongInputCountfor61 = 0; // 重置計數器
|
||||||
|
_indataHistory.Clear(); // 清空歷史紀錄
|
||||||
break;
|
break;
|
||||||
case "A268A4":
|
case "A268A4":
|
||||||
OverlayForm.MainForm.currentPage = 1;
|
OverlayForm.MainForm.currentPage = 1;
|
||||||
@ -186,6 +190,28 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void AddToHistory(string indata)
|
||||||
|
{
|
||||||
|
if (_indataHistory.Count >= _maxHistoryLength)
|
||||||
|
{
|
||||||
|
_indataHistory.Dequeue(); // 移除最舊的項目
|
||||||
|
}
|
||||||
|
_indataHistory.Enqueue(indata); // 添加新的項目
|
||||||
|
CheckSequenceforClose(); // 每次更新完 queue 後檢查
|
||||||
|
}
|
||||||
|
private void CheckSequenceforClose()
|
||||||
|
{
|
||||||
|
string[] targetSequence = { "A262A4", "A262A4", "A262A4", "A261A4", "A261A4", "A261A4" };
|
||||||
|
|
||||||
|
if (_indataHistory.Count == targetSequence.Length &&
|
||||||
|
_indataHistory.SequenceEqual(targetSequence))
|
||||||
|
{
|
||||||
|
Console.WriteLine("Shutdown condition met. Application will now close.");
|
||||||
|
ShutdownComputer();
|
||||||
|
// 你可以呼叫其他方法、觸發事件、改狀態等等
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void InvokeAction(Action action)
|
void InvokeAction(Action action)
|
||||||
{
|
{
|
||||||
if (OverlayForm.MainForm.InvokeRequired)
|
if (OverlayForm.MainForm.InvokeRequired)
|
||||||
@ -316,7 +342,18 @@ namespace DualScreenDemo
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
ClearDisplay();
|
ClearDisplay();
|
||||||
OverlayForm.MainForm.displayLabel.Text = "輸入錯誤!!!";
|
_wrongInputCountfor61++;
|
||||||
|
if(_wrongInputCountfor61 <= MaxWrongLimit)
|
||||||
|
{
|
||||||
|
string old ="";
|
||||||
|
OverlayForm.MainForm.displayLabel.Text = check_control(old);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OverlayForm.MainForm.displayLabel.Text = "輸入錯誤!!!";
|
||||||
|
_indataHistory.Clear(); // 清空歷史紀錄
|
||||||
|
_wrongInputCountfor61 = 0; // 重置計數器
|
||||||
|
}
|
||||||
OverlayForm.MainForm.nextSongLabel.Visible = false;
|
OverlayForm.MainForm.nextSongLabel.Visible = false;
|
||||||
OverlayForm.displayTimer.Start();
|
OverlayForm.displayTimer.Start();
|
||||||
}
|
}
|
||||||
@ -335,7 +372,18 @@ namespace DualScreenDemo
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
ClearDisplay();
|
ClearDisplay();
|
||||||
OverlayForm.MainForm.displayLabel.Text = "輸入錯誤!!!";
|
_wrongInputCountfor61++;
|
||||||
|
if(_wrongInputCountfor61 <= MaxWrongLimit)
|
||||||
|
{
|
||||||
|
string old ="";
|
||||||
|
OverlayForm.MainForm.displayLabel.Text = check_control(old);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OverlayForm.MainForm.displayLabel.Text = "輸入錯誤!!!";
|
||||||
|
_indataHistory.Clear(); // 清空歷史紀錄
|
||||||
|
_wrongInputCountfor61 = 0; // 重置計數器
|
||||||
|
}
|
||||||
OverlayForm.MainForm.nextSongLabel.Visible = false;
|
OverlayForm.MainForm.nextSongLabel.Visible = false;
|
||||||
OverlayForm.displayTimer.Start();
|
OverlayForm.displayTimer.Start();
|
||||||
}
|
}
|
||||||
@ -343,6 +391,16 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private string check_control(string old){
|
||||||
|
foreach(string item in _indataHistory)
|
||||||
|
{
|
||||||
|
if(item == "A261A4")
|
||||||
|
old += "#";
|
||||||
|
else if(item == "A262A4")
|
||||||
|
old += "*";
|
||||||
|
}
|
||||||
|
return old;
|
||||||
|
}
|
||||||
|
|
||||||
private void HandleInputB()
|
private void HandleInputB()
|
||||||
{
|
{
|
||||||
@ -388,7 +446,18 @@ namespace DualScreenDemo
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
ClearDisplay();
|
ClearDisplay();
|
||||||
OverlayForm.MainForm.displayLabel.Text = "輸入錯誤!!!";
|
_wrongInputCountfor62++;
|
||||||
|
if(_wrongInputCountfor62 <= MaxWrongLimit)
|
||||||
|
{
|
||||||
|
string old ="";
|
||||||
|
OverlayForm.MainForm.displayLabel.Text = check_control(old);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OverlayForm.MainForm.displayLabel.Text = "輸入錯誤!!!";
|
||||||
|
_indataHistory.Clear(); // 清空歷史紀錄
|
||||||
|
_wrongInputCountfor62 = 0; // 重置計數器
|
||||||
|
}
|
||||||
OverlayForm.MainForm.nextSongLabel.Visible = false;
|
OverlayForm.MainForm.nextSongLabel.Visible = false;
|
||||||
OverlayForm.displayTimer.Start();
|
OverlayForm.displayTimer.Start();
|
||||||
}
|
}
|
||||||
@ -405,7 +474,18 @@ namespace DualScreenDemo
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
ClearDisplay();
|
ClearDisplay();
|
||||||
OverlayForm.MainForm.displayLabel.Text = "輸入錯誤!!!";
|
_wrongInputCountfor62++;
|
||||||
|
if(_wrongInputCountfor62 <= MaxWrongLimit)
|
||||||
|
{
|
||||||
|
string old ="";
|
||||||
|
OverlayForm.MainForm.displayLabel.Text = check_control(old);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OverlayForm.MainForm.displayLabel.Text = "輸入錯誤!!!";
|
||||||
|
_indataHistory.Clear(); // 清空歷史紀錄
|
||||||
|
_wrongInputCountfor62 = 0; // 重置計數器
|
||||||
|
}
|
||||||
OverlayForm.MainForm.nextSongLabel.Visible = false;
|
OverlayForm.MainForm.nextSongLabel.Visible = false;
|
||||||
OverlayForm.displayTimer.Start();
|
OverlayForm.displayTimer.Start();
|
||||||
}
|
}
|
||||||
@ -415,7 +495,6 @@ namespace DualScreenDemo
|
|||||||
|
|
||||||
private static void ClearDisplay()
|
private static void ClearDisplay()
|
||||||
{
|
{
|
||||||
|
|
||||||
OverlayForm.displayTimer.Stop();
|
OverlayForm.displayTimer.Stop();
|
||||||
|
|
||||||
|
|
||||||
@ -893,20 +972,6 @@ private static void DisplaySongHistory()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool CheckLogForShutdown(string filePath)
|
|
||||||
{
|
|
||||||
if (File.Exists(filePath))
|
|
||||||
{
|
|
||||||
|
|
||||||
string content = File.ReadAllText(filePath).Replace(Environment.NewLine, "");
|
|
||||||
if (content.Length >= 6 && content.Substring(content.Length - 6) == "bbbaaa")
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void ShutdownComputer()
|
public static void ShutdownComputer()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
namespace DualScreenDemo
|
namespace DBObj
|
||||||
{
|
{
|
||||||
// artist OOP test
|
// artist OOP test
|
||||||
public class Artist
|
public class Artist
|
@ -4,11 +4,11 @@ using System.Data.SQLite;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
using DualScreenDemo;
|
||||||
namespace DualScreenDemo
|
namespace DBObj
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
重資料庫取資料回來
|
從資料庫取資料回來
|
||||||
*/
|
*/
|
||||||
public class ArtistManager
|
public class ArtistManager
|
||||||
{
|
{
|
@ -1,6 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace DualScreenDemo
|
namespace DBObj
|
||||||
{
|
{
|
||||||
public class SongData
|
public class SongData
|
||||||
{
|
{
|
@ -6,8 +6,8 @@ using System.Linq;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using DualScreenDemo;
|
||||||
namespace DualScreenDemo
|
namespace DBObj
|
||||||
{
|
{
|
||||||
public class SongListManager
|
public class SongListManager
|
||||||
{
|
{
|
||||||
@ -262,25 +262,15 @@ namespace DualScreenDemo
|
|||||||
string artistB = reader["歌星 B"].ToString();
|
string artistB = reader["歌星 B"].ToString();
|
||||||
string artistACategory = reader["歌星A分類"].ToString();
|
string artistACategory = reader["歌星A分類"].ToString();
|
||||||
string artistBCategory = reader["歌星B分類"].ToString();
|
string artistBCategory = reader["歌星B分類"].ToString();
|
||||||
string dateValue = reader["新增日期"].ToString();
|
string dateValue = reader["新增日期"]?.ToString() ?? "";
|
||||||
DateTime addedTime;
|
DateTime addedTime;
|
||||||
|
try
|
||||||
if (string.IsNullOrWhiteSpace(dateValue))
|
|
||||||
{
|
{
|
||||||
// Console.WriteLine(String.Format("Date value is null or empty for song: {0}. Setting to default DateTime.", song));
|
addedTime=DateTime.Parse(dateValue, CultureInfo.InvariantCulture).Date ;
|
||||||
addedTime = DateTime.Now;
|
|
||||||
}
|
}
|
||||||
else
|
catch (System.FormatException)
|
||||||
{
|
{
|
||||||
try
|
addedTime = DateTime.Today;
|
||||||
{
|
|
||||||
addedTime = DateTime.ParseExact(dateValue, "yyyy-MM-dd", CultureInfo.InvariantCulture);
|
|
||||||
}
|
|
||||||
catch (System.FormatException ex)
|
|
||||||
{
|
|
||||||
// Console.WriteLine(String.Format("Invalid date format for song: {0}. Error: {1}", song, ex.Message));
|
|
||||||
addedTime = DateTime.Now;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
string basePathHost1 = reader["路徑 1"].ToString();
|
string basePathHost1 = reader["路徑 1"].ToString();
|
||||||
string basePathHost2 = reader["路徑 2"].ToString();
|
string basePathHost2 = reader["路徑 2"].ToString();
|
||||||
@ -373,7 +363,7 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
catch (System.FormatException)
|
catch (System.FormatException)
|
||||||
{
|
{
|
||||||
addedTime = DateTime.Now;
|
addedTime = DateTime.Today;
|
||||||
}
|
}
|
||||||
|
|
||||||
string basePathHost1 = reader["路徑 1"].ToString();
|
string basePathHost1 = reader["路徑 1"].ToString();
|
@ -17,6 +17,8 @@ using SystemAction = System.Action;
|
|||||||
using ZXingAction = ZXing.Action;
|
using ZXingAction = ZXing.Action;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
|
using DBObj;
|
||||||
|
using OverlayFormObj;
|
||||||
namespace DualScreenDemo
|
namespace DualScreenDemo
|
||||||
{
|
{
|
||||||
public class HttpServer
|
public class HttpServer
|
||||||
@ -29,7 +31,7 @@ namespace DualScreenDemo
|
|||||||
public static event ActionString OnDisplayBarrage;
|
public static event ActionString OnDisplayBarrage;
|
||||||
private static DateTime lastClickTime = DateTime.MinValue;
|
private static DateTime lastClickTime = DateTime.MinValue;
|
||||||
public static string randomFolderPath; // 声明全局变量
|
public static string randomFolderPath; // 声明全局变量
|
||||||
private static OverlayForm form;
|
//private static OverlayForm form;
|
||||||
private static readonly ConcurrentDictionary<string, byte[]> _fileCache = new ConcurrentDictionary<string, byte[]>();
|
private static readonly ConcurrentDictionary<string, byte[]> _fileCache = new ConcurrentDictionary<string, byte[]>();
|
||||||
private static readonly SemaphoreSlim _requestThrottle = new SemaphoreSlim(20); // 限制并发请求数
|
private static readonly SemaphoreSlim _requestThrottle = new SemaphoreSlim(20); // 限制并发请求数
|
||||||
private static readonly CancellationTokenSource _serverCts = new CancellationTokenSource();
|
private static readonly CancellationTokenSource _serverCts = new CancellationTokenSource();
|
||||||
@ -45,28 +47,40 @@ namespace DualScreenDemo
|
|||||||
string localAddress = GetLocalIPAddress(); // 使用获取的本地 IP
|
string localAddress = GetLocalIPAddress(); // 使用获取的本地 IP
|
||||||
string externalAddress = "";
|
string externalAddress = "";
|
||||||
|
|
||||||
// 读取外网地址
|
// 讀取外網地址 沒有端口號
|
||||||
string serverAddressFilePath = @"\\SVR01\superstarb\txt\ip.txt";
|
string serverAddressFilePath = @"\\SVR01\superstarb\txt\ip.txt";
|
||||||
if (File.Exists(serverAddressFilePath))
|
if (File.Exists(serverAddressFilePath))
|
||||||
{
|
{
|
||||||
externalAddress = File.ReadAllText(serverAddressFilePath).Trim();
|
externalAddress = File.ReadAllText(serverAddressFilePath).Trim();
|
||||||
|
Console.WriteLine("External address: " + externalAddress);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
// 启动服务器的逻辑
|
{
|
||||||
|
Console.WriteLine("Warning: External address file not found. Using local address only.");
|
||||||
|
}
|
||||||
|
// 創建一個 HttpListener 來監聽 HTTP 請求
|
||||||
HttpListener listener = new HttpListener();
|
HttpListener listener = new HttpListener();
|
||||||
|
|
||||||
// 添加本地地址前缀
|
// 構造本地地址的 URL 前綴(包含協議、地址和端口)
|
||||||
string localPrefix = String.Format("http://{0}:{1}/", localAddress, port);
|
string localPrefix = String.Format("http://{0}:{1}/", localAddress, port);
|
||||||
|
|
||||||
|
// 在控制台輸出添加的本地前綴,方便調試
|
||||||
Console.WriteLine("Adding local prefix: " + localPrefix);
|
Console.WriteLine("Adding local prefix: " + localPrefix);
|
||||||
|
|
||||||
|
// 將本地前綴添加到 HttpListener,使其監聽該 URL
|
||||||
listener.Prefixes.Add(localPrefix);
|
listener.Prefixes.Add(localPrefix);
|
||||||
|
string hostName = System.Net.Dns.GetHostName();
|
||||||
|
string externalPort = '1' + hostName.Substring(Math.Max(2, hostName.Length - 20));
|
||||||
|
|
||||||
// 如果有外网地址,也添加外网地址前缀
|
// 如果有外网地址,也添加外网地址前缀
|
||||||
if (!string.IsNullOrEmpty(externalAddress))
|
if (!string.IsNullOrEmpty(externalAddress))
|
||||||
{
|
{
|
||||||
// 解析外网地址和端口
|
// 錨點 2
|
||||||
|
// 外網 IP 和 port 調整
|
||||||
string[] parts = externalAddress.Split(':');
|
string[] parts = externalAddress.Split(':');
|
||||||
string host = parts[0];
|
string host = parts[0];
|
||||||
int externalPort = parts.Length > 1 ? int.Parse(parts[1]) : port;
|
|
||||||
|
//int externalPort = parts.Length > 1 ? int.Parse(parts[1]) : port;
|
||||||
|
|
||||||
string externalPrefix = String.Format("http://{0}:{1}/", host, externalPort);
|
string externalPrefix = String.Format("http://{0}:{1}/", host, externalPort);
|
||||||
Console.WriteLine("Adding external prefix: " + externalPrefix);
|
Console.WriteLine("Adding external prefix: " + externalPrefix);
|
||||||
@ -83,12 +97,16 @@ namespace DualScreenDemo
|
|||||||
|
|
||||||
// 生成两个二维码内容
|
// 生成两个二维码内容
|
||||||
string localQrContent = String.Format("http://{0}:{1}/{2}/windows.html", localAddress, port, randomFolderName);
|
string localQrContent = String.Format("http://{0}:{1}/{2}/windows.html", localAddress, port, randomFolderName);
|
||||||
|
// string localQrContent = String.Format("http://{0}:{1}/{2}/windows.html", "ss.net.dnsnet.cc", 1102, randomFolderName);
|
||||||
|
|
||||||
// 修改外网二维码内容生成
|
// 修改外网二维码内容生成
|
||||||
|
|
||||||
string externalQrContent = !string.IsNullOrEmpty(externalAddress) ?
|
string externalQrContent = !string.IsNullOrEmpty(externalAddress) ?
|
||||||
String.Format("http://{0}/{1}/windows.html", externalAddress, randomFolderName) :
|
String.Format("http://{0}:{1}/{2}/windows.html", externalAddress, externalPort, randomFolderName) :
|
||||||
localQrContent;
|
localQrContent;
|
||||||
|
|
||||||
|
Console.WriteLine("local QR Content : " + localQrContent);
|
||||||
|
Console.WriteLine("external QR Content : " + externalQrContent);
|
||||||
// 生成二维码(这里使用外网地址的二维码,因为通常外网地址更有用)
|
// 生成二维码(这里使用外网地址的二维码,因为通常外网地址更有用)
|
||||||
string qrImagePath = GenerateQRCode(externalQrContent, Path.Combine(baseDirectory, randomFolderName, "qrcode.png"));
|
string qrImagePath = GenerateQRCode(externalQrContent, Path.Combine(baseDirectory, randomFolderName, "qrcode.png"));
|
||||||
|
|
||||||
@ -167,7 +185,11 @@ namespace DualScreenDemo
|
|||||||
return String.Format("http://{0}:{1}/", _localIP, _port);
|
return String.Format("http://{0}:{1}/", _localIP, _port);
|
||||||
// return String.Format("http://111.246.145.170:8080/");
|
// return String.Format("http://111.246.145.170:8080/");
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 生成隨機路徑
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="baseDirectory"></param>
|
||||||
|
/// <returns></returns>
|
||||||
private static string CreateRandomFolderAndRedirectHTML(string baseDirectory)
|
private static string CreateRandomFolderAndRedirectHTML(string baseDirectory)
|
||||||
{
|
{
|
||||||
string randomFolderName = Path.GetRandomFileName().Replace(".", "");
|
string randomFolderName = Path.GetRandomFileName().Replace(".", "");
|
||||||
@ -961,16 +983,16 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (JsonException ex)
|
//catch (JsonException ex)
|
||||||
{
|
//{
|
||||||
context.Response.StatusCode = 400;
|
// context.Response.StatusCode = 400;
|
||||||
Console.WriteLine("解析留言数据时出错");
|
// Console.WriteLine("解析留言数据时出错");
|
||||||
}
|
//}
|
||||||
catch (Exception ex)
|
//catch (Exception ex)
|
||||||
{
|
//{
|
||||||
context.Response.StatusCode = 500;
|
// context.Response.StatusCode = 500;
|
||||||
Console.WriteLine("服务器内部错误");
|
// Console.WriteLine("服务器内部错误");
|
||||||
}
|
//}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
context.Response.Close();
|
context.Response.Close();
|
||||||
|
@ -6,13 +6,13 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
public static class HttpServerManager
|
public static class HttpServerManager
|
||||||
{
|
{
|
||||||
public static void StartServer()
|
public static async void StartServer()
|
||||||
{
|
{
|
||||||
int httpPort = 9090; // 你可以修改此端口
|
int httpPort = 9090; // 你可以修改此端口
|
||||||
string baseDirectory = Path.Combine(Application.StartupPath, @"themes\superstar\_www");
|
string baseDirectory = Path.Combine(Application.StartupPath, @"themes\superstar\_www");
|
||||||
|
|
||||||
CleanUpDirectory(baseDirectory);
|
CleanUpDirectory(baseDirectory);
|
||||||
HttpServer.StartServer(baseDirectory, httpPort, Program.songListManager);
|
await HttpServer.StartServer(baseDirectory, httpPort, Program.songListManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,8 +3,8 @@ using System.Collections.Generic;
|
|||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
using DualScreenDemo;
|
||||||
namespace DualScreenDemo
|
namespace OverlayFormObj
|
||||||
{
|
{
|
||||||
public partial class OverlayForm
|
public partial class OverlayForm
|
||||||
{
|
{
|
@ -7,8 +7,9 @@ using System;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using DBObj;
|
||||||
namespace DualScreenDemo
|
using DualScreenDemo;
|
||||||
|
namespace OverlayFormObj
|
||||||
{
|
{
|
||||||
public partial class OverlayForm
|
public partial class OverlayForm
|
||||||
{
|
{
|
||||||
@ -268,12 +269,12 @@ namespace DualScreenDemo
|
|||||||
this.Controls.Add(displayLabel);
|
this.Controls.Add(displayLabel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// 播放暫停,字體大小
|
||||||
private void InitializePauseLabel()
|
private void InitializePauseLabel()
|
||||||
{
|
{
|
||||||
pauseLabel = new Label();
|
pauseLabel = new Label();
|
||||||
pauseLabel.AutoSize = false;
|
pauseLabel.AutoSize = false;
|
||||||
pauseLabel.Font = new Font("Microsoft JhengHei", 125, FontStyle.Bold);
|
pauseLabel.Font = new Font("Microsoft JhengHei", 75, FontStyle.Bold);
|
||||||
pauseLabel.BackColor = Color.Transparent;
|
pauseLabel.BackColor = Color.Transparent;
|
||||||
pauseLabel.TextAlign = ContentAlignment.MiddleCenter;
|
pauseLabel.TextAlign = ContentAlignment.MiddleCenter;
|
||||||
pauseLabel.Size = new Size(1080, 200);
|
pauseLabel.Size = new Size(1080, 200);
|
||||||
@ -317,13 +318,13 @@ namespace DualScreenDemo
|
|||||||
this.Controls.Add(pauseLabel);
|
this.Controls.Add(pauseLabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 播放靜音,字體大小
|
||||||
private void InitializeMuteLabel()
|
private void InitializeMuteLabel()
|
||||||
{
|
{
|
||||||
muteLabel = new Label();
|
muteLabel = new Label();
|
||||||
muteLabel.AutoSize = false;
|
muteLabel.AutoSize = false;
|
||||||
muteLabel.Visible = false;
|
muteLabel.Visible = false;
|
||||||
muteLabel.Font = new Font("Microsoft JhengHei", 125, FontStyle.Bold);
|
muteLabel.Font = new Font("Microsoft JhengHei", 75, FontStyle.Bold);
|
||||||
muteLabel.BackColor = Color.Transparent;
|
muteLabel.BackColor = Color.Transparent;
|
||||||
muteLabel.TextAlign = ContentAlignment.MiddleCenter;
|
muteLabel.TextAlign = ContentAlignment.MiddleCenter;
|
||||||
muteLabel.Size = new Size(1080, 200);
|
muteLabel.Size = new Size(1080, 200);
|
@ -12,8 +12,9 @@ using Newtonsoft.Json;
|
|||||||
using ZXing;
|
using ZXing;
|
||||||
using ZXing.QrCode;
|
using ZXing.QrCode;
|
||||||
using System.Timers;
|
using System.Timers;
|
||||||
|
using DBObj;
|
||||||
namespace DualScreenDemo
|
using DualScreenDemo;
|
||||||
|
namespace OverlayFormObj
|
||||||
{
|
{
|
||||||
public partial class OverlayForm : Form
|
public partial class OverlayForm : Form
|
||||||
{
|
{
|
||||||
@ -80,10 +81,10 @@ namespace DualScreenDemo
|
|||||||
MainForm = this;
|
MainForm = this;
|
||||||
InitializeFormSettings();
|
InitializeFormSettings();
|
||||||
ConfigureTimers();
|
ConfigureTimers();
|
||||||
LoadBackgroundImage();
|
|
||||||
ConfigureImageDisplay();
|
|
||||||
InitializeLabels();
|
InitializeLabels();
|
||||||
ConfigureSegmentTimer();
|
ConfigureSegmentTimer();
|
||||||
|
imageYPos = (screenHeight / 3) - 1024 / 6;
|
||||||
}
|
}
|
||||||
private void ConfigureSegmentTimer()
|
private void ConfigureSegmentTimer()
|
||||||
{
|
{
|
||||||
@ -415,8 +416,7 @@ private Rectangle FindContentBounds(Bitmap bmp)
|
|||||||
firstStickerImage = null;
|
firstStickerImage = null;
|
||||||
this.Invalidate();
|
this.Invalidate();
|
||||||
}
|
}
|
||||||
if (secondStickerImage == null)
|
|
||||||
LoadBackgroundImage();
|
|
||||||
stickerTimer1.Stop();
|
stickerTimer1.Stop();
|
||||||
HideImages();
|
HideImages();
|
||||||
};
|
};
|
||||||
@ -428,8 +428,6 @@ private Rectangle FindContentBounds(Bitmap bmp)
|
|||||||
secondStickerImage = null;
|
secondStickerImage = null;
|
||||||
this.Invalidate();
|
this.Invalidate();
|
||||||
}
|
}
|
||||||
if (firstStickerImage == null)
|
|
||||||
LoadBackgroundImage();
|
|
||||||
stickerTimer2.Stop();
|
stickerTimer2.Stop();
|
||||||
HideImages();
|
HideImages();
|
||||||
};
|
};
|
||||||
@ -479,7 +477,7 @@ private static void SongDisplayTimer_Elapsed(object sender, EventArgs e)
|
|||||||
|
|
||||||
private readonly object _lockObject = new object();
|
private readonly object _lockObject = new object();
|
||||||
|
|
||||||
private void UnifiedTimer_Elapsed(object sender, EventArgs e)
|
private async void UnifiedTimer_Elapsed(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
// Console.WriteLine("UnifiedTimer_Elapsed called");
|
// Console.WriteLine("UnifiedTimer_Elapsed called");
|
||||||
|
|
||||||
@ -496,28 +494,28 @@ private static void SongDisplayTimer_Elapsed(object sender, EventArgs e)
|
|||||||
case UIState.SelectingLanguage:
|
case UIState.SelectingLanguage:
|
||||||
|
|
||||||
SetUIState(UIState.Initial);
|
SetUIState(UIState.Initial);
|
||||||
HandleTimeout("");
|
await HandleTimeout("");
|
||||||
break;
|
break;
|
||||||
case UIState.SelectingArtistCategory:
|
case UIState.SelectingArtistCategory:
|
||||||
SetUIState(UIState.Initial);
|
SetUIState(UIState.Initial);
|
||||||
HandleTimeout("");
|
await HandleTimeout("");
|
||||||
break;
|
break;
|
||||||
case UIState.SelectingAction:
|
case UIState.SelectingAction:
|
||||||
SetUIState(UIState.Initial);
|
SetUIState(UIState.Initial);
|
||||||
HandleTimeout("");
|
await HandleTimeout("");
|
||||||
break;
|
break;
|
||||||
case UIState.SelectingSong:
|
case UIState.SelectingSong:
|
||||||
|
|
||||||
SetUIState(UIState.Initial);
|
SetUIState(UIState.Initial);
|
||||||
HandleTimeout("");
|
await HandleTimeout("");
|
||||||
break;
|
break;
|
||||||
case UIState.SelectingArtist:
|
case UIState.SelectingArtist:
|
||||||
SetUIState(UIState.Initial);
|
SetUIState(UIState.Initial);
|
||||||
HandleTimeout("");
|
await HandleTimeout("");
|
||||||
break;
|
break;
|
||||||
case UIState.PlayHistory:
|
case UIState.PlayHistory:
|
||||||
SetUIState(UIState.Initial);
|
SetUIState(UIState.Initial);
|
||||||
HandleTimeout("");
|
await HandleTimeout("");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -539,40 +537,6 @@ private static void SongDisplayTimer_Elapsed(object sender, EventArgs e)
|
|||||||
unifiedTimer.Start();
|
unifiedTimer.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LoadBackgroundImage()
|
|
||||||
{
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// backgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, "themes\\superstar\\images.jpg"));
|
|
||||||
// }
|
|
||||||
// catch (Exception ex)
|
|
||||||
// {
|
|
||||||
// Console.WriteLine("Error loading background image: " + ex.Message);
|
|
||||||
// backgroundImage = null;
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureImageDisplay()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
firstStickerImage = Image.FromFile(Path.Combine(Application.StartupPath, "superstar-pic/1-1.png"));
|
|
||||||
firstStickerXPos = this.Width / 2;
|
|
||||||
imageYPos = (screenHeight / 3) - firstStickerImage.Height / 6;
|
|
||||||
|
|
||||||
|
|
||||||
LoadBackgroundImage();
|
|
||||||
|
|
||||||
|
|
||||||
stickerTimer1.Start();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Error loading initial sticker image: " + ex.Message);
|
|
||||||
firstStickerImage = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void HideImages()
|
private void HideImages()
|
||||||
{
|
{
|
||||||
bool anyStickersActive = false;
|
bool anyStickersActive = false;
|
||||||
@ -799,7 +763,7 @@ private static void SongDisplayTimer_Elapsed(object sender, EventArgs e)
|
|||||||
Console.WriteLine("Form Height: " + this.Height);
|
Console.WriteLine("Form Height: " + this.Height);
|
||||||
|
|
||||||
|
|
||||||
string imagePath = String.Format("{0}\\superstar-pic\\{1}.png", Application.StartupPath, stickerId);
|
string imagePath = String.Format("{0}\\themes\\superstar\\superstar-pic\\{1}.png", Application.StartupPath, stickerId);
|
||||||
Console.WriteLine("Image path: " + imagePath);
|
Console.WriteLine("Image path: " + imagePath);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -810,7 +774,6 @@ private static void SongDisplayTimer_Elapsed(object sender, EventArgs e)
|
|||||||
{
|
{
|
||||||
firstStickerImage = newSticker;
|
firstStickerImage = newSticker;
|
||||||
firstStickerXPos = this.Width / 2 - firstStickerImage.Width / 2;
|
firstStickerXPos = this.Width / 2 - firstStickerImage.Width / 2;
|
||||||
LoadBackgroundImage();
|
|
||||||
stickerTimer1.Start();
|
stickerTimer1.Start();
|
||||||
}
|
}
|
||||||
else if (secondStickerImage == null)
|
else if (secondStickerImage == null)
|
||||||
@ -1313,7 +1276,7 @@ public void UpdateHistoryLabel(List<SongData> historySongs, List<PlayState> play
|
|||||||
int mainTitleFontSize = 60;
|
int mainTitleFontSize = 60;
|
||||||
int optionFontSize = 50;
|
int optionFontSize = 50;
|
||||||
int lineSpacing = 15;
|
int lineSpacing = 15;
|
||||||
int columnSpacing = 400;
|
//int columnSpacing = 400;
|
||||||
|
|
||||||
// 主標題
|
// 主標題
|
||||||
string mainTitle = messages[0];
|
string mainTitle = messages[0];
|
||||||
@ -1615,254 +1578,299 @@ private void DisplaySongsInLanguage(string language, Category category)
|
|||||||
public int totalSongs = 0;
|
public int totalSongs = 0;
|
||||||
|
|
||||||
|
|
||||||
public void DisplaySongs(int page)
|
public void DisplaySongs(int page)
|
||||||
{
|
{
|
||||||
if (LanguageSongList == null || LanguageSongList.Count == 0)
|
// 檢查 LanguageSongList 是否為空,避免發生錯誤
|
||||||
{
|
if (LanguageSongList == null || LanguageSongList.Count == 0)
|
||||||
Console.WriteLine("LanguageSongList is null or empty.");
|
{
|
||||||
return;
|
Console.WriteLine("LanguageSongList is null or empty.");
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.Controls.OfType<PictureBox>().ToList().ForEach(p => this.Controls.Remove(p));
|
// 清除介面上所有 PictureBox 控件,避免重複顯示舊的內容
|
||||||
|
this.Controls.OfType<PictureBox>().ToList().ForEach(p => this.Controls.Remove(p));
|
||||||
|
|
||||||
int songsPerColumn = 5;
|
// 每列顯示 5 首歌
|
||||||
int startIndex = (page - 1) * songsPerPage;
|
int songsPerColumn = 5;
|
||||||
int endIndex = Math.Min(startIndex + songsPerPage, LanguageSongList.Count);
|
|
||||||
|
|
||||||
int totalPages = (int)Math.Ceiling((double)LanguageSongList.Count / songsPerPage);
|
// 計算當前頁面的起始與結束索引
|
||||||
|
int startIndex = (page - 1) * songsPerPage;
|
||||||
|
int endIndex = Math.Min(startIndex + songsPerPage, LanguageSongList.Count);
|
||||||
|
|
||||||
string categoryText = OverlayForm.CurrentCategory switch
|
// 計算總頁數
|
||||||
{
|
int totalPages = (int)Math.Ceiling((double)LanguageSongList.Count / songsPerPage);
|
||||||
OverlayForm.Category.NewSongs => "新歌",
|
|
||||||
OverlayForm.Category.HotSongs => "熱門",
|
|
||||||
_ => ""
|
|
||||||
};
|
|
||||||
string headerText = $"{currentLanguage} - {categoryText} ({page} / {totalPages})";
|
|
||||||
Font headerFont = new Font("Microsoft JhengHei", 60, FontStyle.Bold);
|
|
||||||
Bitmap headerBitmap = GenerateTextImage(headerText, headerFont, Color.White, Color.Transparent);
|
|
||||||
AddCenteredPicture(headerBitmap, 150);
|
|
||||||
|
|
||||||
int startY = 250;
|
// 根據當前分類選擇標題文字
|
||||||
int leftColumnX = 100;
|
string categoryText = OverlayForm.CurrentCategory switch
|
||||||
int rightColumnX = this.Width / 2 + 100;
|
{
|
||||||
|
OverlayForm.Category.NewSongs => "新歌",
|
||||||
|
OverlayForm.Category.HotSongs => "熱門",
|
||||||
|
_ => ""
|
||||||
|
};
|
||||||
|
|
||||||
// 計算當前頁面最大歌名和歌手文字長度
|
// 設定標題格式,包含語言、分類與當前頁碼
|
||||||
int maxSongLength = 0;
|
string headerText = $"{currentLanguage} - {categoryText} ({page} / {totalPages})";
|
||||||
int maxArtistLength = 0;
|
|
||||||
for (int i = startIndex; i < endIndex; i++)
|
|
||||||
{
|
|
||||||
string songText = $"{i - startIndex + 1}. {LanguageSongList[i].Song}";
|
|
||||||
string artistText = !string.IsNullOrWhiteSpace(LanguageSongList[i].ArtistB)
|
|
||||||
? $"{LanguageSongList[i].ArtistA} - {LanguageSongList[i].ArtistB}"
|
|
||||||
: LanguageSongList[i].ArtistA;
|
|
||||||
|
|
||||||
maxSongLength = Math.Max(maxSongLength, songText.Length);
|
// 設定標題的字體樣式
|
||||||
maxArtistLength = Math.Max(maxArtistLength, artistText.Length);
|
Font headerFont = new Font("Microsoft JhengHei", 60, FontStyle.Bold);
|
||||||
}
|
|
||||||
|
|
||||||
int songFontSize = maxSongLength > 20 ? 35 : 45;
|
// 生成標題圖片
|
||||||
int artistFontSize = maxArtistLength > 20 ? 30 : 35;
|
Bitmap headerBitmap = GenerateTextImage(headerText, headerFont, Color.White, Color.Transparent);
|
||||||
int verticalSpacing = songFontSize == 30 ? 25 : 10;
|
|
||||||
|
|
||||||
// 統一行高
|
// 顯示標題圖片,垂直置於 150px 處
|
||||||
int rowHeight = 0;
|
AddCenteredPicture(headerBitmap, 150);
|
||||||
|
|
||||||
// 計算行高
|
// 設定歌名顯示區域的起始 Y 位置
|
||||||
for (int i = startIndex; i < endIndex; i++)
|
int startY = 250;
|
||||||
{
|
|
||||||
string songText = $"{i - startIndex + 1}. {LanguageSongList[i].Song}";
|
|
||||||
string artistText = !string.IsNullOrWhiteSpace(LanguageSongList[i].ArtistB)
|
|
||||||
? $"{LanguageSongList[i].ArtistA} - {LanguageSongList[i].ArtistB}"
|
|
||||||
: LanguageSongList[i].ArtistA;
|
|
||||||
|
|
||||||
Font songFont = new Font("Microsoft JhengHei", songFontSize, FontStyle.Bold);
|
// 左列與右列的 X 位置
|
||||||
Font artistFont = new Font("Microsoft JhengHei", artistFontSize, FontStyle.Bold);
|
int leftColumnX = 100;
|
||||||
|
int rightColumnX = this.Width / 2 + 100;
|
||||||
|
|
||||||
Bitmap songBitmap = GenerateTextImage(songText, songFont, Color.White, Color.Transparent);
|
// 計算當前頁面最大歌名和歌手文字長度,決定適合的字體大小
|
||||||
Bitmap artistBitmap = GenerateTextImage(artistText, artistFont, Color.White, Color.Transparent);
|
int maxSongLength = 0;
|
||||||
|
int maxArtistLength = 0;
|
||||||
|
|
||||||
rowHeight = Math.Max(rowHeight, Math.Max(songBitmap.Height, artistBitmap.Height));
|
for (int i = startIndex; i < endIndex; i++)
|
||||||
}
|
{
|
||||||
|
string songText = $"{i - startIndex + 1}. {LanguageSongList[i].Song}";
|
||||||
|
string artistText = !string.IsNullOrWhiteSpace(LanguageSongList[i].ArtistB)
|
||||||
|
? $"{LanguageSongList[i].ArtistA} - {LanguageSongList[i].ArtistB}"
|
||||||
|
: LanguageSongList[i].ArtistA;
|
||||||
|
|
||||||
for (int i = startIndex; i < endIndex; i++)
|
maxSongLength = Math.Max(maxSongLength, songText.Length);
|
||||||
{
|
maxArtistLength = Math.Max(maxArtistLength, artistText.Length);
|
||||||
int songNumber = i - startIndex + 1;
|
}
|
||||||
|
|
||||||
string songText = $"{songNumber}. {LanguageSongList[i].Song}";
|
// 根據最大字數決定適當的字體大小
|
||||||
string artistText = !string.IsNullOrWhiteSpace(LanguageSongList[i].ArtistB)
|
int songFontSize = maxSongLength > 20 ? 35 : 45;
|
||||||
? $"{LanguageSongList[i].ArtistA} - {LanguageSongList[i].ArtistB}"
|
int artistFontSize = maxArtistLength > 20 ? 30 : 35;
|
||||||
: LanguageSongList[i].ArtistA;
|
|
||||||
|
|
||||||
Font songFont = new Font("Microsoft JhengHei", songFontSize, FontStyle.Bold);
|
// 設定歌曲行間距
|
||||||
Font artistFont = new Font("Microsoft JhengHei", artistFontSize, FontStyle.Bold);
|
int verticalSpacing = songFontSize == 30 ? 25 : 10;
|
||||||
|
|
||||||
Bitmap songBitmap = GenerateTextImage(songText, songFont, Color.White, Color.Transparent);
|
// 設定統一的行高
|
||||||
Bitmap artistBitmap = GenerateTextImage(artistText, artistFont, Color.White, Color.Transparent);
|
int rowHeight = 0;
|
||||||
|
|
||||||
int x = (i - startIndex) < songsPerColumn ? leftColumnX : rightColumnX;
|
// 計算行高
|
||||||
int y = startY + ((i - startIndex) % songsPerColumn) * (rowHeight + verticalSpacing);
|
for (int i = startIndex; i < endIndex; i++)
|
||||||
|
{
|
||||||
|
string songText = $"{i - startIndex + 1}. {LanguageSongList[i].Song}";
|
||||||
|
string artistText = !string.IsNullOrWhiteSpace(LanguageSongList[i].ArtistB)
|
||||||
|
? $"{LanguageSongList[i].ArtistA} - {LanguageSongList[i].ArtistB}"
|
||||||
|
: LanguageSongList[i].ArtistA;
|
||||||
|
|
||||||
AddPicture(songBitmap, x, y);
|
Font songFont = new Font("Microsoft JhengHei", songFontSize, FontStyle.Bold);
|
||||||
AddPicture(artistBitmap, x + songBitmap.Width + 20, y);
|
Font artistFont = new Font("Microsoft JhengHei", artistFontSize, FontStyle.Bold);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void DisplaySongsWithArrows(int page, int highlightIndex)
|
Bitmap songBitmap = GenerateTextImage(songText, songFont, Color.White, Color.Transparent);
|
||||||
{
|
Bitmap artistBitmap = GenerateTextImage(artistText, artistFont, Color.White, Color.Transparent);
|
||||||
if (LanguageSongList == null || LanguageSongList.Count == 0)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Error: LanguageSongList is null or empty.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Controls.OfType<PictureBox>().ToList().ForEach(p => this.Controls.Remove(p));
|
rowHeight = Math.Max(rowHeight, Math.Max(songBitmap.Height, artistBitmap.Height));
|
||||||
|
}
|
||||||
|
|
||||||
int songsPerColumn = 5;
|
// 依據計算出的行高,逐行顯示歌曲與歌手名稱
|
||||||
int startIndex = (page - 1) * songsPerPage;
|
for (int i = startIndex; i < endIndex; i++)
|
||||||
int endIndex = Math.Min(startIndex + songsPerPage, LanguageSongList.Count);
|
{
|
||||||
|
int songNumber = i - startIndex + 1;
|
||||||
|
|
||||||
int totalPages = (int)Math.Ceiling((double)LanguageSongList.Count / songsPerPage);
|
string songText = $"{songNumber}. {LanguageSongList[i].Song}";
|
||||||
|
string artistText = !string.IsNullOrWhiteSpace(LanguageSongList[i].ArtistB)
|
||||||
|
? $"{LanguageSongList[i].ArtistA} - {LanguageSongList[i].ArtistB}"
|
||||||
|
: LanguageSongList[i].ArtistA;
|
||||||
|
|
||||||
string categoryText = OverlayForm.CurrentCategory switch
|
Font songFont = new Font("Microsoft JhengHei", songFontSize, FontStyle.Bold);
|
||||||
{
|
Font artistFont = new Font("Microsoft JhengHei", artistFontSize, FontStyle.Bold);
|
||||||
OverlayForm.Category.NewSongs => "新歌",
|
|
||||||
OverlayForm.Category.HotSongs => "熱門",
|
|
||||||
_ => ""
|
|
||||||
};
|
|
||||||
|
|
||||||
string headerText = $"{currentLanguage} - {categoryText} ({page} / {totalPages})";
|
Bitmap songBitmap = GenerateTextImage(songText, songFont, Color.White, Color.Transparent);
|
||||||
Font headerFont = new Font("Microsoft JhengHei", 60, FontStyle.Bold);
|
Bitmap artistBitmap = GenerateTextImage(artistText, artistFont, Color.White, Color.Transparent);
|
||||||
Bitmap headerBitmap = GenerateTextImage(headerText, headerFont, Color.White, Color.Transparent);
|
|
||||||
AddCenteredPicture(headerBitmap, 150);
|
|
||||||
|
|
||||||
int startY = 250;
|
// 根據索引決定左側或右側顯示
|
||||||
int leftColumnX = 100;
|
int x = (i - startIndex) < songsPerColumn ? leftColumnX : rightColumnX;
|
||||||
int rightColumnX = this.Width / 2 + 100;
|
|
||||||
|
|
||||||
// 找到当前页面中最长的 songText 和 artistText 长度
|
// 計算 Y 位置
|
||||||
int maxSongLength = 0;
|
int y = startY + ((i - startIndex) % songsPerColumn) * (rowHeight + verticalSpacing);
|
||||||
int maxArtistLength = 0;
|
|
||||||
for (int i = startIndex; i < endIndex; i++)
|
|
||||||
{
|
|
||||||
string songText = $"{i - startIndex + 1}. {LanguageSongList[i].Song}";
|
|
||||||
string artistText = !string.IsNullOrWhiteSpace(LanguageSongList[i].ArtistB)
|
|
||||||
? $"{LanguageSongList[i].ArtistA} - {LanguageSongList[i].ArtistB}"
|
|
||||||
: LanguageSongList[i].ArtistA;
|
|
||||||
|
|
||||||
maxSongLength = Math.Max(maxSongLength, songText.Length);
|
// 顯示歌曲名稱圖片
|
||||||
maxArtistLength = Math.Max(maxArtistLength, artistText.Length);
|
AddPicture(songBitmap, x, y);
|
||||||
}
|
|
||||||
|
|
||||||
// 动态调整字体大小
|
// 顯示歌手名稱圖片(稍微右移)
|
||||||
int songFontSize = maxSongLength > 20 ? 35 : 45;
|
AddPicture(artistBitmap, x + songBitmap.Width + 20, y);
|
||||||
int artistFontSize = maxArtistLength > 20 ? 30 : 35;
|
}
|
||||||
int verticalSpacing = songFontSize == 30 ? 25 : 10;
|
}
|
||||||
|
|
||||||
// 统一行高計算
|
|
||||||
int rowHeight = 0;
|
|
||||||
for (int i = startIndex; i < endIndex; i++)
|
|
||||||
{
|
|
||||||
string songText = $"{i - startIndex + 1}. {LanguageSongList[i].Song}";
|
|
||||||
string artistText = !string.IsNullOrWhiteSpace(LanguageSongList[i].ArtistB)
|
|
||||||
? $"{LanguageSongList[i].ArtistA} - {LanguageSongList[i].ArtistB}"
|
|
||||||
: LanguageSongList[i].ArtistA;
|
|
||||||
|
|
||||||
Font tempSongFont = new Font("Microsoft JhengHei", songFontSize, FontStyle.Bold);
|
public void DisplaySongsWithArrows(int page, int highlightIndex)
|
||||||
Font tempArtistFont = new Font("Microsoft JhengHei", artistFontSize, FontStyle.Bold);
|
{
|
||||||
|
// 檢查 LanguageSongList 是否為空,避免發生錯誤
|
||||||
|
if (LanguageSongList == null || LanguageSongList.Count == 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Error: LanguageSongList is null or empty.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Bitmap tempSongBitmap = GenerateTextImage(songText, tempSongFont, Color.White, Color.Transparent);
|
// 清除介面上所有 PictureBox 控件,避免重複顯示舊的內容
|
||||||
Bitmap tempArtistBitmap = GenerateTextImage(artistText, tempArtistFont, Color.White, Color.Transparent);
|
this.Controls.OfType<PictureBox>().ToList().ForEach(p => this.Controls.Remove(p));
|
||||||
|
|
||||||
rowHeight = Math.Max(rowHeight, Math.Max(tempSongBitmap.Height, tempArtistBitmap.Height));
|
// 每列顯示 5 首歌
|
||||||
}
|
int songsPerColumn = 5;
|
||||||
|
// 計算當前頁面的起始與結束索引
|
||||||
|
int startIndex = (page - 1) * songsPerPage;
|
||||||
|
int endIndex = Math.Min(startIndex + songsPerPage, LanguageSongList.Count);
|
||||||
|
|
||||||
for (int i = startIndex; i < endIndex; i++)
|
// 計算總頁數
|
||||||
{
|
int totalPages = (int)Math.Ceiling((double)LanguageSongList.Count / songsPerPage);
|
||||||
int songNumber = i - startIndex + 1;
|
|
||||||
|
|
||||||
string songText = $"{songNumber}. {LanguageSongList[i].Song}";
|
// 根據當前分類選擇標題文字
|
||||||
string artistText = !string.IsNullOrWhiteSpace(LanguageSongList[i].ArtistB)
|
string categoryText = OverlayForm.CurrentCategory switch
|
||||||
? $"{LanguageSongList[i].ArtistA} - {LanguageSongList[i].ArtistB}"
|
{
|
||||||
: LanguageSongList[i].ArtistA;
|
OverlayForm.Category.NewSongs => "新歌",
|
||||||
|
OverlayForm.Category.HotSongs => "熱門",
|
||||||
|
_ => ""
|
||||||
|
};
|
||||||
|
|
||||||
// 设置颜色,选中的索引显示为亮绿色
|
// 設定標題格式,包含語言、分類與當前頁碼
|
||||||
Color songColor = (i == highlightIndex) ? Color.LimeGreen : Color.White;
|
string headerText = $"{currentLanguage} - {categoryText} ({page} / {totalPages})";
|
||||||
Color artistColor = (i == highlightIndex) ? Color.LimeGreen : Color.White;
|
// 設定標題的字體樣式
|
||||||
|
Font headerFont = new Font("Microsoft JhengHei", 60, FontStyle.Bold);
|
||||||
|
// 生成標題圖片
|
||||||
|
Bitmap headerBitmap = GenerateTextImage(headerText, headerFont, Color.White, Color.Transparent);
|
||||||
|
// 顯示標題圖片,垂直置於 150px 處
|
||||||
|
AddCenteredPicture(headerBitmap, 150);
|
||||||
|
|
||||||
Font songFont = new Font("Microsoft JhengHei", songFontSize, FontStyle.Bold);
|
// 設定歌名顯示區域的起始 Y 位置
|
||||||
Bitmap songBitmap = GenerateTextImage(songText, songFont, songColor, Color.Transparent);
|
int startY = 250;
|
||||||
|
// 左列與右列的 X 位置
|
||||||
|
int leftColumnX = 100;
|
||||||
|
int rightColumnX = this.Width / 2 + 100;
|
||||||
|
|
||||||
Font artistFont = new Font("Microsoft JhengHei", artistFontSize, FontStyle.Bold);
|
// 找到當前頁面中最長的 songText 和 artistText 長度
|
||||||
Bitmap artistBitmap = GenerateTextImage(artistText, artistFont, artistColor, Color.Transparent);
|
int maxSongLength = 0;
|
||||||
|
int maxArtistLength = 0;
|
||||||
|
for (int i = startIndex; i < endIndex; i++)
|
||||||
|
{
|
||||||
|
string songText = $"{i - startIndex + 1}. {LanguageSongList[i].Song}";
|
||||||
|
string artistText = !string.IsNullOrWhiteSpace(LanguageSongList[i].ArtistB)
|
||||||
|
? $"{LanguageSongList[i].ArtistA} - {LanguageSongList[i].ArtistB}"
|
||||||
|
: LanguageSongList[i].ArtistA;
|
||||||
|
|
||||||
int x = (i - startIndex) < songsPerColumn ? leftColumnX : rightColumnX;
|
maxSongLength = Math.Max(maxSongLength, songText.Length);
|
||||||
int y = startY + ((i - startIndex) % songsPerColumn) * (rowHeight + verticalSpacing);
|
maxArtistLength = Math.Max(maxArtistLength, artistText.Length);
|
||||||
|
}
|
||||||
|
|
||||||
AddPicture(songBitmap, x, y);
|
// 動態調整字體大小
|
||||||
AddPicture(artistBitmap, x + songBitmap.Width + 20, y);
|
int songFontSize = maxSongLength > 20 ? 35 : 45;
|
||||||
}
|
int artistFontSize = maxArtistLength > 20 ? 30 : 35;
|
||||||
}
|
int verticalSpacing = songFontSize == 30 ? 25 : 10;
|
||||||
|
|
||||||
|
// 統一行高計算
|
||||||
|
int rowHeight = 0;
|
||||||
|
for (int i = startIndex; i < endIndex; i++)
|
||||||
|
{
|
||||||
|
string songText = $"{i - startIndex + 1}. {LanguageSongList[i].Song}";
|
||||||
|
string artistText = !string.IsNullOrWhiteSpace(LanguageSongList[i].ArtistB)
|
||||||
|
? $"{LanguageSongList[i].ArtistA} - {LanguageSongList[i].ArtistB}"
|
||||||
|
: LanguageSongList[i].ArtistA;
|
||||||
|
|
||||||
|
Font tempSongFont = new Font("Microsoft JhengHei", songFontSize, FontStyle.Bold);
|
||||||
|
Font tempArtistFont = new Font("Microsoft JhengHei", artistFontSize, FontStyle.Bold);
|
||||||
|
|
||||||
|
Bitmap tempSongBitmap = GenerateTextImage(songText, tempSongFont, Color.White, Color.Transparent);
|
||||||
|
Bitmap tempArtistBitmap = GenerateTextImage(artistText, tempArtistFont, Color.White, Color.Transparent);
|
||||||
|
|
||||||
|
rowHeight = Math.Max(rowHeight, Math.Max(tempSongBitmap.Height, tempArtistBitmap.Height));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 依據計算出的行高,逐行顯示歌曲與歌手名稱
|
||||||
|
for (int i = startIndex; i < endIndex; i++)
|
||||||
|
{
|
||||||
|
int songNumber = i - startIndex + 1;
|
||||||
|
|
||||||
|
string songText = $"{songNumber}. {LanguageSongList[i].Song}";
|
||||||
|
string artistText = !string.IsNullOrWhiteSpace(LanguageSongList[i].ArtistB)
|
||||||
|
? $"{LanguageSongList[i].ArtistA} - {LanguageSongList[i].ArtistB}"
|
||||||
|
: LanguageSongList[i].ArtistA;
|
||||||
|
|
||||||
|
// 設定顏色,選中的索引顯示為亮綠色
|
||||||
|
Color songColor = (i == highlightIndex) ? Color.LimeGreen : Color.White;
|
||||||
|
Color artistColor = (i == highlightIndex) ? Color.LimeGreen : Color.White;
|
||||||
|
|
||||||
|
Font songFont = new Font("Microsoft JhengHei", songFontSize, FontStyle.Bold);
|
||||||
|
Bitmap songBitmap = GenerateTextImage(songText, songFont, songColor, Color.Transparent);
|
||||||
|
|
||||||
|
Font artistFont = new Font("Microsoft JhengHei", artistFontSize, FontStyle.Bold);
|
||||||
|
Bitmap artistBitmap = GenerateTextImage(artistText, artistFont, artistColor, Color.Transparent);
|
||||||
|
|
||||||
|
int x = (i - startIndex) < songsPerColumn ? leftColumnX : rightColumnX;
|
||||||
|
int y = startY + ((i - startIndex) % songsPerColumn) * (rowHeight + verticalSpacing);
|
||||||
|
|
||||||
|
// 顯示歌曲名稱圖片
|
||||||
|
AddPicture(songBitmap, x, y);
|
||||||
|
// 顯示歌手名稱圖片(稍微右移)
|
||||||
|
AddPicture(artistBitmap, x + songBitmap.Width + 20, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void DisplayActionWithSong(int page, int songIndex, string actionType)
|
public void DisplayActionWithSong(int page, int songIndex, string actionType)
|
||||||
{
|
{
|
||||||
// try
|
// try
|
||||||
// {
|
// {
|
||||||
// if (LanguageSongList == null || LanguageSongList.Count == 0)
|
// if (LanguageSongList == null || LanguageSongList.Count == 0)
|
||||||
// {
|
// {
|
||||||
// Console.WriteLine("Error: LanguageSongList is null or empty.");
|
// Console.WriteLine("Error: LanguageSongList is null or empty.");
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// SongData song = LanguageSongList[songIndex];
|
// SongData song = LanguageSongList[songIndex];
|
||||||
|
|
||||||
// this.Controls.OfType<PictureBox>().ToList().ForEach(p => this.Controls.Remove(p));
|
// this.Controls.OfType<PictureBox>().ToList().ForEach(p => this.Controls.Remove(p));
|
||||||
|
|
||||||
// int songsPerColumn = 5;
|
// int songsPerColumn = 5;
|
||||||
// int startIndex = (page - 1) * songsPerPage;
|
// int startIndex = (page - 1) * songsPerPage;
|
||||||
// int endIndex = Math.Min(startIndex + songsPerPage, LanguageSongList.Count);
|
// int endIndex = Math.Min(startIndex + songsPerPage, LanguageSongList.Count);
|
||||||
|
|
||||||
// int totalPages = (int)Math.Ceiling((double)LanguageSongList.Count / songsPerPage);
|
// int totalPages = (int)Math.Ceiling((double)LanguageSongList.Count / songsPerPage);
|
||||||
|
|
||||||
// string headerText = $"{actionType}: {song.ArtistA} - {song.Song} ({page} / {totalPages})";
|
// string headerText = $"{actionType}: {song.ArtistA} - {song.Song} ({page} / {totalPages})";
|
||||||
// Font headerFont = new Font("Microsoft JhengHei", 40, FontStyle.Bold);
|
// Font headerFont = new Font("Microsoft JhengHei", 40, FontStyle.Bold);
|
||||||
// Color headerColor = actionType == "點播" ? Color.LimeGreen : Color.Yellow;
|
// Color headerColor = actionType == "點播" ? Color.LimeGreen : Color.Yellow;
|
||||||
// Bitmap headerBitmap = GenerateTextImage(headerText, headerFont, headerColor, Color.Transparent);
|
// Bitmap headerBitmap = GenerateTextImage(headerText, headerFont, headerColor, Color.Transparent);
|
||||||
// AddCenteredPicture(headerBitmap, 150);
|
// AddCenteredPicture(headerBitmap, 150);
|
||||||
|
|
||||||
// int startY = 250;
|
// int startY = 250;
|
||||||
// int verticalSpacing = 10;
|
// int verticalSpacing = 10;
|
||||||
// int leftColumnX = 200;
|
// int leftColumnX = 200;
|
||||||
// int rightColumnX = this.Width / 2 + 150;
|
// int rightColumnX = this.Width / 2 + 150;
|
||||||
|
|
||||||
// for (int i = startIndex; i < endIndex; i++)
|
// for (int i = startIndex; i < endIndex; i++)
|
||||||
// {
|
// {
|
||||||
// int songNumber = i - startIndex + 1;
|
// int songNumber = i - startIndex + 1;
|
||||||
// string songText = $"{songNumber}. {LanguageSongList[i].Song}";
|
// string songText = $"{songNumber}. {LanguageSongList[i].Song}";
|
||||||
// string artistText = !string.IsNullOrWhiteSpace(LanguageSongList[i].ArtistB)
|
// string artistText = !string.IsNullOrWhiteSpace(LanguageSongList[i].ArtistB)
|
||||||
// ? $"{LanguageSongList[i].ArtistA} - {LanguageSongList[i].ArtistB}"
|
// ? $"{LanguageSongList[i].ArtistA} - {LanguageSongList[i].ArtistB}"
|
||||||
// : LanguageSongList[i].ArtistA;
|
// : LanguageSongList[i].ArtistA;
|
||||||
|
|
||||||
// Font songFont = new Font("Microsoft JhengHei", 40, FontStyle.Bold);
|
// Font songFont = new Font("Microsoft JhengHei", 40, FontStyle.Bold);
|
||||||
// Bitmap songBitmap = GenerateTextImage(songText, songFont, Color.White, Color.Transparent);
|
// Bitmap songBitmap = GenerateTextImage(songText, songFont, Color.White, Color.Transparent);
|
||||||
|
|
||||||
// Font artistFont = new Font("Microsoft JhengHei", 30, FontStyle.Bold);
|
// Font artistFont = new Font("Microsoft JhengHei", 30, FontStyle.Bold);
|
||||||
// Bitmap artistBitmap = GenerateTextImage(artistText, artistFont, Color.White, Color.Transparent);
|
// Bitmap artistBitmap = GenerateTextImage(artistText, artistFont, Color.White, Color.Transparent);
|
||||||
|
|
||||||
// int x = (i - startIndex) < songsPerColumn ? leftColumnX : rightColumnX;
|
// int x = (i - startIndex) < songsPerColumn ? leftColumnX : rightColumnX;
|
||||||
// int y = startY + ((i - startIndex) % songsPerColumn) * (songBitmap.Height + verticalSpacing);
|
// int y = startY + ((i - startIndex) % songsPerColumn) * (songBitmap.Height + verticalSpacing);
|
||||||
|
|
||||||
// AddPicture(songBitmap, x, y);
|
// AddPicture(songBitmap, x, y);
|
||||||
// AddPicture(artistBitmap, x + songBitmap.Width + 20, y);
|
// AddPicture(artistBitmap, x + songBitmap.Width + 20, y);
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// catch (Exception ex)
|
// catch (Exception ex)
|
||||||
// {
|
// {
|
||||||
// Console.WriteLine($"Error in DisplayActionWithSong: {ex.Message}");
|
// Console.WriteLine($"Error in DisplayActionWithSong: {ex.Message}");
|
||||||
// Console.WriteLine(ex.StackTrace);
|
// Console.WriteLine(ex.StackTrace);
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
public void NextPage()
|
public void NextPage()
|
||||||
{
|
{
|
@ -4,7 +4,7 @@ using System.Drawing;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using DBObj;
|
||||||
namespace DualScreenDemo
|
namespace DualScreenDemo
|
||||||
{
|
{
|
||||||
public partial class PrimaryForm
|
public partial class PrimaryForm
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
// using System;
|
|
||||||
// using System.Linq;
|
|
||||||
// using System.Windows.Forms;
|
|
||||||
// using System.Drawing;
|
|
||||||
|
|
||||||
// namespace DualScreenDemo
|
|
||||||
// {
|
|
||||||
// public partial class PrimaryForm
|
|
||||||
// {
|
|
||||||
// private void TaiYuPopularButtonHotSong_Click(object sender, EventArgs e)
|
|
||||||
// {
|
|
||||||
// OnHotSongButtonClick(taiYuPopularButtonHotSong, taiYuPopularHotSongActiveBackground, "台語");
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
@ -11,7 +11,7 @@ namespace DualScreenDemo
|
|||||||
|
|
||||||
private void InitializeButton(ref Button button, string buttonText, int x, int y, int width, int height, Rectangle cropArea, Image normalBackground, out Bitmap normalBackgroundOut, Image activeBackground, out Bitmap activeBackgroundOut, EventHandler clickEventHandler)
|
private void InitializeButton(ref Button button, string buttonText, int x, int y, int width, int height, Rectangle cropArea, Image normalBackground, out Bitmap normalBackgroundOut, Image activeBackground, out Bitmap activeBackgroundOut, EventHandler clickEventHandler)
|
||||||
{
|
{
|
||||||
button = new Button { Text = buttonText, Visible = false };
|
button = new Button { Text = "", Visible = false };
|
||||||
ResizeAndPositionButton(button, x, y, width, height);
|
ResizeAndPositionButton(button, x, y, width, height);
|
||||||
normalBackgroundOut = new Bitmap(normalBackground).Clone(cropArea, normalBackground.PixelFormat);
|
normalBackgroundOut = new Bitmap(normalBackground).Clone(cropArea, normalBackground.PixelFormat);
|
||||||
activeBackgroundOut = new Bitmap(activeBackground).Clone(cropArea, activeBackground.PixelFormat);
|
activeBackgroundOut = new Bitmap(activeBackground).Clone(cropArea, activeBackground.PixelFormat);
|
||||||
|
@ -4,7 +4,7 @@ using System.IO;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using DBObj;
|
||||||
namespace DualScreenDemo
|
namespace DualScreenDemo
|
||||||
{
|
{
|
||||||
public partial class PrimaryForm
|
public partial class PrimaryForm
|
||||||
@ -26,19 +26,19 @@ namespace DualScreenDemo
|
|||||||
|
|
||||||
private void InitializeButtonsForFavoritePictureBox()
|
private void InitializeButtonsForFavoritePictureBox()
|
||||||
{
|
{
|
||||||
|
// 我的最愛數字座標按鈕
|
||||||
int[,] coords = new int[,]
|
int[,] coords = new int[,]
|
||||||
{
|
{
|
||||||
{799, 508, 70, 65},
|
{794, 508, 70, 65},
|
||||||
{878, 508, 70, 65},
|
{873, 508, 70, 65},
|
||||||
{957, 508, 70, 65},
|
{952, 508, 70, 65},
|
||||||
{1036, 508, 70, 65},
|
{1031, 508, 70, 65},
|
||||||
{1115, 508, 70, 65},
|
{1110, 508, 70, 65},
|
||||||
{799, 580, 70, 65},
|
{794, 580, 70, 65},
|
||||||
{878, 580, 70, 65},
|
{873, 580, 70, 65},
|
||||||
{957, 580, 70, 65},
|
{952, 580, 70, 65},
|
||||||
{1036, 580, 70, 65},
|
{1031, 580, 70, 65},
|
||||||
{1115, 580, 70, 65}
|
{1110, 580, 70, 65}
|
||||||
};
|
};
|
||||||
|
|
||||||
int screenW = Screen.PrimaryScreen.Bounds.Width;
|
int screenW = Screen.PrimaryScreen.Bounds.Width;
|
||||||
@ -58,7 +58,7 @@ namespace DualScreenDemo
|
|||||||
|
|
||||||
|
|
||||||
string fileName = (i + 2).ToString("00");
|
string fileName = (i + 2).ToString("00");
|
||||||
string filePath = Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-" + fileName + ".jpg");
|
string filePath = Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-" + fileName + ".png");
|
||||||
favoriteNumberButton[i].BackgroundImage = Image.FromFile(filePath);
|
favoriteNumberButton[i].BackgroundImage = Image.FromFile(filePath);
|
||||||
favoriteNumberButton[i].BackgroundImageLayout = ImageLayout.Stretch;
|
favoriteNumberButton[i].BackgroundImageLayout = ImageLayout.Stretch;
|
||||||
favoriteNumberButton[i].FlatStyle = FlatStyle.Flat;
|
favoriteNumberButton[i].FlatStyle = FlatStyle.Flat;
|
||||||
@ -89,8 +89,8 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
Name = "enterFavoriteButton"
|
Name = "enterFavoriteButton"
|
||||||
};
|
};
|
||||||
ResizeAndPositionButton(enterFavoriteButton, 842, 652, 70, 65);
|
ResizeAndPositionButton(enterFavoriteButton, 837, 652, 70, 65);
|
||||||
enterFavoriteButton.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-12.jpg"));
|
enterFavoriteButton.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-12.png"));
|
||||||
enterFavoriteButton.BackgroundImageLayout = ImageLayout.Stretch;
|
enterFavoriteButton.BackgroundImageLayout = ImageLayout.Stretch;
|
||||||
enterFavoriteButton.FlatStyle = FlatStyle.Flat;
|
enterFavoriteButton.FlatStyle = FlatStyle.Flat;
|
||||||
enterFavoriteButton.FlatAppearance.BorderSize = 0;
|
enterFavoriteButton.FlatAppearance.BorderSize = 0;
|
||||||
@ -104,8 +104,8 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
Name = "newFavoriteButton"
|
Name = "newFavoriteButton"
|
||||||
};
|
};
|
||||||
ResizeAndPositionButton(newFavoriteButton, 921, 652, 70, 65);
|
ResizeAndPositionButton(newFavoriteButton, 916, 652, 70, 65);
|
||||||
newFavoriteButton.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-13.jpg"));
|
newFavoriteButton.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-13.png"));
|
||||||
newFavoriteButton.BackgroundImageLayout = ImageLayout.Stretch;
|
newFavoriteButton.BackgroundImageLayout = ImageLayout.Stretch;
|
||||||
newFavoriteButton.FlatStyle = FlatStyle.Flat;
|
newFavoriteButton.FlatStyle = FlatStyle.Flat;
|
||||||
newFavoriteButton.FlatAppearance.BorderSize = 0;
|
newFavoriteButton.FlatAppearance.BorderSize = 0;
|
||||||
@ -119,8 +119,8 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
Name = "refillFavoriteButton"
|
Name = "refillFavoriteButton"
|
||||||
};
|
};
|
||||||
ResizeAndPositionButton(refillFavoriteButton, 999, 652, 70, 65);
|
ResizeAndPositionButton(refillFavoriteButton, 994, 652, 70, 65);
|
||||||
refillFavoriteButton.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-14.jpg"));
|
refillFavoriteButton.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-14.png"));
|
||||||
refillFavoriteButton.BackgroundImageLayout = ImageLayout.Stretch;
|
refillFavoriteButton.BackgroundImageLayout = ImageLayout.Stretch;
|
||||||
refillFavoriteButton.FlatStyle = FlatStyle.Flat;
|
refillFavoriteButton.FlatStyle = FlatStyle.Flat;
|
||||||
refillFavoriteButton.FlatAppearance.BorderSize = 0;
|
refillFavoriteButton.FlatAppearance.BorderSize = 0;
|
||||||
@ -134,8 +134,8 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
Name = "closeFavoriteButton"
|
Name = "closeFavoriteButton"
|
||||||
};
|
};
|
||||||
ResizeAndPositionButton(closeFavoriteButton, 1078, 652, 70, 65);
|
ResizeAndPositionButton(closeFavoriteButton, 1073, 652, 70, 65);
|
||||||
closeFavoriteButton.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-15.jpg"));
|
closeFavoriteButton.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-15.png"));
|
||||||
closeFavoriteButton.BackgroundImageLayout = ImageLayout.Stretch;
|
closeFavoriteButton.BackgroundImageLayout = ImageLayout.Stretch;
|
||||||
closeFavoriteButton.FlatStyle = FlatStyle.Flat;
|
closeFavoriteButton.FlatStyle = FlatStyle.Flat;
|
||||||
closeFavoriteButton.FlatAppearance.BorderSize = 0;
|
closeFavoriteButton.FlatAppearance.BorderSize = 0;
|
||||||
@ -179,11 +179,19 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
if (!string.IsNullOrEmpty(mobileNumber))
|
if (!string.IsNullOrEmpty(mobileNumber))
|
||||||
{
|
{
|
||||||
using (Font font = new Font("Arial", 24))
|
|
||||||
using (Brush brush = new SolidBrush(Color.Black))
|
using (Brush brush = new SolidBrush(Color.Black))
|
||||||
{
|
{
|
||||||
int x = 16;
|
int screenW = Screen.PrimaryScreen.Bounds.Width;
|
||||||
int y = 68;
|
int screenH = Screen.PrimaryScreen.Bounds.Height;
|
||||||
|
|
||||||
|
float widthRatio = screenW / 1920f;
|
||||||
|
float heightRatio = screenH / 1080f;
|
||||||
|
|
||||||
|
// 轉成縮放後的座標
|
||||||
|
int x = (int)(30 * widthRatio);
|
||||||
|
int y = (int)(90 * heightRatio);
|
||||||
|
Font font = new Font("Arial", 24*heightRatio);
|
||||||
|
|
||||||
if (showError)
|
if (showError)
|
||||||
{
|
{
|
||||||
@ -312,7 +320,7 @@ namespace DualScreenDemo
|
|||||||
if (!FavoritePictureBox.Visible)
|
if (!FavoritePictureBox.Visible)
|
||||||
{
|
{
|
||||||
|
|
||||||
ShowImageOnFavoritePictureBox(Path.Combine(Application.StartupPath, @"themes\superstar\其他介面\其他_我的最愛.jpg"));
|
ShowImageOnFavoritePictureBox(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛_工作區域.png"));
|
||||||
SetFavoritePictureBoxAndButtonsVisibility(true);
|
SetFavoritePictureBoxAndButtonsVisibility(true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -335,24 +343,24 @@ namespace DualScreenDemo
|
|||||||
private void ShowImageOnFavoritePictureBox(string imagePath)
|
private void ShowImageOnFavoritePictureBox(string imagePath)
|
||||||
{
|
{
|
||||||
|
|
||||||
Bitmap originalImage = new Bitmap(imagePath);
|
if (File.Exists(imagePath))
|
||||||
|
{
|
||||||
|
// 直接載入完整圖
|
||||||
|
Bitmap image = new Bitmap(imagePath);
|
||||||
|
|
||||||
|
// 顯示在 PictureBox 上
|
||||||
|
FavoritePictureBox.Image = image;
|
||||||
|
|
||||||
Console.WriteLine(String.Format("Original Image Size: {0}x{1}", originalImage.Width, originalImage.Height));
|
// 設定 PictureBox 的大小與位置(依你的需要調整)
|
||||||
|
ResizeAndPositionPictureBox(FavoritePictureBox, 773, 380, image.Width, image.Height);
|
||||||
|
|
||||||
|
FavoritePictureBox.Visible = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("圖片檔案不存在:" + imagePath);
|
||||||
|
}
|
||||||
|
|
||||||
Rectangle cropArea = new Rectangle(784, 393, 555, 442);
|
|
||||||
|
|
||||||
|
|
||||||
Bitmap croppedImage = CropImage(originalImage, cropArea);
|
|
||||||
|
|
||||||
|
|
||||||
FavoritePictureBox.Image = croppedImage;
|
|
||||||
|
|
||||||
|
|
||||||
ResizeAndPositionPictureBox(FavoritePictureBox, cropArea.X, cropArea.Y, 416, 323);
|
|
||||||
|
|
||||||
FavoritePictureBox.Visible = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ToggleFavoritePictureBoxButtonsVisibility()
|
private void ToggleFavoritePictureBoxButtonsVisibility()
|
||||||
|
@ -100,9 +100,10 @@ namespace DualScreenDemo
|
|||||||
|
|
||||||
return images;
|
return images;
|
||||||
}
|
}
|
||||||
|
// 優惠活動 按鈕事件
|
||||||
private void promotionsButton_Click(object sender, EventArgs e)
|
private void promotionsButton_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
promotionsAndMenuPanel.currentPageIndex=0;
|
||||||
newSongAlertButton.BackgroundImage = newSongAlertNormalBackground;
|
newSongAlertButton.BackgroundImage = newSongAlertNormalBackground;
|
||||||
hotPlayButton.BackgroundImage = hotPlayNormalBackground;
|
hotPlayButton.BackgroundImage = hotPlayNormalBackground;
|
||||||
singerSearchButton.BackgroundImage = singerSearchNormalBackground;
|
singerSearchButton.BackgroundImage = singerSearchNormalBackground;
|
||||||
|
@ -15,7 +15,7 @@ namespace DualScreenDemo
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
||||||
string imagePath = Path.Combine(Application.StartupPath, "themes/superstar/cropped_qrcode.jpg");
|
string imagePath = Path.Combine(Application.StartupPath, "themes/superstar/cropped_qrcode.png");
|
||||||
if (!File.Exists(imagePath))
|
if (!File.Exists(imagePath))
|
||||||
{
|
{
|
||||||
Console.WriteLine("Base image not found: " + imagePath);
|
Console.WriteLine("Base image not found: " + imagePath);
|
||||||
@ -81,7 +81,7 @@ namespace DualScreenDemo
|
|||||||
using (Graphics g = Graphics.FromImage(bitmap))
|
using (Graphics g = Graphics.FromImage(bitmap))
|
||||||
{
|
{
|
||||||
|
|
||||||
g.DrawImage(baseImage, 0, 0);
|
g.DrawImage(baseImage, new Rectangle(0, 0, bitmap.Width, bitmap.Height));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -97,10 +97,10 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ResizeAndPositionControl(pictureBoxQRCode, 975, 442, 226, 274);
|
ResizeAndPositionControl(pictureBoxQRCode, 975, 442, 225, 280);
|
||||||
|
|
||||||
|
|
||||||
Bitmap originalImage = new Bitmap(Path.Combine(Application.StartupPath, "themes\\superstar\\cropped_qrcode.jpg"));
|
Bitmap originalImage = new Bitmap(Path.Combine(Application.StartupPath, "themes\\superstar\\cropped_qrcode.png"));
|
||||||
|
|
||||||
|
|
||||||
Rectangle closeQRCodeCropArea = new Rectangle(198, 6, 22, 22);
|
Rectangle closeQRCodeCropArea = new Rectangle(198, 6, 22, 22);
|
||||||
|
@ -25,6 +25,28 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
mediaPlayer = new WindowsMediaPlayer();
|
mediaPlayer = new WindowsMediaPlayer();
|
||||||
}
|
}
|
||||||
|
private void ConfigureImageButton(Button button, int posX, int posY, int width, int height,
|
||||||
|
string imagePath, EventHandler clickEventHandler)
|
||||||
|
{
|
||||||
|
Bitmap image = new Bitmap(imagePath);
|
||||||
|
button.SetBounds(posX, posY, image.Width, image.Height);
|
||||||
|
|
||||||
|
// 載入圖片
|
||||||
|
button.BackgroundImage = image;
|
||||||
|
button.BackgroundImageLayout = ImageLayout.Stretch;
|
||||||
|
|
||||||
|
// 按鈕樣式設定
|
||||||
|
button.FlatStyle = FlatStyle.Flat;
|
||||||
|
button.FlatAppearance.BorderSize = 0;
|
||||||
|
button.FlatAppearance.MouseDownBackColor = Color.Transparent;
|
||||||
|
button.FlatAppearance.MouseOverBackColor = Color.Transparent;
|
||||||
|
|
||||||
|
// 點擊事件
|
||||||
|
if (clickEventHandler != null)
|
||||||
|
button.Click += clickEventHandler;
|
||||||
|
|
||||||
|
this.Controls.Add(button);
|
||||||
|
}
|
||||||
|
|
||||||
private void InitializeSoundEffectButtons()
|
private void InitializeSoundEffectButtons()
|
||||||
{
|
{
|
||||||
@ -33,9 +55,9 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
Name = "constructionButton",
|
Name = "constructionButton",
|
||||||
};
|
};
|
||||||
ConfigureButton(constructionButton, 876, 494, 148, 64,
|
string path = Path.Combine(Application.StartupPath, @"themes\superstar\場景音效\場景音效_工地.png");
|
||||||
resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects,
|
ConfigureImageButton(constructionButton, 1183, 634, 148, 64,
|
||||||
ConstructionButton_Click);
|
path, ConstructionButton_Click);
|
||||||
this.Controls.Add(constructionButton);
|
this.Controls.Add(constructionButton);
|
||||||
|
|
||||||
|
|
||||||
@ -43,9 +65,9 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
Name = "marketButton",
|
Name = "marketButton",
|
||||||
};
|
};
|
||||||
ConfigureButton(marketButton, 1037, 495, 148, 63,
|
path = Path.Combine(Application.StartupPath, @"themes\superstar\場景音效\場景音效_市場.png");
|
||||||
resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects,
|
ConfigureImageButton(marketButton, 1394, 634, 148, 63,
|
||||||
MarketButton_Click);
|
path, MarketButton_Click);
|
||||||
this.Controls.Add(marketButton);
|
this.Controls.Add(marketButton);
|
||||||
|
|
||||||
|
|
||||||
@ -53,9 +75,9 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
Name = "drivingButton",
|
Name = "drivingButton",
|
||||||
};
|
};
|
||||||
ConfigureButton(drivingButton, 876, 570, 148, 63,
|
path = Path.Combine(Application.StartupPath, @"themes\superstar\場景音效\場景音效_開車.png");
|
||||||
resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects,
|
ConfigureImageButton(drivingButton, 1183, 720, 148, 63,
|
||||||
DrivingButton_Click);
|
path, DrivingButton_Click);
|
||||||
this.Controls.Add(drivingButton);
|
this.Controls.Add(drivingButton);
|
||||||
|
|
||||||
|
|
||||||
@ -63,9 +85,9 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
Name = "airportButton",
|
Name = "airportButton",
|
||||||
};
|
};
|
||||||
ConfigureButton(airportButton, 1037, 570, 148, 63,
|
path = Path.Combine(Application.StartupPath, @"themes\superstar\場景音效\場景音效_機場.png");
|
||||||
resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects,
|
ConfigureImageButton(airportButton, 1394, 720, 148, 63,
|
||||||
AirportButton_Click);
|
path, AirportButton_Click);
|
||||||
this.Controls.Add(airportButton);
|
this.Controls.Add(airportButton);
|
||||||
|
|
||||||
|
|
||||||
@ -73,9 +95,9 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
Name = "officeButton",
|
Name = "officeButton",
|
||||||
};
|
};
|
||||||
ConfigureButton(officeButton, 876, 646, 148, 64,
|
path = Path.Combine(Application.StartupPath, @"themes\superstar\場景音效\場景音效_辦公室.png");
|
||||||
resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects,
|
ConfigureImageButton(officeButton, 1183, 806, 148, 64,
|
||||||
OfficeButton_Click);
|
path, OfficeButton_Click);
|
||||||
this.Controls.Add(officeButton);
|
this.Controls.Add(officeButton);
|
||||||
|
|
||||||
|
|
||||||
@ -83,10 +105,9 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
Name = "closeButton",
|
Name = "closeButton",
|
||||||
};
|
};
|
||||||
|
path = Path.Combine(Application.StartupPath, @"themes\superstar\場景音效\場景音效_關閉.png");
|
||||||
ConfigureButton(closeButton, 1036, 646, 150, 63,
|
ConfigureImageButton(closeButton, 1394, 806, 150, 63,
|
||||||
resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects,
|
path, CloseButton_Click);
|
||||||
CloseButton_Click);
|
|
||||||
this.Controls.Add(closeButton);
|
this.Controls.Add(closeButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,7 +121,7 @@ namespace DualScreenDemo
|
|||||||
|
|
||||||
if (!pictureBoxSceneSoundEffects.Visible)
|
if (!pictureBoxSceneSoundEffects.Visible)
|
||||||
{
|
{
|
||||||
ShowImageOnPictureBoxSceneSoundEffects(Path.Combine(Application.StartupPath, @"themes\superstar\555022.jpg"));
|
ShowImageOnPictureBoxSceneSoundEffects(Path.Combine(Application.StartupPath, @"themes\superstar\場景音效\場景音效.png"));
|
||||||
SetPictureBoxSceneSoundEffectsAndButtonsVisibility(true);
|
SetPictureBoxSceneSoundEffectsAndButtonsVisibility(true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -135,28 +156,30 @@ namespace DualScreenDemo
|
|||||||
|
|
||||||
public void PlayApplauseSound()
|
public void PlayApplauseSound()
|
||||||
{
|
{
|
||||||
mediaPlayer.URL = Path.Combine(Application.StartupPath, "zs.m4a");
|
mediaPlayer.URL = Path.Combine(Application.StartupPath,"sounds" ,"zs.m4a");
|
||||||
mediaPlayer.controls.play();
|
mediaPlayer.controls.play();
|
||||||
}
|
}
|
||||||
|
// 按鈕位置需要更改,底圖需要更改
|
||||||
private void ShowImageOnPictureBoxSceneSoundEffects(string imagePath)
|
private void ShowImageOnPictureBoxSceneSoundEffects(string imagePath)
|
||||||
{
|
{
|
||||||
|
|
||||||
Bitmap originalImage = new Bitmap(imagePath);
|
if (File.Exists(imagePath))
|
||||||
|
{
|
||||||
|
// 直接載入完整圖
|
||||||
|
Bitmap image = new Bitmap(imagePath);
|
||||||
|
|
||||||
|
// 顯示在 PictureBox 上
|
||||||
|
pictureBoxSceneSoundEffects.Image = image;
|
||||||
|
|
||||||
Rectangle cropArea = new Rectangle(859, 427, 342, 295);
|
// 設定 PictureBox 的大小與位置(依你的需要調整)
|
||||||
|
ResizeAndPositionPictureBox(pictureBoxSceneSoundEffects, 850, 450, image.Width , image.Height);
|
||||||
|
|
||||||
|
pictureBoxSceneSoundEffects.Visible = true;
|
||||||
Bitmap croppedImage = CropImage(originalImage, cropArea);
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
pictureBoxSceneSoundEffects.Image = croppedImage;
|
Console.WriteLine("圖片檔案不存在:" + imagePath);
|
||||||
|
}
|
||||||
|
|
||||||
ResizeAndPositionPictureBox(pictureBoxSceneSoundEffects, cropArea.X, cropArea.Y, cropArea.Width, cropArea.Height);
|
|
||||||
|
|
||||||
pictureBoxSceneSoundEffects.Visible = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TogglePictureBoxSceneSoundEffectsButtonsVisibility()
|
private void TogglePictureBoxSceneSoundEffectsButtonsVisibility()
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
using OverlayFormObj;
|
||||||
namespace DualScreenDemo
|
namespace DualScreenDemo
|
||||||
{
|
{
|
||||||
public partial class PrimaryForm : Form
|
public partial class PrimaryForm : Form
|
||||||
@ -49,11 +49,11 @@ namespace DualScreenDemo
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//同步畫面 服務鈴
|
||||||
ConfigureButton(this.syncServiceBellButton, 1240, 17, 161, 161,
|
ConfigureButton(this.syncServiceBellButton, 1240, 17, 161, 161,
|
||||||
resizedNormalStateImageForSyncScreen, resizedNormalStateImageForSyncScreen, resizedNormalStateImageForSyncScreen,
|
resizedNormalStateImageForSyncScreen, resizedNormalStateImageForSyncScreen, resizedNormalStateImageForSyncScreen,
|
||||||
(sender, e) => SendCommandThroughSerialPort("a2 53 a4"));
|
//(sender, e) => SendCommandThroughSerialPort("a2 53 a4"));
|
||||||
|
(sender,e)=>OnServiceBellButtonClick(sender,e));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,7 +3,8 @@ using System.Drawing;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using DBObj;
|
||||||
|
using OverlayFormObj;
|
||||||
namespace DualScreenDemo
|
namespace DualScreenDemo
|
||||||
{
|
{
|
||||||
public partial class PrimaryForm
|
public partial class PrimaryForm
|
||||||
|
@ -36,296 +36,508 @@ namespace DualScreenDemo
|
|||||||
private FontStyle inputBoxFontStyle;
|
private FontStyle inputBoxFontStyle;
|
||||||
private Color inputBoxForeColor;
|
private Color inputBoxForeColor;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// <para> 點擊「注音歌手搜尋」按鈕時執行的事件處理函式。</para>
|
||||||
|
/// <para>此函式負責更新按鈕的背景圖片、載入對應的歌手圖片,並切換相關 UI 控件的可見性。</para>
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender">觸發事件的物件(通常是按鈕本身)。</param>
|
||||||
|
/// <param name="e">事件參數。</param>
|
||||||
private void ZhuyinSearchSingersButton_Click(object sender, EventArgs e)
|
private void ZhuyinSearchSingersButton_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
// 設定按鈕背景,將「注音搜尋」設為啟動狀態,其餘按鈕恢復為正常狀態
|
||||||
zhuyinSearchButton.BackgroundImage = zhuyinSearchActiveBackground;
|
zhuyinSearchButton.BackgroundImage = zhuyinSearchActiveBackground;
|
||||||
englishSearchButton.BackgroundImage = englishSearchNormalBackground;
|
englishSearchButton.BackgroundImage = englishSearchNormalBackground;
|
||||||
pinyinSearchButton.BackgroundImage = pinyinSearchNormalBackground;
|
pinyinSearchButton.BackgroundImage = pinyinSearchNormalBackground;
|
||||||
wordCountSearchButton.BackgroundImage = wordCountSearchNormalBackground;
|
wordCountSearchButton.BackgroundImage = wordCountSearchNormalBackground;
|
||||||
handWritingSearchButton.BackgroundImage = handWritingSearchNormalBackground;
|
handWritingSearchButton.BackgroundImage = handWritingSearchNormalBackground;
|
||||||
|
|
||||||
|
// 載入設定檔,取得圖片路徑資訊
|
||||||
var configData = LoadConfigData();
|
var configData = LoadConfigData();
|
||||||
|
|
||||||
|
// 取得「注音歌手圖片」的完整路徑
|
||||||
string imagePath = Path.Combine(Application.StartupPath, configData["ImagePaths"]["ZhuYinSingers"]);
|
string imagePath = Path.Combine(Application.StartupPath, configData["ImagePaths"]["ZhuYinSingers"]);
|
||||||
|
|
||||||
|
// 在 PictureBox 中顯示對應的「注音歌手」圖片
|
||||||
ShowImageOnPictureBoxZhuYinSingers(Path.Combine(Application.StartupPath, imagePath));
|
ShowImageOnPictureBoxZhuYinSingers(Path.Combine(Application.StartupPath, imagePath));
|
||||||
|
|
||||||
|
// 設定不同搜尋模式的 UI 控件可見性
|
||||||
|
SetEnglishSingersAndButtonsVisibility(false); // 隱藏英文字母搜尋相關控件
|
||||||
|
SetPinYinSingersAndButtonsVisibility(false); // 隱藏拼音搜尋相關控件
|
||||||
|
SetHandWritingForSingersAndButtonsVisibility(false); // 隱藏手寫搜尋相關控件
|
||||||
|
SetWordCountSingersAndButtonsVisibility(false); // 隱藏字數搜尋相關控件
|
||||||
|
|
||||||
|
SetZhuYinSingersAndButtonsVisibility(true); // 顯示注音搜尋相關控件
|
||||||
|
//SetPictureBoxArtistSearchAndButtonsVisibility(false); // 隱藏其他搜尋模式的圖片框
|
||||||
|
|
||||||
SetEnglishSingersAndButtonsVisibility(false);
|
ResetinputBox(); // 重置輸入框
|
||||||
SetPinYinSingersAndButtonsVisibility(false);
|
|
||||||
SetHandWritingForSingersAndButtonsVisibility(false);
|
// 顯示「注音歌手搜尋」的圖片框
|
||||||
SetZhuYinSingersAndButtonsVisibility(true);
|
|
||||||
SetPictureBoxArtistSearchAndButtonsVisibility(false);
|
|
||||||
pictureBoxZhuYinSingers.Visible = true;
|
pictureBoxZhuYinSingers.Visible = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// <para>從 config.ini 設定檔中載入注音符號(Phonetic Symbols)。</para>
|
||||||
|
/// <para>讀取 ini 檔的 [PhoneticSymbols] 區塊,並將「Symbols」欄位的值解析為陣列。</para>
|
||||||
|
/// </summary>
|
||||||
private void LoadPhoneticSymbolsFromConfig()
|
private void LoadPhoneticSymbolsFromConfig()
|
||||||
{
|
{
|
||||||
|
// 建立 INI 檔案解析器
|
||||||
var parser = new FileIniDataParser();
|
var parser = new FileIniDataParser();
|
||||||
|
|
||||||
|
// 設定檔路徑
|
||||||
string iniFilePath = "config.ini";
|
string iniFilePath = "config.ini";
|
||||||
|
|
||||||
|
|
||||||
IniData data;
|
IniData data;
|
||||||
|
|
||||||
|
// 以 UTF-8 編碼開啟並讀取 INI 檔案
|
||||||
using (var reader = new StreamReader(iniFilePath, Encoding.UTF8))
|
using (var reader = new StreamReader(iniFilePath, Encoding.UTF8))
|
||||||
{
|
{
|
||||||
|
// 解析 INI 檔內容
|
||||||
data = parser.ReadData(reader);
|
data = parser.ReadData(reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 取得 [PhoneticSymbols] 區塊中的 "Symbols" 欄位內容
|
||||||
string symbols = data["PhoneticSymbols"]["Symbols"];
|
string symbols = data["PhoneticSymbols"]["Symbols"];
|
||||||
|
|
||||||
|
// 將符號字串以逗號分隔,轉換為字串陣列
|
||||||
phoneticSymbols = symbols.Split(',');
|
phoneticSymbols = symbols.Split(',');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 從設定檔 (config.ini) 載入 INI 設定數據。
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>回傳解析後的 INI 設定數據 (IniData)。</returns>
|
||||||
private IniData LoadConfigData()
|
private IniData LoadConfigData()
|
||||||
{
|
{
|
||||||
var parser = new FileIniDataParser();
|
var parser = new FileIniDataParser();
|
||||||
string iniFilePath = "config.ini";
|
string iniFilePath = "config.ini";
|
||||||
|
|
||||||
|
// 使用 UTF-8 讀取 INI 檔案並解析內容
|
||||||
using (var reader = new StreamReader(iniFilePath, Encoding.UTF8))
|
using (var reader = new StreamReader(iniFilePath, Encoding.UTF8))
|
||||||
{
|
{
|
||||||
return parser.ReadData(reader);
|
return parser.ReadData(reader);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 從 INI 設定數據中讀取注音符號 (Phonetic Symbols)。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="data">已解析的 INI 設定數據。</param>
|
||||||
|
/// <returns>回傳包含注音符號的字串陣列。</returns>
|
||||||
private string[] LoadPhoneticSymbols(IniData data)
|
private string[] LoadPhoneticSymbols(IniData data)
|
||||||
{
|
{
|
||||||
|
// 從 INI 檔案的 [PhoneticSymbols] 區塊取得 Symbols 欄位值
|
||||||
string symbols = data["PhoneticSymbols"]["Symbols"];
|
string symbols = data["PhoneticSymbols"]["Symbols"];
|
||||||
|
|
||||||
|
// 以逗號分隔字串並轉換為字串陣列
|
||||||
return symbols.Split(',');
|
return symbols.Split(',');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 從 INI 設定數據中載入按鈕座標資料。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="data">已解析的 INI 設定數據。</param>
|
||||||
|
/// <param name="section">設定檔中按鈕座標所屬的區塊名稱。</param>
|
||||||
|
/// <param name="buttonCount">按鈕數量。</param>
|
||||||
|
/// <returns>回傳包含按鈕座標的陣列,每個元素是由 (X, Y, Width, Height) 組成的元組。</returns>
|
||||||
private (int X, int Y, int Width, int Height)[] LoadButtonCoordinates(IniData data, string section, int buttonCount)
|
private (int X, int Y, int Width, int Height)[] LoadButtonCoordinates(IniData data, string section, int buttonCount)
|
||||||
{
|
{
|
||||||
var buttonList = new List<(int X, int Y, int Width, int Height)>();
|
var buttonList = new List<(int X, int Y, int Width, int Height)>();
|
||||||
|
|
||||||
|
// 迴圈讀取每個按鈕的座標設定
|
||||||
for (int i = 1; i <= buttonCount; i++)
|
for (int i = 1; i <= buttonCount; i++)
|
||||||
{
|
{
|
||||||
|
// 取得按鈕座標的字串 (格式: X,Y,Width,Height)
|
||||||
var coordString = data[section][$"button{i}"];
|
var coordString = data[section][$"button{i}"];
|
||||||
var coords = coordString.Split(',');
|
var coords = coordString.Split(',');
|
||||||
buttonList.Add((int.Parse(coords[0]), int.Parse(coords[1]), int.Parse(coords[2]), int.Parse(coords[3])));
|
|
||||||
|
// 將座標資料轉換為 (X, Y, Width, Height) 元組並加入清單
|
||||||
|
buttonList.Add((
|
||||||
|
int.Parse(coords[0]), // X 座標
|
||||||
|
int.Parse(coords[1]), // Y 座標
|
||||||
|
int.Parse(coords[2]), // 寬度
|
||||||
|
int.Parse(coords[3]) // 高度
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 回傳所有按鈕座標的陣列
|
||||||
return buttonList.ToArray();
|
return buttonList.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 從 INI 設定數據中載入按鈕圖片檔案路徑資料 (包含正常、點擊、滑鼠移過圖片)。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="data">已解析的 INI 設定數據。</param>
|
||||||
|
/// <param name="section">設定檔中按鈕圖片設定所屬的區塊名稱。</param>
|
||||||
|
/// <param name="buttonCount">按鈕數量。</param>
|
||||||
|
/// <returns>回傳一個字典,鍵是按鈕名稱,值是包含正常、點擊和滑鼠移過狀態的元組。</returns>
|
||||||
private Dictionary<string, (string normal, string mouseDown, string mouseOver)> LoadButtonImages(IniData data, string section, int buttonCount)
|
private Dictionary<string, (string normal, string mouseDown, string mouseOver)> LoadButtonImages(IniData data, string section, int buttonCount)
|
||||||
{
|
{
|
||||||
var buttonImages = new Dictionary<string, (string normal, string mouseDown, string mouseOver)>();
|
var buttonImages = new Dictionary<string, (string normal, string mouseDown, string mouseOver)>();
|
||||||
|
|
||||||
|
// 迴圈讀取每個按鈕的圖片設定
|
||||||
for (int i = 0; i < 35; i++)
|
for (int i = 0; i < 35; i++)
|
||||||
{
|
{
|
||||||
|
// 讀取按鈕的三種圖片狀態:正常、點擊、滑鼠移過
|
||||||
buttonImages[$"button{i}"] = (
|
buttonImages[$"button{i}"] = (
|
||||||
data[section][$"button{i}_normal"],
|
data[section][$"button{i}_normal"], // 正常狀態圖片路徑
|
||||||
data[section][$"button{i}_mouseDown"],
|
data[section][$"button{i}_mouseDown"], // 點擊狀態圖片路徑
|
||||||
data[section][$"button{i}_mouseOver"]
|
data[section][$"button{i}_mouseOver"] // 滑鼠移過狀態圖片路徑
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 回傳包含所有按鈕圖片路徑資料的字典
|
||||||
return buttonImages;
|
return buttonImages;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 從 INI 設定數據中載入特定按鈕的座標資料。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="data">已解析的 INI 設定數據。</param>
|
||||||
|
/// <param name="section">設定檔中按鈕座標所屬的區塊名稱。</param>
|
||||||
|
/// <param name="buttonKey">指定按鈕的鍵名 (如 "button1")。</param>
|
||||||
|
/// <returns>回傳包含按鈕座標的元組 (X, Y, Width, Height)。</returns>
|
||||||
private (int X, int Y, int Width, int Height) LoadSpecialButtonCoordinates(IniData data, string section, string buttonKey)
|
private (int X, int Y, int Width, int Height) LoadSpecialButtonCoordinates(IniData data, string section, string buttonKey)
|
||||||
{
|
{
|
||||||
|
// 取得按鈕座標的字串 (格式: X,Y,Width,Height)
|
||||||
var coords = data[section][buttonKey].Split(',');
|
var coords = data[section][buttonKey].Split(',');
|
||||||
|
|
||||||
|
// 解析座標字串並回傳 (X, Y, Width, Height) 元組
|
||||||
return (int.Parse(coords[0]), int.Parse(coords[1]), int.Parse(coords[2]), int.Parse(coords[3]));
|
return (int.Parse(coords[0]), int.Parse(coords[1]), int.Parse(coords[2]), int.Parse(coords[3]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 從 INI 設定數據中載入按鈕的圖片資料 (包含正常、點擊、滑鼠移過圖片)。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="data">已解析的 INI 設定數據。</param>
|
||||||
|
/// <param name="section">設定檔中按鈕圖片設定所屬的區塊名稱。</param>
|
||||||
|
/// <returns>回傳包含按鈕三種狀態圖片路徑的元組 (normal, mouseDown, mouseOver)。</returns>
|
||||||
private (string normal, string mouseDown, string mouseOver) LoadButtonImages(IniData data, string section)
|
private (string normal, string mouseDown, string mouseOver) LoadButtonImages(IniData data, string section)
|
||||||
{
|
{
|
||||||
|
// 讀取按鈕三種狀態的圖片路徑
|
||||||
return (
|
return (
|
||||||
data[section]["normal"],
|
data[section]["normal"], // 正常狀態圖片路徑
|
||||||
data[section]["mouseDown"],
|
data[section]["mouseDown"], // 點擊狀態圖片路徑
|
||||||
data[section]["mouseOver"]
|
data[section]["mouseOver"] // 滑鼠移過狀態圖片路徑
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化並設置語音按鈕的相關資料,包括符號、座標與圖片等。
|
||||||
|
/// </summary>
|
||||||
private void InitializePhoneticButtons()
|
private void InitializePhoneticButtons()
|
||||||
{
|
{
|
||||||
|
// 載入配置資料
|
||||||
var data = LoadConfigData();
|
var data = LoadConfigData();
|
||||||
|
|
||||||
|
// 載入語音符號(如拼音、注音符號等)
|
||||||
phoneticSymbols = LoadPhoneticSymbols(data);
|
phoneticSymbols = LoadPhoneticSymbols(data);
|
||||||
|
|
||||||
|
// 載入按鈕座標資料
|
||||||
phoneticButtonCoords = LoadButtonCoordinates(data, "PhoneticButtonCoordinates", 35);
|
phoneticButtonCoords = LoadButtonCoordinates(data, "PhoneticButtonCoordinates", 35);
|
||||||
|
|
||||||
|
// 載入按鈕圖片資料
|
||||||
phoneticButtonImages = LoadButtonImages(data, "PhoneticButtonImages", 35);
|
phoneticButtonImages = LoadButtonImages(data, "PhoneticButtonImages", 35);
|
||||||
|
|
||||||
|
// 初始化語音按鈕陣列,總共有 35 個按鈕
|
||||||
phoneticButtonsForSingers = new Button[35];
|
phoneticButtonsForSingers = new Button[35];
|
||||||
|
|
||||||
|
// 設置每個語音按鈕
|
||||||
for (int i = 0; i < 35; i++)
|
for (int i = 0; i < 35; i++)
|
||||||
{
|
{
|
||||||
|
// 根據按鈕索引讀取其圖片資料
|
||||||
var buttonImages = phoneticButtonImages[$"button{i}"];
|
var buttonImages = phoneticButtonImages[$"button{i}"];
|
||||||
|
|
||||||
|
// 創建並初始化語音按鈕,設定其背景圖片
|
||||||
CreatePhoneticButton(i, buttonImages.normal, buttonImages.mouseDown, buttonImages.mouseOver);
|
CreatePhoneticButton(i, buttonImages.normal, buttonImages.mouseDown, buttonImages.mouseOver);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 創建一個語音按鈕,並為其設置圖片、座標、事件等屬性。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="index">按鈕的索引,用來獲取對應的語音符號、座標和圖片資料。</param>
|
||||||
|
/// <param name="normalImagePath">正常狀態下的圖片路徑。</param>
|
||||||
|
/// <param name="mouseDownImagePath">點擊狀態下的圖片路徑。</param>
|
||||||
|
/// <param name="mouseOverImagePath">滑鼠移過狀態下的圖片路徑。</param>
|
||||||
private void CreatePhoneticButton(int index, string normalImagePath, string mouseDownImagePath, string mouseOverImagePath)
|
private void CreatePhoneticButton(int index, string normalImagePath, string mouseDownImagePath, string mouseOverImagePath)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// 創建語音按鈕並設置其屬性
|
||||||
|
|
||||||
phoneticButtonsForSingers[index] = new Button
|
phoneticButtonsForSingers[index] = new Button
|
||||||
{
|
{
|
||||||
Name = $"phoneticButton_{phoneticSymbols[index]}",
|
Name = $"phoneticButton_{phoneticSymbols[index]}", // 按鈕名稱設為語音符號名稱
|
||||||
BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath)),
|
BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath)), // 設定背景圖片
|
||||||
BackgroundImageLayout = ImageLayout.Stretch,
|
BackgroundImageLayout = ImageLayout.Stretch, // 設定圖片拉伸樣式
|
||||||
FlatStyle = FlatStyle.Flat,
|
FlatStyle = FlatStyle.Flat, // 設定為平面風格
|
||||||
FlatAppearance = { BorderSize = 0 }
|
FlatAppearance = { BorderSize = 0 } // 設定無邊框
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 調整按鈕大小並設置位置
|
||||||
ResizeAndPositionButton(phoneticButtonsForSingers[index], phoneticButtonCoords[index].X, phoneticButtonCoords[index].Y,
|
ResizeAndPositionButton(phoneticButtonsForSingers[index], phoneticButtonCoords[index].X, phoneticButtonCoords[index].Y,
|
||||||
phoneticButtonCoords[index].Width, phoneticButtonCoords[index].Height);
|
phoneticButtonCoords[index].Width, phoneticButtonCoords[index].Height);
|
||||||
|
|
||||||
|
// 從檔案中讀取正常、點擊和滑鼠懸停狀態的圖片
|
||||||
Image normalImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath));
|
Image normalImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath));
|
||||||
Image mouseDownImage = Image.FromFile(Path.Combine(Application.StartupPath, mouseDownImagePath));
|
Image mouseDownImage = Image.FromFile(Path.Combine(Application.StartupPath, mouseDownImagePath));
|
||||||
Image mouseOverImage = Image.FromFile(Path.Combine(Application.StartupPath, mouseOverImagePath));
|
Image mouseOverImage = Image.FromFile(Path.Combine(Application.StartupPath, mouseOverImagePath));
|
||||||
|
|
||||||
|
// 設置滑鼠事件:點擊、進入、離開等,改變按鈕的背景圖片
|
||||||
phoneticButtonsForSingers[index].MouseDown += (s, e) => phoneticButtonsForSingers[index].BackgroundImage = mouseDownImage;
|
phoneticButtonsForSingers[index].MouseDown += (s, e) => phoneticButtonsForSingers[index].BackgroundImage = mouseDownImage;
|
||||||
phoneticButtonsForSingers[index].MouseUp += (s, e) => phoneticButtonsForSingers[index].BackgroundImage = normalImage;
|
phoneticButtonsForSingers[index].MouseUp += (s, e) => phoneticButtonsForSingers[index].BackgroundImage = normalImage;
|
||||||
phoneticButtonsForSingers[index].MouseEnter += (s, e) => phoneticButtonsForSingers[index].BackgroundImage = mouseOverImage;
|
phoneticButtonsForSingers[index].MouseEnter += (s, e) => phoneticButtonsForSingers[index].BackgroundImage = mouseOverImage;
|
||||||
phoneticButtonsForSingers[index].MouseLeave += (s, e) => phoneticButtonsForSingers[index].BackgroundImage = normalImage;
|
phoneticButtonsForSingers[index].MouseLeave += (s, e) => phoneticButtonsForSingers[index].BackgroundImage = normalImage;
|
||||||
|
|
||||||
|
// 設置點擊事件處理方法
|
||||||
phoneticButtonsForSingers[index].Click += PhoneticButton_Click;
|
phoneticButtonsForSingers[index].Click += PhoneticButton_Click;
|
||||||
|
|
||||||
|
// 設置按鈕的 Tag 屬性為對應的語音符號
|
||||||
phoneticButtonsForSingers[index].Tag = phoneticSymbols[index];
|
phoneticButtonsForSingers[index].Tag = phoneticSymbols[index];
|
||||||
|
|
||||||
|
// 將按鈕添加到表單的控制項集合中
|
||||||
this.Controls.Add(phoneticButtonsForSingers[index]);
|
this.Controls.Add(phoneticButtonsForSingers[index]);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
// 捕捉錯誤並輸出錯誤訊息
|
||||||
Console.WriteLine($"Error creating button at index {index}: {ex.Message}");
|
Console.WriteLine($"Error creating button at index {index}: {ex.Message}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化所有與注音歌手相關的按鈕,包括語音符號按鈕、特殊按鈕及輸入框。
|
||||||
|
/// </summary>
|
||||||
private void InitializeButtonsForZhuYinSingers()
|
private void InitializeButtonsForZhuYinSingers()
|
||||||
{
|
{
|
||||||
|
// 從配置檔案加載注音符號並初始化按鈕
|
||||||
LoadPhoneticSymbolsFromConfig();
|
LoadPhoneticSymbolsFromConfig();
|
||||||
|
|
||||||
|
// 初始化所有語音按鈕
|
||||||
InitializePhoneticButtons();
|
InitializePhoneticButtons();
|
||||||
|
|
||||||
|
// 初始化注音歌手的特殊按鈕(例如音量、搜尋等)
|
||||||
InitializeSpecialButtonsForZhuYinSingers();
|
InitializeSpecialButtonsForZhuYinSingers();
|
||||||
|
|
||||||
|
// 初始化注音歌手的輸入框
|
||||||
InitializeInputBoxZhuYinSingers();
|
InitializeInputBoxZhuYinSingers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 移除圖像周圍的白色邊框,將邊框的像素透明化。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="imagePath">待處理的圖像文件路徑。</param>
|
||||||
|
/// <returns>處理後的圖像,其中白色邊框已被去除並替換為透明。</returns>
|
||||||
private Image RemoveWhiteBorder(string imagePath)
|
private Image RemoveWhiteBorder(string imagePath)
|
||||||
{
|
{
|
||||||
|
// 創建一個 Bitmap 物件來加載圖像
|
||||||
Bitmap bmp = new Bitmap(imagePath);
|
Bitmap bmp = new Bitmap(imagePath);
|
||||||
|
|
||||||
|
// 定義圖像的矩形區域,這是我們將要操作的區域
|
||||||
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
|
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
|
||||||
|
|
||||||
|
// 鎖定圖像的位圖數據,以便進行直接修改
|
||||||
BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);
|
BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);
|
||||||
|
|
||||||
IntPtr ptr = bmpData.Scan0;
|
IntPtr ptr = bmpData.Scan0; // 獲取位圖數據的起始位置
|
||||||
int bytes = Math.Abs(bmpData.Stride) * bmp.Height;
|
int bytes = Math.Abs(bmpData.Stride) * bmp.Height; // 計算圖像的總字節數
|
||||||
byte[] rgbValues = new byte[bytes];
|
byte[] rgbValues = new byte[bytes]; // 用來存儲圖像的像素數據
|
||||||
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
|
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes); // 從圖像數據中複製像素數據到 rgbValues 陣列
|
||||||
|
|
||||||
|
// 遍歷每個像素點,檢查是否為白色邊框
|
||||||
for (int y = 0; y < bmp.Height; y++)
|
for (int y = 0; y < bmp.Height; y++)
|
||||||
{
|
{
|
||||||
for (int x = 0; x < bmp.Width; x++)
|
for (int x = 0; x < bmp.Width; x++)
|
||||||
{
|
{
|
||||||
int position = (y * bmpData.Stride) + (x * 4);
|
int position = (y * bmpData.Stride) + (x * 4); // 計算當前像素的位址
|
||||||
byte b = rgbValues[position];
|
byte b = rgbValues[position]; // 藍色分量
|
||||||
byte g = rgbValues[position + 1];
|
byte g = rgbValues[position + 1]; // 綠色分量
|
||||||
byte r = rgbValues[position + 2];
|
byte r = rgbValues[position + 2]; // 紅色分量
|
||||||
byte a = rgbValues[position + 3];
|
byte a = rgbValues[position + 3]; // alpha 分量(透明度)
|
||||||
|
|
||||||
|
|
||||||
|
// 如果當前像素在圖像邊緣且為白色 (255, 255, 255),則將其設為透明
|
||||||
if ((x < 5 || x > bmp.Width - 5 || y < 5 || y > bmp.Height - 5) && r == 255 && g == 255 && b == 255)
|
if ((x < 5 || x > bmp.Width - 5 || y < 5 || y > bmp.Height - 5) && r == 255 && g == 255 && b == 255)
|
||||||
{
|
{
|
||||||
|
// 將白色像素的 RGB 設置為 255, 255, 255 且 alpha 設為 0 (透明)
|
||||||
rgbValues[position] = 255;
|
rgbValues[position] = 255;
|
||||||
rgbValues[position + 1] = 255;
|
rgbValues[position + 1] = 255;
|
||||||
rgbValues[position + 2] = 255;
|
rgbValues[position + 2] = 255;
|
||||||
rgbValues[position + 3] = 0;
|
rgbValues[position + 3] = 0; // 透明
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 將修改後的像素數據重新複製回位圖數據
|
||||||
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
|
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
|
||||||
|
|
||||||
|
// 解鎖圖像數據
|
||||||
bmp.UnlockBits(bmpData);
|
bmp.UnlockBits(bmpData);
|
||||||
|
|
||||||
|
// 返回處理後的圖像
|
||||||
return bmp;
|
return bmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化與注音歌手相關的特殊按鈕,包括修改、清除和關閉按鈕。
|
||||||
|
/// </summary>
|
||||||
private void InitializeSpecialButtonsForZhuYinSingers()
|
private void InitializeSpecialButtonsForZhuYinSingers()
|
||||||
{
|
{
|
||||||
|
// 初始化修改按鈕
|
||||||
InitializeModifyButtonZhuYinSingers();
|
InitializeModifyButtonZhuYinSingers();
|
||||||
|
|
||||||
|
// 初始化清除按鈕
|
||||||
InitializeClearButtonZhuYinSingers();
|
InitializeClearButtonZhuYinSingers();
|
||||||
|
|
||||||
|
// 初始化關閉按鈕
|
||||||
InitializeCloseButtonZhuYinSingers();
|
InitializeCloseButtonZhuYinSingers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化「修改」按鈕,設定按鈕的坐標、圖片和點擊事件。
|
||||||
|
/// </summary>
|
||||||
private void InitializeModifyButtonZhuYinSingers()
|
private void InitializeModifyButtonZhuYinSingers()
|
||||||
{
|
{
|
||||||
|
// 加載配置數據
|
||||||
var data = LoadConfigData();
|
var data = LoadConfigData();
|
||||||
|
|
||||||
|
// 讀取按鈕坐標
|
||||||
modifyButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "modifyButtonZhuYinSingers");
|
modifyButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "modifyButtonZhuYinSingers");
|
||||||
|
|
||||||
|
// 加載按鈕圖片(正常、鼠標懸停、鼠標按下)
|
||||||
var buttonImages = LoadButtonImages(data, "ModifyButtonImagesZhuYin");
|
var buttonImages = LoadButtonImages(data, "ModifyButtonImagesZhuYin");
|
||||||
|
|
||||||
|
// 創建「修改」按鈕,並設置坐標、圖片及點擊事件
|
||||||
modifyButtonZhuYinSingers = CreateSpecialButton(
|
modifyButtonZhuYinSingers = CreateSpecialButton(
|
||||||
"btnModifyZhuYinSingers",
|
"btnModifyZhuYinSingers", // 按鈕名稱
|
||||||
modifyButtonZhuYinCoords,
|
modifyButtonZhuYinCoords, // 按鈕坐標
|
||||||
buttonImages.normal,
|
buttonImages.normal, // 正常狀態圖片
|
||||||
buttonImages.mouseOver,
|
buttonImages.mouseOver, // 鼠標懸停圖片
|
||||||
buttonImages.mouseDown,
|
buttonImages.mouseDown, // 鼠標按下圖片
|
||||||
ModifyButtonZhuYinSingers_Click
|
ModifyButtonZhuYinSingers_Click // 按鈕點擊事件
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 處理「修改」按鈕的點擊事件,該事件會刪除輸入框中的最後一個字符。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender">觸發事件的對象</param>
|
||||||
|
/// <param name="e">事件參數</param>
|
||||||
private void ModifyButtonZhuYinSingers_Click(object sender, EventArgs e)
|
private void ModifyButtonZhuYinSingers_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
// 如果輸入框不為空,且包含輸入內容,則刪除最後一個字符
|
||||||
if (this.Controls.Contains(inputBoxZhuYinSingers) && inputBoxZhuYinSingers.Text.Length > 0)
|
if (this.Controls.Contains(inputBoxZhuYinSingers) && inputBoxZhuYinSingers.Text.Length > 0)
|
||||||
{
|
{
|
||||||
inputBoxZhuYinSingers.Text = inputBoxZhuYinSingers.Text.Substring(0, inputBoxZhuYinSingers.Text.Length - 1);
|
inputBoxZhuYinSingers.Text = inputBoxZhuYinSingers.Text.Substring(0, inputBoxZhuYinSingers.Text.Length - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化「清除」按鈕,設定按鈕的坐標、圖片和點擊事件。
|
||||||
|
/// </summary>
|
||||||
private void InitializeClearButtonZhuYinSingers()
|
private void InitializeClearButtonZhuYinSingers()
|
||||||
{
|
{
|
||||||
|
// 加載配置數據
|
||||||
var data = LoadConfigData();
|
var data = LoadConfigData();
|
||||||
|
|
||||||
|
// 讀取按鈕坐標
|
||||||
clearButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "clearButtonZhuYinSingers");
|
clearButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "clearButtonZhuYinSingers");
|
||||||
|
|
||||||
|
// 加載按鈕圖片(正常、鼠標懸停、鼠標按下)
|
||||||
var buttonImages = LoadButtonImages(data, "ClearButtonImagesZhuYin");
|
var buttonImages = LoadButtonImages(data, "ClearButtonImagesZhuYin");
|
||||||
|
|
||||||
|
// 創建「清除」按鈕,並設置坐標、圖片及點擊事件
|
||||||
clearButtonZhuYinSingers = CreateSpecialButton(
|
clearButtonZhuYinSingers = CreateSpecialButton(
|
||||||
"btnClearZhuYinSingers",
|
"btnClearZhuYinSingers", // 按鈕名稱
|
||||||
clearButtonZhuYinCoords,
|
clearButtonZhuYinCoords, // 按鈕坐標
|
||||||
buttonImages.normal,
|
buttonImages.normal, // 正常狀態圖片
|
||||||
buttonImages.mouseOver,
|
buttonImages.mouseOver, // 鼠標懸停圖片
|
||||||
buttonImages.mouseDown,
|
buttonImages.mouseDown, // 鼠標按下圖片
|
||||||
ClearButtonZhuYinSingers_Click
|
ClearButtonZhuYinSingers_Click // 按鈕點擊事件
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 處理「清除」按鈕的點擊事件,該事件會清空輸入框中的所有文本。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender">觸發事件的對象</param>
|
||||||
|
/// <param name="e">事件參數</param>
|
||||||
private void ClearButtonZhuYinSingers_Click(object sender, EventArgs e)
|
private void ClearButtonZhuYinSingers_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
// 如果輸入框不為空,則清空該框的文本內容
|
||||||
if (this.Controls.Contains(inputBoxZhuYinSingers) && inputBoxZhuYinSingers.Text.Length > 0)
|
if (this.Controls.Contains(inputBoxZhuYinSingers) && inputBoxZhuYinSingers.Text.Length > 0)
|
||||||
{
|
{
|
||||||
inputBoxZhuYinSingers.Text = "";
|
inputBoxZhuYinSingers.Text = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化「關閉」按鈕,設定按鈕的坐標、圖片和點擊事件。
|
||||||
|
/// </summary>
|
||||||
private void InitializeCloseButtonZhuYinSingers()
|
private void InitializeCloseButtonZhuYinSingers()
|
||||||
{
|
{
|
||||||
|
// 加載配置數據
|
||||||
var data = LoadConfigData();
|
var data = LoadConfigData();
|
||||||
|
|
||||||
|
// 讀取按鈕坐標
|
||||||
closeButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "closeButtonZhuYinSingers");
|
closeButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "closeButtonZhuYinSingers");
|
||||||
|
|
||||||
|
// 加載按鈕圖片(正常、鼠標懸停、鼠標按下)
|
||||||
var buttonImages = LoadButtonImages(data, "CloseButtonImagesZhuYin");
|
var buttonImages = LoadButtonImages(data, "CloseButtonImagesZhuYin");
|
||||||
|
|
||||||
|
// 創建「關閉」按鈕,並設置坐標、圖片及點擊事件
|
||||||
closeButtonZhuYinSingers = CreateSpecialButton(
|
closeButtonZhuYinSingers = CreateSpecialButton(
|
||||||
"btnCloseZhuYinSingers",
|
"btnCloseZhuYinSingers", // 按鈕名稱
|
||||||
closeButtonZhuYinCoords,
|
closeButtonZhuYinCoords, // 按鈕坐標
|
||||||
buttonImages.normal,
|
buttonImages.normal, // 正常狀態圖片
|
||||||
buttonImages.mouseOver,
|
buttonImages.mouseOver, // 鼠標懸停圖片
|
||||||
buttonImages.mouseDown,
|
buttonImages.mouseDown, // 鼠標按下圖片
|
||||||
CloseButtonZhuYinSingers_Click
|
CloseButtonZhuYinSingers_Click // 按鈕點擊事件
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 「關閉」按鈕的點擊事件處理方法。
|
||||||
|
/// 隱藏 ZhuYin 歌手圖片框以及與其相關的按鈕。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender">觸發事件的對象,這裡是關閉按鈕。</param>
|
||||||
|
/// <param name="e">事件參數。</param>
|
||||||
private void CloseButtonZhuYinSingers_Click(object sender, EventArgs e)
|
private void CloseButtonZhuYinSingers_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
// 隱藏 ZhuYin 歌手圖片框
|
||||||
pictureBoxZhuYinSingers.Visible = false;
|
pictureBoxZhuYinSingers.Visible = false;
|
||||||
|
// 關閉注音搜尋的按鈕顏色
|
||||||
|
zhuyinSearchButton.BackgroundImage = zhuyinSearchNormalBackground;
|
||||||
|
// 隱藏與 ZhuYin 歌手相關的所有按鈕
|
||||||
SetZhuYinSingersAndButtonsVisibility(false);
|
SetZhuYinSingersAndButtonsVisibility(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 創建一個特殊的按鈕,並設定其顯示屬性、事件處理和位置。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">按鈕的名稱。</param>
|
||||||
|
/// <param name="coords">按鈕的坐標和大小,包含 X, Y, 寬度和高度。</param>
|
||||||
|
/// <param name="normalImagePath">按鈕正常狀態下的背景圖片路徑。</param>
|
||||||
|
/// <param name="mouseOverImagePath">鼠標懸停時按鈕的背景圖片路徑。</param>
|
||||||
|
/// <param name="mouseDownImagePath">鼠標點擊時按鈕的背景圖片路徑。</param>
|
||||||
|
/// <param name="clickEventHandler">按鈕的點擊事件處理程序。</param>
|
||||||
|
/// <returns>創建並返回的按鈕對象。</returns>
|
||||||
private Button CreateSpecialButton(string name, (int X, int Y, int Width, int Height) coords, string normalImagePath, string mouseOverImagePath, string mouseDownImagePath, EventHandler clickEventHandler)
|
private Button CreateSpecialButton(string name, (int X, int Y, int Width, int Height) coords, string normalImagePath, string mouseOverImagePath, string mouseDownImagePath, EventHandler clickEventHandler)
|
||||||
{
|
{
|
||||||
|
// 創建按鈕並設定基本屬性
|
||||||
var button = new Button
|
var button = new Button
|
||||||
{
|
{
|
||||||
Name = name,
|
Name = name,
|
||||||
@ -335,94 +547,127 @@ namespace DualScreenDemo
|
|||||||
BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath))
|
BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath))
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 設定按鈕的大小和位置
|
||||||
ResizeAndPositionButton(button, coords.X, coords.Y, coords.Width, coords.Height);
|
ResizeAndPositionButton(button, coords.X, coords.Y, coords.Width, coords.Height);
|
||||||
|
|
||||||
|
// 設定鼠標事件:進入、離開、按下、放開
|
||||||
button.MouseEnter += (sender, e) => button.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, mouseOverImagePath));
|
button.MouseEnter += (sender, e) => button.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, mouseOverImagePath));
|
||||||
button.MouseLeave += (sender, e) => button.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath));
|
button.MouseLeave += (sender, e) => button.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath));
|
||||||
button.MouseDown += (sender, e) => button.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, mouseDownImagePath));
|
button.MouseDown += (sender, e) => button.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, mouseDownImagePath));
|
||||||
button.MouseUp += (sender, e) => button.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath));
|
button.MouseUp += (sender, e) => button.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath));
|
||||||
|
|
||||||
|
// 註冊點擊事件處理
|
||||||
button.Click += clickEventHandler;
|
button.Click += clickEventHandler;
|
||||||
|
|
||||||
|
// 將按鈕添加到控件集合中
|
||||||
this.Controls.Add(button);
|
this.Controls.Add(button);
|
||||||
|
|
||||||
return button;
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化 ZhuYin 歌手的輸入框,並設定其屬性與事件處理程序。
|
||||||
|
/// </summary>
|
||||||
private void InitializeInputBoxZhuYinSingers()
|
private void InitializeInputBoxZhuYinSingers()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// 加載輸入框配置
|
||||||
LoadInputBoxConfig();
|
LoadInputBoxConfig();
|
||||||
|
|
||||||
|
// 創建一個 RichTextBox 控件來作為輸入框
|
||||||
inputBoxZhuYinSingers = new RichTextBox
|
inputBoxZhuYinSingers = new RichTextBox
|
||||||
{
|
{
|
||||||
Name = "inputBoxZhuYinSingers",
|
Name = "inputBoxZhuYinSingers",
|
||||||
ForeColor = inputBoxForeColor,
|
ForeColor = inputBoxForeColor, // 設定文字顏色
|
||||||
Font = new Font(inputBoxFontName, inputBoxFontSize, inputBoxFontStyle),
|
Font = new Font(inputBoxFontName, inputBoxFontSize, inputBoxFontStyle), // 設定字體樣式
|
||||||
ScrollBars = RichTextBoxScrollBars.None
|
ScrollBars = RichTextBoxScrollBars.None // 不顯示滾動條
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 調整和定位輸入框的位置及大小
|
||||||
ResizeAndPositionControl(inputBoxZhuYinSingers, inputBoxZhuYinCoords.X, inputBoxZhuYinCoords.Y, inputBoxZhuYinCoords.Width, inputBoxZhuYinCoords.Height);
|
ResizeAndPositionControl(inputBoxZhuYinSingers, inputBoxZhuYinCoords.X, inputBoxZhuYinCoords.Y, inputBoxZhuYinCoords.Width, inputBoxZhuYinCoords.Height);
|
||||||
|
|
||||||
|
// 設定文本變更事件,當輸入框內容改變時觸發
|
||||||
inputBoxZhuYinSingers.TextChanged += (sender, e) =>
|
inputBoxZhuYinSingers.TextChanged += (sender, e) =>
|
||||||
{
|
{
|
||||||
string searchText = inputBoxZhuYinSingers.Text;
|
string searchText = inputBoxZhuYinSingers.Text;
|
||||||
var relatedSongs = allSongs
|
|
||||||
.Where(song => (song.ArtistAPhonetic?.StartsWith(searchText, StringComparison.OrdinalIgnoreCase) ?? false) ||
|
|
||||||
(song.ArtistBPhonetic?.StartsWith(searchText, StringComparison.OrdinalIgnoreCase) ?? false))
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
|
// 使用注音符號開頭的歌手名稱進行搜索
|
||||||
|
var searchResults = allArtists.Where(artist => artist.Phonetic.StartsWith(searchText)).ToList();
|
||||||
|
|
||||||
|
// 使用注音符號包含的歌手名稱進行搜索
|
||||||
currentPage = 0;
|
currentPage = 0;
|
||||||
currentSongList = relatedSongs;
|
currentArtistList = searchResults;
|
||||||
totalPages = (int)Math.Ceiling((double)relatedSongs.Count / itemsPerPage);
|
totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage);
|
||||||
|
|
||||||
multiPagePanel.currentPageIndex = 0;
|
multiPagePanel.currentPageIndex = 0;
|
||||||
multiPagePanel.LoadSongs(relatedSongs);
|
multiPagePanel.LoadSingers(currentArtistList);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 將輸入框加入到窗體的控件集合中
|
||||||
this.Controls.Add(inputBoxZhuYinSingers);
|
this.Controls.Add(inputBoxZhuYinSingers);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
// 如果初始化過程中出現錯誤,則在控制台輸出錯誤信息
|
||||||
Console.WriteLine("Error initializing inputBoxZhuYinSingers: " + ex.Message);
|
Console.WriteLine("Error initializing inputBoxZhuYinSingers: " + ex.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 從配置文件 `config.ini` 中加載輸入框的設置,包括位置、大小、字體等屬性。
|
||||||
|
/// </summary>
|
||||||
private void LoadInputBoxConfig()
|
private void LoadInputBoxConfig()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// 創建 INI 解析器
|
||||||
var parser = new FileIniDataParser();
|
var parser = new FileIniDataParser();
|
||||||
string iniFilePath = "config.ini";
|
string iniFilePath = "config.ini"; // 配置文件的路徑
|
||||||
|
|
||||||
IniData data;
|
IniData data;
|
||||||
|
// 打開並讀取配置文件
|
||||||
using (var reader = new StreamReader(iniFilePath, Encoding.UTF8))
|
using (var reader = new StreamReader(iniFilePath, Encoding.UTF8))
|
||||||
{
|
{
|
||||||
data = parser.ReadData(reader);
|
data = parser.ReadData(reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 從配置中加載輸入框的坐標和大小
|
||||||
inputBoxZhuYinCoords = (
|
inputBoxZhuYinCoords = (
|
||||||
int.Parse(data["InputBoxZhuYinSingers"]["X"]),
|
int.Parse(data["InputBoxZhuYinSingers"]["X"]), // 輸入框的 X 坐標
|
||||||
int.Parse(data["InputBoxZhuYinSingers"]["Y"]),
|
int.Parse(data["InputBoxZhuYinSingers"]["Y"]), // 輸入框的 Y 坐標
|
||||||
int.Parse(data["InputBoxZhuYinSingers"]["Width"]),
|
int.Parse(data["InputBoxZhuYinSingers"]["Width"]), // 輸入框的寬度
|
||||||
int.Parse(data["InputBoxZhuYinSingers"]["Height"])
|
int.Parse(data["InputBoxZhuYinSingers"]["Height"]) // 輸入框的高度
|
||||||
);
|
);
|
||||||
|
|
||||||
inputBoxFontName = data["InputBoxZhuYinSingers"]["FontName"];
|
// 從配置中加載字體屬性
|
||||||
inputBoxFontSize = float.Parse(data["InputBoxZhuYinSingers"]["FontSize"]);
|
inputBoxFontName = data["InputBoxZhuYinSingers"]["FontName"]; // 字體名稱
|
||||||
inputBoxFontStyle = (FontStyle)Enum.Parse(typeof(FontStyle), data["InputBoxZhuYinSingers"]["FontStyle"]);
|
inputBoxFontSize = float.Parse(data["InputBoxZhuYinSingers"]["FontSize"]); // 字體大小
|
||||||
inputBoxForeColor = Color.FromName(data["InputBoxZhuYinSingers"]["ForeColor"]);
|
inputBoxFontStyle = (FontStyle)Enum.Parse(typeof(FontStyle), data["InputBoxZhuYinSingers"]["FontStyle"]); // 字體樣式
|
||||||
|
inputBoxForeColor = Color.FromName(data["InputBoxZhuYinSingers"]["ForeColor"]); // 字體顏色
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
// 若發生錯誤,顯示錯誤信息
|
||||||
Console.WriteLine("Error loading inputBox configuration: " + ex.Message);
|
Console.WriteLine("Error loading inputBox configuration: " + ex.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 存儲 `pictureBoxZhuYinSingers` 控制項的坐標和大小設置。
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// 這個元組包含了 `X`、`Y` 坐標以及 `Width`、`Height` 大小,用於配置 `pictureBoxZhuYinSingers` 的位置和大小。
|
||||||
|
/// </remarks>
|
||||||
private (int X, int Y, int Width, int Height) pictureBoxZhuYinSingerCoords;
|
private (int X, int Y, int Width, int Height) pictureBoxZhuYinSingerCoords;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 從配置檔案中讀取 `PictureBoxZhuYinSingers` 控制項的坐標和大小設置。
|
||||||
|
/// </summary>
|
||||||
private void LoadPictureBoxZhuYinSingerCoordsFromConfig()
|
private void LoadPictureBoxZhuYinSingerCoordsFromConfig()
|
||||||
{
|
{
|
||||||
var parser = new FileIniDataParser();
|
var parser = new FileIniDataParser();
|
||||||
@ -437,34 +682,48 @@ namespace DualScreenDemo
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 顯示圖片並根據配置文件設置顯示區域的大小和位置。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="imagePath">圖片的路徑。</param>
|
||||||
private void ShowImageOnPictureBoxZhuYinSingers(string imagePath)
|
private void ShowImageOnPictureBoxZhuYinSingers(string imagePath)
|
||||||
{
|
{
|
||||||
|
// 讀取配置文件中的顯示區域設置
|
||||||
LoadPictureBoxZhuYinSingerCoordsFromConfig();
|
LoadPictureBoxZhuYinSingerCoordsFromConfig();
|
||||||
|
|
||||||
|
// 加載原始圖片
|
||||||
Bitmap originalImage = new Bitmap(imagePath);
|
Bitmap originalImage = new Bitmap(imagePath);
|
||||||
|
|
||||||
|
// 創建顯示區域,根據配置文件中的坐標和大小設置
|
||||||
Rectangle displayArea = new Rectangle(pictureBoxZhuYinSingerCoords.X, pictureBoxZhuYinSingerCoords.Y, pictureBoxZhuYinSingerCoords.Width, pictureBoxZhuYinSingerCoords.Height);
|
Rectangle displayArea = new Rectangle(pictureBoxZhuYinSingerCoords.X, pictureBoxZhuYinSingerCoords.Y, pictureBoxZhuYinSingerCoords.Width, pictureBoxZhuYinSingerCoords.Height);
|
||||||
|
|
||||||
|
// 設置圖片到 PictureBox
|
||||||
pictureBoxZhuYinSingers.Image = originalImage;
|
pictureBoxZhuYinSingers.Image = originalImage;
|
||||||
|
|
||||||
|
// 調整 PictureBox 大小和位置
|
||||||
ResizeAndPositionPictureBox(pictureBoxZhuYinSingers, displayArea.X, displayArea.Y, displayArea.Width, displayArea.Height);
|
ResizeAndPositionPictureBox(pictureBoxZhuYinSingers, displayArea.X, displayArea.Y, displayArea.Width, displayArea.Height);
|
||||||
|
|
||||||
|
// 顯示圖片
|
||||||
pictureBoxZhuYinSingers.Visible = true;
|
pictureBoxZhuYinSingers.Visible = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 設置注音歌手相關控制項(包括圖片框、按鈕和輸入框)的顯示或隱藏狀態。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="isVisible">指定控件是否可見。True 為顯示,False 為隱藏。</param>
|
||||||
private void SetZhuYinSingersAndButtonsVisibility(bool isVisible)
|
private void SetZhuYinSingersAndButtonsVisibility(bool isVisible)
|
||||||
{
|
{
|
||||||
|
// 定義一個動作來處理控制項的顯示或隱藏
|
||||||
System.Action action = () =>
|
System.Action action = () =>
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// 暫停控制項佈局的重新排版,提高效率
|
||||||
SuspendLayout();
|
SuspendLayout();
|
||||||
|
|
||||||
|
// 檢查並設置圖片框的可見性
|
||||||
if (pictureBoxZhuYinSingers == null)
|
if (pictureBoxZhuYinSingers == null)
|
||||||
{
|
{
|
||||||
Console.WriteLine("pictureBoxZhuYinSingers is null");
|
Console.WriteLine("pictureBoxZhuYinSingers is null");
|
||||||
@ -472,9 +731,10 @@ namespace DualScreenDemo
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
pictureBoxZhuYinSingers.Visible = isVisible;
|
pictureBoxZhuYinSingers.Visible = isVisible;
|
||||||
if (isVisible) pictureBoxZhuYinSingers.BringToFront();
|
if (isVisible) pictureBoxZhuYinSingers.BringToFront(); // 如果顯示,將其置於最前
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 檢查並設置拼音按鈕的可見性
|
||||||
if (phoneticButtonsForSingers == null)
|
if (phoneticButtonsForSingers == null)
|
||||||
{
|
{
|
||||||
Console.WriteLine("phoneticButtonsForSingers is null");
|
Console.WriteLine("phoneticButtonsForSingers is null");
|
||||||
@ -490,11 +750,12 @@ namespace DualScreenDemo
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
button.Visible = isVisible;
|
button.Visible = isVisible;
|
||||||
if (isVisible) button.BringToFront();
|
if (isVisible) button.BringToFront(); // 如果顯示,將其置於最前
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 檢查並設置修改按鈕的可見性
|
||||||
if (modifyButtonZhuYinSingers == null)
|
if (modifyButtonZhuYinSingers == null)
|
||||||
{
|
{
|
||||||
Console.WriteLine("modifyButtonZhuYinSingers is null");
|
Console.WriteLine("modifyButtonZhuYinSingers is null");
|
||||||
@ -502,9 +763,10 @@ namespace DualScreenDemo
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
modifyButtonZhuYinSingers.Visible = isVisible;
|
modifyButtonZhuYinSingers.Visible = isVisible;
|
||||||
if (isVisible) modifyButtonZhuYinSingers.BringToFront();
|
if (isVisible) modifyButtonZhuYinSingers.BringToFront(); // 如果顯示,將其置於最前
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 檢查並設置清除按鈕的可見性
|
||||||
if (clearButtonZhuYinSingers == null)
|
if (clearButtonZhuYinSingers == null)
|
||||||
{
|
{
|
||||||
Console.WriteLine("clearButtonZhuYinSingers is null");
|
Console.WriteLine("clearButtonZhuYinSingers is null");
|
||||||
@ -512,9 +774,10 @@ namespace DualScreenDemo
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
clearButtonZhuYinSingers.Visible = isVisible;
|
clearButtonZhuYinSingers.Visible = isVisible;
|
||||||
if (isVisible) clearButtonZhuYinSingers.BringToFront();
|
if (isVisible) clearButtonZhuYinSingers.BringToFront(); // 如果顯示,將其置於最前
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 檢查並設置關閉按鈕的可見性
|
||||||
if (closeButtonZhuYinSingers == null)
|
if (closeButtonZhuYinSingers == null)
|
||||||
{
|
{
|
||||||
Console.WriteLine("closeButtonZhuYinSingers is null");
|
Console.WriteLine("closeButtonZhuYinSingers is null");
|
||||||
@ -522,9 +785,10 @@ namespace DualScreenDemo
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
closeButtonZhuYinSingers.Visible = isVisible;
|
closeButtonZhuYinSingers.Visible = isVisible;
|
||||||
if (isVisible) closeButtonZhuYinSingers.BringToFront();
|
if (isVisible) closeButtonZhuYinSingers.BringToFront(); // 如果顯示,將其置於最前
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 檢查並設置輸入框的可見性
|
||||||
if (inputBoxZhuYinSingers == null)
|
if (inputBoxZhuYinSingers == null)
|
||||||
{
|
{
|
||||||
Console.WriteLine("inputBoxZhuYinSingers is null");
|
Console.WriteLine("inputBoxZhuYinSingers is null");
|
||||||
@ -532,19 +796,20 @@ namespace DualScreenDemo
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
inputBoxZhuYinSingers.Visible = isVisible;
|
inputBoxZhuYinSingers.Visible = isVisible;
|
||||||
if (isVisible) inputBoxZhuYinSingers.BringToFront();
|
if (isVisible) inputBoxZhuYinSingers.BringToFront(); // 如果顯示,將其置於最前
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 恢復控制項的佈局重新排版
|
||||||
ResumeLayout();
|
ResumeLayout();
|
||||||
PerformLayout();
|
PerformLayout();
|
||||||
|
|
||||||
|
// 刷新所有控制項的顯示
|
||||||
pictureBoxZhuYinSingers?.Refresh();
|
pictureBoxZhuYinSingers?.Refresh();
|
||||||
if (phoneticButtonsForSingers != null)
|
if (phoneticButtonsForSingers != null)
|
||||||
{
|
{
|
||||||
foreach (var button in phoneticButtonsForSingers)
|
foreach (var button in phoneticButtonsForSingers)
|
||||||
{
|
{
|
||||||
button?.Refresh();
|
button?.Refresh(); // 刷新每個按鈕
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
modifyButtonZhuYinSingers?.Refresh();
|
modifyButtonZhuYinSingers?.Refresh();
|
||||||
@ -558,14 +823,16 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 檢查是否需要在主執行緒外執行
|
||||||
if (this.InvokeRequired)
|
if (this.InvokeRequired)
|
||||||
{
|
{
|
||||||
this.Invoke(action);
|
this.Invoke(action); // 如果需要,透過主執行緒執行
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
action();
|
action(); // 否則直接執行
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -45,8 +45,11 @@ namespace DualScreenDemo
|
|||||||
SetZhuYinSingersAndButtonsVisibility(false);
|
SetZhuYinSingersAndButtonsVisibility(false);
|
||||||
SetPinYinSingersAndButtonsVisibility(false);
|
SetPinYinSingersAndButtonsVisibility(false);
|
||||||
SetHandWritingForSingersAndButtonsVisibility(false);
|
SetHandWritingForSingersAndButtonsVisibility(false);
|
||||||
|
SetWordCountSingersAndButtonsVisibility(false); // 隱藏字數搜尋相關控件
|
||||||
|
|
||||||
SetEnglishSingersAndButtonsVisibility(true);
|
SetEnglishSingersAndButtonsVisibility(true);
|
||||||
SetPictureBoxArtistSearchAndButtonsVisibility(false);
|
//SetPictureBoxArtistSearchAndButtonsVisibility(false);
|
||||||
|
ResetinputBox();
|
||||||
pictureBoxEnglishSingers.Visible = true;
|
pictureBoxEnglishSingers.Visible = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -268,6 +271,7 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
|
|
||||||
pictureBoxEnglishSingers.Visible = false;
|
pictureBoxEnglishSingers.Visible = false;
|
||||||
|
englishSearchButton.BackgroundImage = englishSearchNormalBackground;
|
||||||
SetEnglishSingersAndButtonsVisibility(false);
|
SetEnglishSingersAndButtonsVisibility(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,9 +45,11 @@ namespace DualScreenDemo
|
|||||||
SetZhuYinSingersAndButtonsVisibility(false);
|
SetZhuYinSingersAndButtonsVisibility(false);
|
||||||
SetEnglishSingersAndButtonsVisibility(false);
|
SetEnglishSingersAndButtonsVisibility(false);
|
||||||
SetPinYinSingersAndButtonsVisibility(false);
|
SetPinYinSingersAndButtonsVisibility(false);
|
||||||
SetPictureBoxArtistSearchAndButtonsVisibility(false);
|
SetWordCountSingersAndButtonsVisibility(false); // 隱藏字數搜尋相關控件
|
||||||
|
//SetPictureBoxArtistSearchAndButtonsVisibility(false);
|
||||||
SetHandWritingForSingersAndButtonsVisibility(true);
|
SetHandWritingForSingersAndButtonsVisibility(true);
|
||||||
|
|
||||||
|
ResetinputBox();
|
||||||
this.ResumeLayout();
|
this.ResumeLayout();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -298,7 +300,7 @@ namespace DualScreenDemo
|
|||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
|
|
||||||
SetHandWritingForSingersAndButtonsVisibility(false);
|
SetHandWritingForSingersAndButtonsVisibility(false);
|
||||||
|
handWritingSearchButton.BackgroundImage = handWritingSearchNormalBackground;
|
||||||
|
|
||||||
this.ResumeLayout();
|
this.ResumeLayout();
|
||||||
}
|
}
|
||||||
|
@ -38,10 +38,13 @@ namespace DualScreenDemo
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
SetZhuYinSingersAndButtonsVisibility(false);
|
SetZhuYinSingersAndButtonsVisibility(false); // 隱藏注音搜尋相關控件
|
||||||
SetEnglishSingersAndButtonsVisibility(false);
|
SetEnglishSingersAndButtonsVisibility(false); // 隱藏英文搜尋相關控件
|
||||||
|
SetWordCountSingersAndButtonsVisibility(false); // 隱藏字數搜尋相關控件
|
||||||
|
SetHandWritingForSingersAndButtonsVisibility(false); // 隱藏手寫搜尋相關控件
|
||||||
|
|
||||||
SetPinYinSingersAndButtonsVisibility(true);
|
SetPinYinSingersAndButtonsVisibility(true);
|
||||||
SetPictureBoxArtistSearchAndButtonsVisibility(false);
|
//SetPictureBoxArtistSearchAndButtonsVisibility(false);
|
||||||
pictureBoxPinYinSingers.Visible = true;
|
pictureBoxPinYinSingers.Visible = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,6 +171,7 @@ namespace DualScreenDemo
|
|||||||
private void CloseButtonPinYinSingers_Click(object sender, EventArgs e)
|
private void CloseButtonPinYinSingers_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
pictureBoxPinYinSingers.Visible = false;
|
pictureBoxPinYinSingers.Visible = false;
|
||||||
|
pinyinSearchButton.BackgroundImage = pinyinSearchNormalBackground;
|
||||||
SetPinYinSingersAndButtonsVisibility(false);
|
SetPinYinSingersAndButtonsVisibility(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -218,6 +222,16 @@ namespace DualScreenDemo
|
|||||||
|
|
||||||
multiPagePanel.currentPageIndex = 0;
|
multiPagePanel.currentPageIndex = 0;
|
||||||
multiPagePanel.LoadSongs(currentSongList);
|
multiPagePanel.LoadSongs(currentSongList);
|
||||||
|
/////////////////////////////////////////////////////////////////
|
||||||
|
/*string searchText = inputBoxPinYinSingers.Text;
|
||||||
|
var searchResults = allArtists.Where(artist => artist.Name.Replace(" ", "").StartsWith(searchText)).ToList();
|
||||||
|
|
||||||
|
currentPage = 0;
|
||||||
|
currentArtistList = searchResults;
|
||||||
|
totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage);
|
||||||
|
|
||||||
|
multiPagePanel.currentPageIndex = 0;
|
||||||
|
multiPagePanel.LoadSingers(currentArtistList);*/
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -90,7 +90,7 @@ namespace DualScreenDemo
|
|||||||
|
|
||||||
InitializeSearchButton(ref pinyinSearchButton, "pinyinSearchButton", 1214, 356, 209, 58, ref pinyinSearchNormalBackground, ref pinyinSearchActiveBackground, normalStateImageArtistQuery, mouseDownImageArtistQuery, PinyinSingerSearchButton_Click);
|
InitializeSearchButton(ref pinyinSearchButton, "pinyinSearchButton", 1214, 356, 209, 58, ref pinyinSearchNormalBackground, ref pinyinSearchActiveBackground, normalStateImageArtistQuery, mouseDownImageArtistQuery, PinyinSingerSearchButton_Click);
|
||||||
|
|
||||||
InitializeSearchButton(ref wordCountSearchButton, "strokeCountSearchButton", 1214, 418, 209, 59, ref wordCountSearchNormalBackground, ref wordCountSearchActiveBackground, normalStateImageArtistQuery, mouseDownImageArtistQuery, WordCountSearchButton_Click);
|
InitializeSearchButton(ref wordCountSearchButton, "workCountSearchButton", 1214, 418, 209, 59, ref wordCountSearchNormalBackground, ref wordCountSearchActiveBackground, normalStateImageArtistQuery, mouseDownImageArtistQuery, WordCountSearchSingersButton_Click);
|
||||||
|
|
||||||
InitializeSearchButton(ref handWritingSearchButton, "handWritingSearchButton", 1214, 481, 209, 59, ref handWritingSearchNormalBackground, ref handWritingSearchActiveBackground, normalStateImageArtistQuery, mouseDownImageArtistQuery, HandWritingSearchButtonForSingers_Click);
|
InitializeSearchButton(ref handWritingSearchButton, "handWritingSearchButton", 1214, 481, 209, 59, ref handWritingSearchNormalBackground, ref handWritingSearchActiveBackground, normalStateImageArtistQuery, mouseDownImageArtistQuery, HandWritingSearchButtonForSingers_Click);
|
||||||
}
|
}
|
||||||
|
@ -13,16 +13,22 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
public partial class PrimaryForm
|
public partial class PrimaryForm
|
||||||
{
|
{
|
||||||
|
// 注音歌曲的 PictureBox
|
||||||
private PictureBox pictureBoxZhuYinSongs;
|
private PictureBox pictureBoxZhuYinSongs;
|
||||||
|
//存放注音按鈕的陣列
|
||||||
private Button[] phoneticButtonsForSongs;
|
private Button[] phoneticButtonsForSongs;
|
||||||
|
//特殊功能按鈕(修改、清除、關閉)
|
||||||
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>
|
||||||
|
/// 注音歌曲搜尋按鈕點擊事件
|
||||||
|
/// </summary>
|
||||||
private void ZhuyinSearchSongsButton_Click(object sender, EventArgs e)
|
private void ZhuyinSearchSongsButton_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
//更新搜尋模式按鈕的背景圖
|
||||||
zhuyinSearchSongButton.BackgroundImage = zhuyinSearchSongActiveBackground;
|
zhuyinSearchSongButton.BackgroundImage = zhuyinSearchSongActiveBackground;
|
||||||
englishSearchSongButton.BackgroundImage = englishSearchSongNormalBackground;
|
englishSearchSongButton.BackgroundImage = englishSearchSongNormalBackground;
|
||||||
pinyinSearchSongButton.BackgroundImage = pinyinSearchSongNormalBackground;
|
pinyinSearchSongButton.BackgroundImage = pinyinSearchSongNormalBackground;
|
||||||
@ -30,199 +36,320 @@ namespace DualScreenDemo
|
|||||||
handWritingSearchSongButton.BackgroundImage = handWritingSearchSongNormalBackground;
|
handWritingSearchSongButton.BackgroundImage = handWritingSearchSongNormalBackground;
|
||||||
numberSearchSongButton.BackgroundImage = numberSearchSongNormalBackground;
|
numberSearchSongButton.BackgroundImage = numberSearchSongNormalBackground;
|
||||||
|
|
||||||
|
// 讀取 config.ini 並獲取注音圖片的路徑
|
||||||
var configData = LoadConfigData();
|
var configData = LoadConfigData();
|
||||||
/* 抓注音圖檔(ZhuYinSongs) 來自configData的資料 */
|
|
||||||
/* 要確認路經需確認configData內容值 */
|
|
||||||
string imagePath = Path.Combine(Application.StartupPath, configData["ImagePaths"]["ZhuYinSongs"]);
|
string imagePath = Path.Combine(Application.StartupPath, configData["ImagePaths"]["ZhuYinSongs"]);
|
||||||
|
//顯示注音歌曲圖片
|
||||||
ShowImageOnPictureBoxZhuYinSongs(Path.Combine(Application.StartupPath, imagePath));
|
ShowImageOnPictureBoxZhuYinSongs(Path.Combine(Application.StartupPath, imagePath));
|
||||||
|
|
||||||
|
|
||||||
|
//設定不同模式的UI顯示
|
||||||
SetZhuYinSingersAndButtonsVisibility(false);
|
SetWordCountSongsAndButtonsVisibility(false); // 隱藏字數搜尋相關控件
|
||||||
SetEnglishSingersAndButtonsVisibility(false);
|
SetEnglishSongsAndButtonsVisibility(false);
|
||||||
SetPinYinSingersAndButtonsVisibility(false);
|
SetPinYinSongsAndButtonsVisibility(false);
|
||||||
SetHandWritingForSingersAndButtonsVisibility(false);
|
SetHandWritingForSongsAndButtonsVisibility(false);
|
||||||
|
SetSongIDSearchAndButtonsVisibility(false);
|
||||||
SetZhuYinSongsAndButtonsVisibility(true);
|
SetZhuYinSongsAndButtonsVisibility(true);
|
||||||
|
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()
|
private void InitializePhoneticButtonsForSongs()
|
||||||
{
|
{
|
||||||
|
// 1. 從設定檔 (config.ini) 讀取配置數據,包含按鈕座標、圖片等
|
||||||
var data = LoadConfigData();
|
var data = LoadConfigData();
|
||||||
|
|
||||||
|
// 2. 讀取注音符號列表,這些符號將用於顯示在按鈕上
|
||||||
phoneticSymbols = LoadPhoneticSymbols(data);
|
phoneticSymbols = LoadPhoneticSymbols(data);
|
||||||
|
|
||||||
|
// 3. 從設定檔載入 **注音按鈕的座標**,每個按鈕都有對應的 (X, Y, Width, Height)
|
||||||
phoneticButtonCoords = LoadButtonCoordinates(data, "PhoneticButtonCoordinates", 35);
|
phoneticButtonCoords = LoadButtonCoordinates(data, "PhoneticButtonCoordinates", 35);
|
||||||
|
|
||||||
|
// 4. 從設定檔載入 **注音按鈕的圖片**,每個按鈕都有正常、按下、懸停三種狀態
|
||||||
phoneticButtonImages = LoadButtonImages(data, "PhoneticButtonImages", 35);
|
phoneticButtonImages = LoadButtonImages(data, "PhoneticButtonImages", 35);
|
||||||
|
|
||||||
|
// 5. 建立 35 個注音按鈕的陣列 (每個按鈕對應一個注音符號)
|
||||||
phoneticButtonsForSongs = new Button[35];
|
phoneticButtonsForSongs = new Button[35];
|
||||||
|
|
||||||
|
// 6. 迴圈建立所有的注音按鈕
|
||||||
for (int i = 0; i < 35; i++)
|
for (int i = 0; i < 35; i++)
|
||||||
{
|
{
|
||||||
|
// 取得當前按鈕的圖片 (從已載入的 phoneticButtonImages 字典中獲取)
|
||||||
var buttonImages = phoneticButtonImages[$"button{i}"];
|
var buttonImages = phoneticButtonImages[$"button{i}"];
|
||||||
CreatePhoneticButtonForSongs(i, buttonImages.normal, buttonImages.mouseDown, buttonImages.mouseOver);
|
|
||||||
|
// 建立單個注音按鈕,並設定其圖片與點擊事件
|
||||||
|
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)
|
private void CreatePhoneticButtonForSongs(int index, string normalImagePath, string mouseDownImagePath, string mouseOverImagePath)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// 1. 創建按鈕並初始化屬性
|
||||||
|
|
||||||
phoneticButtonsForSongs[index] = new Button
|
phoneticButtonsForSongs[index] = new Button
|
||||||
{
|
{
|
||||||
Name = $"phoneticButton_{phoneticSymbols[index]}",
|
Name = $"phoneticButton_{phoneticSymbols[index]}", // 設定按鈕名稱,方便識別
|
||||||
BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath)),
|
BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath)), // 設定預設背景圖
|
||||||
BackgroundImageLayout = ImageLayout.Stretch,
|
BackgroundImageLayout = ImageLayout.Stretch, // 背景圖自動填滿按鈕
|
||||||
FlatStyle = FlatStyle.Flat,
|
FlatStyle = FlatStyle.Flat, // 設定按鈕為扁平樣式
|
||||||
FlatAppearance = { BorderSize = 0 }
|
FlatAppearance = { BorderSize = 0 } // 移除按鈕的邊框
|
||||||
};
|
};
|
||||||
|
|
||||||
ResizeAndPositionButton(phoneticButtonsForSongs[index], phoneticButtonCoords[index].X, phoneticButtonCoords[index].Y,
|
// 2. 設定按鈕的大小與位置
|
||||||
phoneticButtonCoords[index].Width, phoneticButtonCoords[index].Height);
|
ResizeAndPositionButton(
|
||||||
|
phoneticButtonsForSongs[index],
|
||||||
|
phoneticButtonCoords[index].X,
|
||||||
|
phoneticButtonCoords[index].Y,
|
||||||
|
phoneticButtonCoords[index].Width,
|
||||||
|
phoneticButtonCoords[index].Height
|
||||||
|
);
|
||||||
|
|
||||||
|
// 3. 載入三種狀態的圖片
|
||||||
Image normalImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath));
|
Image normalImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath));
|
||||||
Image mouseDownImage = Image.FromFile(Path.Combine(Application.StartupPath, mouseDownImagePath));
|
Image mouseDownImage = Image.FromFile(Path.Combine(Application.StartupPath, mouseDownImagePath));
|
||||||
Image mouseOverImage = Image.FromFile(Path.Combine(Application.StartupPath, mouseOverImagePath));
|
Image mouseOverImage = Image.FromFile(Path.Combine(Application.StartupPath, mouseOverImagePath));
|
||||||
|
|
||||||
|
// 4. 設定滑鼠事件,改變背景圖
|
||||||
phoneticButtonsForSongs[index].MouseDown += (s, e) => phoneticButtonsForSongs[index].BackgroundImage = mouseDownImage;
|
phoneticButtonsForSongs[index].MouseDown += (s, e) => phoneticButtonsForSongs[index].BackgroundImage = mouseDownImage;
|
||||||
phoneticButtonsForSongs[index].MouseUp += (s, e) => phoneticButtonsForSongs[index].BackgroundImage = normalImage;
|
phoneticButtonsForSongs[index].MouseUp += (s, e) => phoneticButtonsForSongs[index].BackgroundImage = normalImage;
|
||||||
phoneticButtonsForSongs[index].MouseEnter += (s, e) => phoneticButtonsForSongs[index].BackgroundImage = mouseOverImage;
|
phoneticButtonsForSongs[index].MouseEnter += (s, e) => phoneticButtonsForSongs[index].BackgroundImage = mouseOverImage;
|
||||||
phoneticButtonsForSongs[index].MouseLeave += (s, e) => phoneticButtonsForSongs[index].BackgroundImage = normalImage;
|
phoneticButtonsForSongs[index].MouseLeave += (s, e) => phoneticButtonsForSongs[index].BackgroundImage = normalImage;
|
||||||
|
|
||||||
|
// 5. 設定按鈕的點擊事件 (當按下按鈕時,觸發 PhoneticButton_Click)
|
||||||
phoneticButtonsForSongs[index].Click += PhoneticButton_Click;
|
phoneticButtonsForSongs[index].Click += PhoneticButton_Click;
|
||||||
|
|
||||||
|
// 6. 存入對應的注音符號,方便之後的處理
|
||||||
phoneticButtonsForSongs[index].Tag = phoneticSymbols[index];
|
phoneticButtonsForSongs[index].Tag = phoneticSymbols[index];
|
||||||
|
|
||||||
|
// 7. 將按鈕加入視窗
|
||||||
this.Controls.Add(phoneticButtonsForSongs[index]);
|
this.Controls.Add(phoneticButtonsForSongs[index]);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
// 例外處理,確保按鈕建立失敗時不影響其他部分
|
||||||
Console.WriteLine($"Error creating button at index {index}: {ex.Message}");
|
Console.WriteLine($"Error creating button at index {index}: {ex.Message}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化注音輸入界面的所有按鈕和輸入框。
|
||||||
|
/// </summary>
|
||||||
private void InitializeButtonsForZhuYinSongs()
|
private void InitializeButtonsForZhuYinSongs()
|
||||||
{
|
{
|
||||||
|
// 1. 從設定檔 (config.ini) 載入注音符號
|
||||||
LoadPhoneticSymbolsFromConfig();
|
LoadPhoneticSymbolsFromConfig();
|
||||||
|
|
||||||
|
// 2. 初始化 35 個注音按鈕
|
||||||
InitializePhoneticButtonsForSongs();
|
InitializePhoneticButtonsForSongs();
|
||||||
|
|
||||||
|
// 3. 初始化特殊按鈕 (例如:刪除、確定、返回按鈕)
|
||||||
InitializeSpecialButtonsForZhuYinSongs();
|
InitializeSpecialButtonsForZhuYinSongs();
|
||||||
|
|
||||||
|
// 4. 初始化輸入框 (用於顯示使用者輸入的注音符號)
|
||||||
InitializeInputBoxZhuYinSongs();
|
InitializeInputBoxZhuYinSongs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化注音輸入界面的特殊按鈕,包括「修改」、「清除」和「關閉」。
|
||||||
|
/// </summary>
|
||||||
private void InitializeSpecialButtonsForZhuYinSongs()
|
private void InitializeSpecialButtonsForZhuYinSongs()
|
||||||
{
|
{
|
||||||
|
// 1. 初始化「修改」按鈕 (刪除上一個輸入的注音符號)
|
||||||
InitializeModifyButtonZhuYinSongs();
|
InitializeModifyButtonZhuYinSongs();
|
||||||
|
|
||||||
|
// 2. 初始化「清除」按鈕 (清空所有輸入內容)
|
||||||
InitializeClearButtonZhuYinSongs();
|
InitializeClearButtonZhuYinSongs();
|
||||||
|
|
||||||
|
// 3. 初始化「關閉」按鈕 (關閉注音輸入介面)
|
||||||
InitializeCloseButtonZhuYinSongs();
|
InitializeCloseButtonZhuYinSongs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化「修改」按鈕,讓使用者可以刪除上一個輸入的注音符號。
|
||||||
|
/// </summary>
|
||||||
private void InitializeModifyButtonZhuYinSongs()
|
private void InitializeModifyButtonZhuYinSongs()
|
||||||
{
|
{
|
||||||
|
// 1. 讀取設定檔 (config.ini) 來獲取特殊按鈕的座標與圖像資訊
|
||||||
var data = LoadConfigData();
|
var data = LoadConfigData();
|
||||||
|
|
||||||
|
// 2. 從設定檔讀取「修改」按鈕的座標數據
|
||||||
modifyButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "modifyButtonZhuYinSongs");
|
modifyButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "modifyButtonZhuYinSongs");
|
||||||
|
|
||||||
|
// 3. 從設定檔讀取「修改」按鈕的圖像 (Normal、MouseOver、MouseDown)
|
||||||
var buttonImages = LoadButtonImages(data, "ModifyButtonImagesZhuYin");
|
var buttonImages = LoadButtonImages(data, "ModifyButtonImagesZhuYin");
|
||||||
|
|
||||||
|
// 4. 使用座標與圖像來建立「修改」按鈕,並綁定點擊事件
|
||||||
modifyButtonZhuYinSongs = CreateSpecialButton(
|
modifyButtonZhuYinSongs = CreateSpecialButton(
|
||||||
"btnModifyZhuYinSongs",
|
"btnModifyZhuYinSongs", // 按鈕名稱
|
||||||
modifyButtonZhuYinCoords,
|
modifyButtonZhuYinCoords, // 按鈕座標
|
||||||
buttonImages.normal,
|
buttonImages.normal, // 預設 (normal) 圖像
|
||||||
buttonImages.mouseOver,
|
buttonImages.mouseOver, // 滑鼠移過 (hover) 圖像
|
||||||
buttonImages.mouseDown,
|
buttonImages.mouseDown, // 按下 (pressed) 圖像
|
||||||
ModifyButtonZhuYinSongs_Click
|
ModifyButtonZhuYinSongs_Click // 綁定按鈕點擊事件
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 「修改」按鈕的點擊事件,刪除輸入框內的最後一個注音符號。
|
||||||
|
/// </summary>
|
||||||
private void ModifyButtonZhuYinSongs_Click(object sender, EventArgs e)
|
private void ModifyButtonZhuYinSongs_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
// 1. 確保輸入框 (inputBoxZhuYinSongs) 存在於目前的視窗控制項中
|
||||||
if (this.Controls.Contains(inputBoxZhuYinSongs) && inputBoxZhuYinSongs.Text.Length > 0)
|
if (this.Controls.Contains(inputBoxZhuYinSongs) && inputBoxZhuYinSongs.Text.Length > 0)
|
||||||
{
|
{
|
||||||
|
// 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()
|
private void InitializeClearButtonZhuYinSongs()
|
||||||
{
|
{
|
||||||
|
// 1. 從設定檔 (config.ini) 讀取配置數據
|
||||||
var data = LoadConfigData();
|
var data = LoadConfigData();
|
||||||
|
|
||||||
|
// 2. 讀取「清除」按鈕的座標設定 (從 "SpecialButtonCoordinates" 內的 "clearButtonZhuYinSongs" 取得)
|
||||||
clearButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "clearButtonZhuYinSongs");
|
clearButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "clearButtonZhuYinSongs");
|
||||||
|
|
||||||
|
// 3. 讀取「清除」按鈕的圖片 (正常、滑鼠懸停、按下狀態)
|
||||||
var buttonImages = LoadButtonImages(data, "ClearButtonImagesZhuYin");
|
var buttonImages = LoadButtonImages(data, "ClearButtonImagesZhuYin");
|
||||||
|
|
||||||
|
// 4. 建立「清除」按鈕,並設定對應的事件處理函式 (ClearButtonZhuYinSongs_Click)
|
||||||
clearButtonZhuYinSongs = CreateSpecialButton(
|
clearButtonZhuYinSongs = CreateSpecialButton(
|
||||||
"btnClearZhuYinSongs",
|
"btnClearZhuYinSongs", // 按鈕名稱
|
||||||
clearButtonZhuYinCoords,
|
clearButtonZhuYinCoords, // 按鈕座標與大小
|
||||||
buttonImages.normal,
|
buttonImages.normal, // 正常狀態圖片
|
||||||
buttonImages.mouseOver,
|
buttonImages.mouseOver, // 滑鼠懸停圖片
|
||||||
buttonImages.mouseDown,
|
buttonImages.mouseDown, // 按下時圖片
|
||||||
ClearButtonZhuYinSongs_Click
|
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),且輸入框內有文字
|
||||||
if (this.Controls.Contains(inputBoxZhuYinSongs) && inputBoxZhuYinSongs.Text.Length > 0)
|
if (this.Controls.Contains(inputBoxZhuYinSongs) && inputBoxZhuYinSongs.Text.Length > 0)
|
||||||
{
|
{
|
||||||
|
// 2. 清空輸入框內容
|
||||||
inputBoxZhuYinSongs.Text = "";
|
inputBoxZhuYinSongs.Text = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化注音輸入的關閉按鈕,從設定檔讀取按鈕座標與圖片,並設置點擊事件
|
||||||
|
/// </summary>
|
||||||
private void InitializeCloseButtonZhuYinSongs()
|
private void InitializeCloseButtonZhuYinSongs()
|
||||||
{
|
{
|
||||||
|
// 讀取設定檔數據
|
||||||
var data = LoadConfigData();
|
var data = LoadConfigData();
|
||||||
|
|
||||||
|
// 從設定檔讀取關閉按鈕的座標
|
||||||
closeButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "closeButtonZhuYinSongs");
|
closeButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "closeButtonZhuYinSongs");
|
||||||
|
|
||||||
|
// 從設定檔讀取關閉按鈕的圖片
|
||||||
var buttonImages = LoadButtonImages(data, "CloseButtonImagesZhuYin");
|
var buttonImages = LoadButtonImages(data, "CloseButtonImagesZhuYin");
|
||||||
|
|
||||||
|
// 創建關閉按鈕並綁定點擊事件
|
||||||
closeButtonZhuYinSongs = CreateSpecialButton(
|
closeButtonZhuYinSongs = CreateSpecialButton(
|
||||||
"btnCloseZhuYinSongs",
|
"btnCloseZhuYinSongs", // 按鈕名稱
|
||||||
closeButtonZhuYinCoords,
|
closeButtonZhuYinCoords, // 按鈕座標
|
||||||
buttonImages.normal,
|
buttonImages.normal, // 正常狀態圖片
|
||||||
buttonImages.mouseOver,
|
buttonImages.mouseOver, // 滑鼠懸停圖片
|
||||||
buttonImages.mouseDown,
|
buttonImages.mouseDown, // 按下圖片
|
||||||
CloseButtonZhuYinSongs_Click
|
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)
|
||||||
{
|
{
|
||||||
|
// 隱藏注音輸入的圖片
|
||||||
pictureBoxZhuYinSongs.Visible = false;
|
pictureBoxZhuYinSongs.Visible = false;
|
||||||
|
zhuyinSearchSongButton.BackgroundImage = zhuyinSearchSongNormalBackground;
|
||||||
|
// 隱藏注音輸入的所有按鈕與介面元素
|
||||||
SetZhuYinSongsAndButtonsVisibility(false);
|
SetZhuYinSongsAndButtonsVisibility(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化注音輸入框 (RichTextBox),設定外觀、事件處理及位置大小
|
||||||
|
/// </summary>
|
||||||
private void InitializeInputBoxZhuYinSongs()
|
private void InitializeInputBoxZhuYinSongs()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// 讀取輸入框的配置,例如字體、顏色、大小等
|
||||||
LoadInputBoxConfig();
|
LoadInputBoxConfig();
|
||||||
|
|
||||||
|
// 建立注音輸入框並套用讀取到的設定
|
||||||
inputBoxZhuYinSongs = new RichTextBox
|
inputBoxZhuYinSongs = new RichTextBox
|
||||||
{
|
{
|
||||||
Name = "inputBoxZhuYinSongs",
|
Name = "inputBoxZhuYinSongs",
|
||||||
ForeColor = inputBoxForeColor,
|
ForeColor = inputBoxForeColor, // 設定文字顏色
|
||||||
Font = new Font(inputBoxFontName, inputBoxFontSize, inputBoxFontStyle),
|
Font = new Font(inputBoxFontName, inputBoxFontSize, inputBoxFontStyle), // 設定字體
|
||||||
ScrollBars = RichTextBoxScrollBars.None
|
ScrollBars = RichTextBoxScrollBars.None // 禁用滾動條
|
||||||
};
|
};
|
||||||
|
|
||||||
ResizeAndPositionControl(inputBoxZhuYinSongs, inputBoxZhuYinCoords.X, inputBoxZhuYinCoords.Y, inputBoxZhuYinCoords.Width, inputBoxZhuYinCoords.Height);
|
// 調整輸入框大小與位置
|
||||||
|
ResizeAndPositionControl(inputBoxZhuYinSongs, inputBoxZhuYinCoords.X, inputBoxZhuYinCoords.Y,
|
||||||
|
inputBoxZhuYinCoords.Width, inputBoxZhuYinCoords.Height);
|
||||||
|
|
||||||
|
// 設定文字變更事件,用來即時篩選歌曲
|
||||||
inputBoxZhuYinSongs.TextChanged += (sender, e) =>
|
inputBoxZhuYinSongs.TextChanged += (sender, e) =>
|
||||||
{
|
{
|
||||||
/* 搜尋結果顯示到前歌單點選 */
|
string searchText = inputBoxZhuYinSongs.Text; // 取得輸入內容
|
||||||
string searchText = inputBoxZhuYinSongs.Text;
|
|
||||||
|
// 根據輸入的注音篩選歌曲清單
|
||||||
var searchResults = allSongs.Where(song => song.PhoneticNotation.StartsWith(searchText)).ToList();
|
var searchResults = allSongs.Where(song => song.PhoneticNotation.StartsWith(searchText)).ToList();
|
||||||
|
|
||||||
|
// 重置分頁
|
||||||
currentPage = 0;
|
currentPage = 0;
|
||||||
currentSongList = searchResults;
|
currentSongList = searchResults;
|
||||||
totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage);
|
totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage);
|
||||||
|
|
||||||
|
// 更新多頁面面板的內容
|
||||||
multiPagePanel.currentPageIndex = 0;
|
multiPagePanel.currentPageIndex = 0;
|
||||||
multiPagePanel.LoadSongs(currentSongList);
|
multiPagePanel.LoadSongs(currentSongList);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 將輸入框加入到 UI 控制項
|
||||||
this.Controls.Add(inputBoxZhuYinSongs);
|
this.Controls.Add(inputBoxZhuYinSongs);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@ -231,50 +358,94 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 存儲 PictureBoxZhuYinSongs 的座標與尺寸信息。
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// 此元組包含以下四個值:
|
||||||
|
/// X:X 座標
|
||||||
|
/// , Y:Y 座標
|
||||||
|
/// , Width:寬度
|
||||||
|
/// , Height:高度
|
||||||
|
/// </remarks>
|
||||||
private (int X, int Y, int Width, int Height) pictureBoxZhuYinSongCoords;
|
private (int X, int Y, int Width, int Height) pictureBoxZhuYinSongCoords;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 從設定檔 (config.ini) 讀取 PictureBoxZhuYinSongs 的座標與尺寸
|
||||||
|
/// </summary>
|
||||||
private void LoadPictureBoxZhuYinSongCoordsFromConfig()
|
private void LoadPictureBoxZhuYinSongCoordsFromConfig()
|
||||||
{
|
{
|
||||||
|
// 建立 INI 檔案解析器
|
||||||
var parser = new FileIniDataParser();
|
var parser = new FileIniDataParser();
|
||||||
|
|
||||||
|
// 讀取 config.ini 設定檔的內容
|
||||||
IniData data = parser.ReadFile("config.ini");
|
IniData data = parser.ReadFile("config.ini");
|
||||||
|
|
||||||
|
// 取得 "PictureBoxZhuYinSongs" 段落的設定數據
|
||||||
var coords = data["PictureBoxZhuYinSongs"];
|
var coords = data["PictureBoxZhuYinSongs"];
|
||||||
|
|
||||||
|
// 解析座標與尺寸,並存入 pictureBoxZhuYinSongCoords
|
||||||
pictureBoxZhuYinSongCoords = (
|
pictureBoxZhuYinSongCoords = (
|
||||||
int.Parse(coords["X"]),
|
int.Parse(coords["X"]), // 讀取 X 座標
|
||||||
int.Parse(coords["Y"]),
|
int.Parse(coords["Y"]), // 讀取 Y 座標
|
||||||
int.Parse(coords["Width"]),
|
int.Parse(coords["Width"]), // 讀取寬度
|
||||||
int.Parse(coords["Height"])
|
int.Parse(coords["Height"]) // 讀取高度
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 在 pictureBoxZhuYinSongs 上顯示指定路徑的圖片,並根據設定調整其大小與位置。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="imagePath">要顯示的圖片檔案路徑</param>
|
||||||
private void ShowImageOnPictureBoxZhuYinSongs(string imagePath)
|
private void ShowImageOnPictureBoxZhuYinSongs(string imagePath)
|
||||||
{
|
{
|
||||||
|
// 從 config.ini 讀取 PictureBox 的座標與尺寸
|
||||||
LoadPictureBoxZhuYinSongCoordsFromConfig();
|
LoadPictureBoxZhuYinSongCoordsFromConfig();
|
||||||
|
|
||||||
|
// 讀取圖片檔案並載入 Bitmap 物件
|
||||||
Bitmap originalImage = new Bitmap(imagePath);
|
Bitmap originalImage = new Bitmap(imagePath);
|
||||||
|
|
||||||
|
// 設定圖片顯示區域,使用從設定檔讀取的座標與尺寸
|
||||||
|
Rectangle displayArea = new Rectangle(
|
||||||
|
pictureBoxZhuYinSongCoords.X,
|
||||||
|
pictureBoxZhuYinSongCoords.Y,
|
||||||
|
pictureBoxZhuYinSongCoords.Width,
|
||||||
|
pictureBoxZhuYinSongCoords.Height
|
||||||
|
);
|
||||||
|
|
||||||
Rectangle displayArea = new Rectangle(pictureBoxZhuYinSongCoords.X, pictureBoxZhuYinSongCoords.Y, pictureBoxZhuYinSongCoords.Width, pictureBoxZhuYinSongCoords.Height);
|
// 設定 PictureBox 的圖片
|
||||||
|
|
||||||
|
|
||||||
pictureBoxZhuYinSongs.Image = originalImage;
|
pictureBoxZhuYinSongs.Image = originalImage;
|
||||||
|
|
||||||
|
// 調整 PictureBox 的大小與位置,使其符合設定
|
||||||
|
ResizeAndPositionPictureBox(
|
||||||
|
pictureBoxZhuYinSongs,
|
||||||
|
displayArea.X,
|
||||||
|
displayArea.Y,
|
||||||
|
displayArea.Width,
|
||||||
|
displayArea.Height
|
||||||
|
);
|
||||||
|
|
||||||
ResizeAndPositionPictureBox(pictureBoxZhuYinSongs, displayArea.X, displayArea.Y, displayArea.Width, displayArea.Height);
|
// 顯示 PictureBox
|
||||||
|
|
||||||
pictureBoxZhuYinSongs.Visible = true;
|
pictureBoxZhuYinSongs.Visible = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 設定注音歌曲相關的 PictureBox、按鈕和輸入框的可見性。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="isVisible">若為 true,則顯示這些控件;否則隱藏。</param>
|
||||||
private void SetZhuYinSongsAndButtonsVisibility(bool isVisible)
|
private void SetZhuYinSongsAndButtonsVisibility(bool isVisible)
|
||||||
{
|
{
|
||||||
|
// 定義要執行的操作,設定各控件的可見性
|
||||||
System.Action action = () =>
|
System.Action action = () =>
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// 暫停佈局邏輯,防止在調整控件可見性時觸發不必要的佈局計算,提升性能
|
||||||
SuspendLayout();
|
SuspendLayout();
|
||||||
|
|
||||||
|
// 檢查並設定 pictureBoxZhuYinSongs 的可見性
|
||||||
if (pictureBoxZhuYinSongs == null)
|
if (pictureBoxZhuYinSongs == null)
|
||||||
{
|
{
|
||||||
Console.WriteLine("pictureBoxZhuYinSongs is null");
|
Console.WriteLine("pictureBoxZhuYinSongs is null");
|
||||||
@ -285,6 +456,7 @@ namespace DualScreenDemo
|
|||||||
if (isVisible) pictureBoxZhuYinSongs.BringToFront();
|
if (isVisible) pictureBoxZhuYinSongs.BringToFront();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 檢查並設定 phoneticButtonsForSongs 陣列中每個按鈕的可見性
|
||||||
if (phoneticButtonsForSongs == null)
|
if (phoneticButtonsForSongs == null)
|
||||||
{
|
{
|
||||||
Console.WriteLine("phoneticButtonsForSongs is null");
|
Console.WriteLine("phoneticButtonsForSongs is null");
|
||||||
@ -305,6 +477,7 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 檢查並設定 modifyButtonZhuYinSongs 的可見性
|
||||||
if (modifyButtonZhuYinSongs == null)
|
if (modifyButtonZhuYinSongs == null)
|
||||||
{
|
{
|
||||||
Console.WriteLine("modifyButtonZhuYinSongs is null");
|
Console.WriteLine("modifyButtonZhuYinSongs is null");
|
||||||
@ -315,6 +488,7 @@ namespace DualScreenDemo
|
|||||||
if (isVisible) modifyButtonZhuYinSongs.BringToFront();
|
if (isVisible) modifyButtonZhuYinSongs.BringToFront();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 檢查並設定 clearButtonZhuYinSongs 的可見性
|
||||||
if (clearButtonZhuYinSongs == null)
|
if (clearButtonZhuYinSongs == null)
|
||||||
{
|
{
|
||||||
Console.WriteLine("clearButtonZhuYinSongs is null");
|
Console.WriteLine("clearButtonZhuYinSongs is null");
|
||||||
@ -325,6 +499,7 @@ namespace DualScreenDemo
|
|||||||
if (isVisible) clearButtonZhuYinSongs.BringToFront();
|
if (isVisible) clearButtonZhuYinSongs.BringToFront();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 檢查並設定 closeButtonZhuYinSongs 的可見性
|
||||||
if (closeButtonZhuYinSongs == null)
|
if (closeButtonZhuYinSongs == null)
|
||||||
{
|
{
|
||||||
Console.WriteLine("closeButtonZhuYinSongs is null");
|
Console.WriteLine("closeButtonZhuYinSongs is null");
|
||||||
@ -335,6 +510,7 @@ namespace DualScreenDemo
|
|||||||
if (isVisible) closeButtonZhuYinSongs.BringToFront();
|
if (isVisible) closeButtonZhuYinSongs.BringToFront();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 檢查並設定 inputBoxZhuYinSongs 的可見性
|
||||||
if (inputBoxZhuYinSongs == null)
|
if (inputBoxZhuYinSongs == null)
|
||||||
{
|
{
|
||||||
Console.WriteLine("inputBoxZhuYinSongs is null");
|
Console.WriteLine("inputBoxZhuYinSongs is null");
|
||||||
@ -345,10 +521,12 @@ namespace DualScreenDemo
|
|||||||
if (isVisible) inputBoxZhuYinSongs.BringToFront();
|
if (isVisible) inputBoxZhuYinSongs.BringToFront();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 恢復佈局邏輯,允許佈局計算
|
||||||
ResumeLayout();
|
ResumeLayout();
|
||||||
|
// 強制控件立即執行佈局邏輯,確保佈局更新立即生效
|
||||||
PerformLayout();
|
PerformLayout();
|
||||||
|
|
||||||
|
// 刷新各控件,確保其狀態立即更新
|
||||||
pictureBoxZhuYinSongs?.Refresh();
|
pictureBoxZhuYinSongs?.Refresh();
|
||||||
if (phoneticButtonsForSongs != null)
|
if (phoneticButtonsForSongs != null)
|
||||||
{
|
{
|
||||||
@ -364,10 +542,12 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
// 捕捉並輸出異常資訊,方便除錯
|
||||||
Console.WriteLine("Error in SetZhuYinSongsAndButtonsVisibility: " + ex.Message);
|
Console.WriteLine("Error in SetZhuYinSongsAndButtonsVisibility: " + ex.Message);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 如果當前執行緒需要呼叫 Invoke 方法才能修改控件,則使用 Invoke
|
||||||
if (this.InvokeRequired)
|
if (this.InvokeRequired)
|
||||||
{
|
{
|
||||||
this.Invoke(action);
|
this.Invoke(action);
|
||||||
@ -377,5 +557,6 @@ namespace DualScreenDemo
|
|||||||
action();
|
action();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -28,7 +28,7 @@ namespace DualScreenDemo
|
|||||||
englishSearchSongButton.BackgroundImage = englishSearchSongActiveBackground;
|
englishSearchSongButton.BackgroundImage = englishSearchSongActiveBackground;
|
||||||
pinyinSearchSongButton.BackgroundImage = pinyinSearchSongNormalBackground;
|
pinyinSearchSongButton.BackgroundImage = pinyinSearchSongNormalBackground;
|
||||||
wordCountSearchSongButton.BackgroundImage = wordCountSearchSongNormalBackground;
|
wordCountSearchSongButton.BackgroundImage = wordCountSearchSongNormalBackground;
|
||||||
handWritingSearchButton.BackgroundImage = handWritingSearchSongNormalBackground;;
|
handWritingSearchSongButton.BackgroundImage = handWritingSearchSongNormalBackground;
|
||||||
numberSearchSongButton.BackgroundImage = numberSearchSongNormalBackground;
|
numberSearchSongButton.BackgroundImage = numberSearchSongNormalBackground;
|
||||||
|
|
||||||
bool shouldBeVisible = !pictureBoxEnglishSongs.Visible;
|
bool shouldBeVisible = !pictureBoxEnglishSongs.Visible;
|
||||||
@ -38,13 +38,15 @@ namespace DualScreenDemo
|
|||||||
string imagePath = Path.Combine(Application.StartupPath, configData["ImagePaths"]["EnglishSongs"]);
|
string imagePath = Path.Combine(Application.StartupPath, configData["ImagePaths"]["EnglishSongs"]);
|
||||||
|
|
||||||
ShowImageOnPictureBoxEnglishSongs(Path.Combine(Application.StartupPath, imagePath));
|
ShowImageOnPictureBoxEnglishSongs(Path.Combine(Application.StartupPath, imagePath));
|
||||||
|
// 鍵盤UI介面顯示設定
|
||||||
SetZhuYinSingersAndButtonsVisibility(false);
|
SetWordCountSongsAndButtonsVisibility(false);
|
||||||
SetEnglishSingersAndButtonsVisibility(false);
|
|
||||||
SetPinYinSingersAndButtonsVisibility(false);
|
|
||||||
SetHandWritingForSingersAndButtonsVisibility(false);
|
|
||||||
SetZhuYinSongsAndButtonsVisibility(false);
|
|
||||||
SetEnglishSongsAndButtonsVisibility(true);
|
SetEnglishSongsAndButtonsVisibility(true);
|
||||||
|
SetPinYinSongsAndButtonsVisibility(false);
|
||||||
|
SetHandWritingForSongsAndButtonsVisibility(false);
|
||||||
|
SetSongIDSearchAndButtonsVisibility(false);
|
||||||
|
SetZhuYinSongsAndButtonsVisibility(false);
|
||||||
|
|
||||||
|
ResetinputBox();
|
||||||
pictureBoxEnglishSongs.Visible = true;
|
pictureBoxEnglishSongs.Visible = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -225,6 +227,7 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
|
|
||||||
pictureBoxEnglishSongs.Visible = false;
|
pictureBoxEnglishSongs.Visible = false;
|
||||||
|
englishSearchSongButton.BackgroundImage = englishSearchSongNormalBackground;
|
||||||
SetEnglishSongsAndButtonsVisibility(false);
|
SetEnglishSongsAndButtonsVisibility(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,15 +40,15 @@ namespace DualScreenDemo
|
|||||||
|
|
||||||
ShowImageOnPictureBoxHandWritingSongs(Path.Combine(Application.StartupPath, handWritingImagePath));
|
ShowImageOnPictureBoxHandWritingSongs(Path.Combine(Application.StartupPath, handWritingImagePath));
|
||||||
|
|
||||||
SetZhuYinSingersAndButtonsVisibility(false);
|
// 鍵盤UI介面顯示設定
|
||||||
SetEnglishSingersAndButtonsVisibility(false);
|
SetWordCountSongsAndButtonsVisibility(false);
|
||||||
SetPinYinSingersAndButtonsVisibility(false);
|
|
||||||
SetHandWritingForSingersAndButtonsVisibility(false);
|
|
||||||
SetZhuYinSongsAndButtonsVisibility(false);
|
|
||||||
SetEnglishSongsAndButtonsVisibility(false);
|
SetEnglishSongsAndButtonsVisibility(false);
|
||||||
SetPinYinSongsAndButtonsVisibility(false);
|
SetPinYinSongsAndButtonsVisibility(false);
|
||||||
SetHandWritingForSongsAndButtonsVisibility(true);
|
SetHandWritingForSongsAndButtonsVisibility(true);
|
||||||
|
SetSongIDSearchAndButtonsVisibility(false);
|
||||||
|
SetZhuYinSongsAndButtonsVisibility(false);
|
||||||
|
|
||||||
|
ResetinputBox();
|
||||||
this.ResumeLayout();
|
this.ResumeLayout();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -295,7 +295,7 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
|
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
|
handWritingSearchSongButton.BackgroundImage = handWritingSearchSongNormalBackground;
|
||||||
SetHandWritingForSongsAndButtonsVisibility(false);
|
SetHandWritingForSongsAndButtonsVisibility(false);
|
||||||
|
|
||||||
|
|
||||||
|
@ -20,7 +20,9 @@ namespace DualScreenDemo
|
|||||||
private Button closeButtonPinYinSongs;
|
private Button closeButtonPinYinSongs;
|
||||||
// 用於顯示輸入文字的輸入框
|
// 用於顯示輸入文字的輸入框
|
||||||
private RichTextBox inputBoxPinYinSongs;
|
private RichTextBox inputBoxPinYinSongs;
|
||||||
// 拼音歌曲搜尋按鈕點擊事件
|
/// <summary>
|
||||||
|
/// 拼音歌曲搜尋按鈕點擊事件
|
||||||
|
/// </summary>
|
||||||
private void PinyinSearchSongsButton_Click(object sender, EventArgs e)
|
private void PinyinSearchSongsButton_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
// 更新搜尋模式按鈕的背景圖
|
// 更新搜尋模式按鈕的背景圖
|
||||||
@ -38,14 +40,20 @@ namespace DualScreenDemo
|
|||||||
ShowImageOnPictureBoxPinYinSongs(Path.Combine(Application.StartupPath, pinyinImagePath));
|
ShowImageOnPictureBoxPinYinSongs(Path.Combine(Application.StartupPath, pinyinImagePath));
|
||||||
|
|
||||||
|
|
||||||
// 設定不同模式的 UI 顯示
|
// 鍵盤UI介面顯示設定
|
||||||
SetZhuYinSingersAndButtonsVisibility(false);
|
SetWordCountSongsAndButtonsVisibility(false);
|
||||||
SetEnglishSingersAndButtonsVisibility(false);
|
SetEnglishSongsAndButtonsVisibility(false);
|
||||||
SetPinYinSingersAndButtonsVisibility(false);
|
|
||||||
SetPinYinSongsAndButtonsVisibility(true);
|
SetPinYinSongsAndButtonsVisibility(true);
|
||||||
|
SetHandWritingForSongsAndButtonsVisibility(false);
|
||||||
|
SetSongIDSearchAndButtonsVisibility(false);
|
||||||
|
SetZhuYinSongsAndButtonsVisibility(false);
|
||||||
|
|
||||||
|
ResetinputBox();
|
||||||
pictureBoxPinYinSongs.Visible = true;
|
pictureBoxPinYinSongs.Visible = true;
|
||||||
}
|
}
|
||||||
// 初始化拼音按鈕
|
/// <summary>
|
||||||
|
/// 初始化拼音按鈕
|
||||||
|
/// </summary>
|
||||||
private void InitializeLetterButtonsForPinYinSongs()
|
private void InitializeLetterButtonsForPinYinSongs()
|
||||||
{
|
{
|
||||||
// 從設定檔 (config.ini) 讀取配置數據
|
// 從設定檔 (config.ini) 讀取配置數據
|
||||||
@ -83,7 +91,11 @@ namespace DualScreenDemo
|
|||||||
this.Controls.Add(letterButtonsForPinYinSongs[i]);
|
this.Controls.Add(letterButtonsForPinYinSongs[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 處理拼音按鈕點擊事件
|
/// <summary>
|
||||||
|
/// 處理拼音按鈕點擊事件
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender">觸發事件按鈕</param>
|
||||||
|
/// <param name="e">事件參數</param>
|
||||||
private void LetterButtonPinYinSongs_Click(object sender, EventArgs e)
|
private void LetterButtonPinYinSongs_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
// 嘗試將觸發事件的物件轉換為 Button 類型
|
// 嘗試將觸發事件的物件轉換為 Button 類型
|
||||||
@ -101,43 +113,55 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化拼音輸入相關的 UI 控件,包括字母按鈕、特殊功能按鈕(修改、清除、關閉),以及拼音輸入框。
|
||||||
|
/// </summary>
|
||||||
private void InitializeButtonsForPinYinSongs()
|
private void InitializeButtonsForPinYinSongs()
|
||||||
{
|
{
|
||||||
// 初始化拼音字母按鈕,根據 QWERTY 鍵盤佈局建立對應的按鈕
|
// 初始化拼音字母按鈕,根據 QWERTY 鍵盤佈局建立對應的按鈕
|
||||||
InitializeLetterButtonsForPinYinSongs();
|
InitializeLetterButtonsForPinYinSongs();
|
||||||
|
|
||||||
// 初始化特殊功能按鈕,包括修改、清除和關閉按鈕
|
// 初始化特殊功能按鈕(修改、清除、關閉)
|
||||||
InitializeSpecialButtonsForPinYinSongs();
|
InitializeSpecialButtonsForPinYinSongs();
|
||||||
|
|
||||||
// 初始化拼音輸入框,讓使用者可以輸入拼音來搜尋歌曲
|
// 初始化拼音輸入框,使用者可透過輸入拼音來搜尋歌曲
|
||||||
InitializeInputBoxPinYinSongs();
|
InitializeInputBoxPinYinSongs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化拼音輸入的特殊功能按鈕,包括:
|
||||||
|
/// <para>1. 修改按鈕 - 刪除輸入框中的最後一個字母</para>
|
||||||
|
/// <para>2. 清除按鈕 - 清空輸入框的內容</para>
|
||||||
|
/// <para>3. 關閉按鈕 - 隱藏拼音輸入的 UI 元件</para>
|
||||||
|
/// </summary>
|
||||||
private void InitializeSpecialButtonsForPinYinSongs()
|
private void InitializeSpecialButtonsForPinYinSongs()
|
||||||
{
|
{
|
||||||
|
// 初始化「修改」按鈕(刪除輸入框最後一個字母)
|
||||||
// 初始化「修改」按鈕,讓使用者可以刪除輸入框中的最後一個字母
|
|
||||||
InitializeModifyButtonPinYinSongs();
|
InitializeModifyButtonPinYinSongs();
|
||||||
|
|
||||||
// 初始化「清除」按鈕,讓使用者可以清空輸入框的內容
|
// 初始化「清除」按鈕(清空輸入框內容)
|
||||||
InitializeClearButtonPinYinSongs();
|
InitializeClearButtonPinYinSongs();
|
||||||
|
|
||||||
// 初始化「關閉」按鈕,讓使用者可以關閉拼音輸入的 UI 元件
|
// 初始化「關閉」按鈕(關閉拼音輸入 UI)
|
||||||
InitializeCloseButtonPinYinSongs();
|
InitializeCloseButtonPinYinSongs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化「修改」按鈕,提供刪除拼音輸入框最後一個字母的功能。
|
||||||
|
/// </summary>
|
||||||
private void InitializeModifyButtonPinYinSongs()
|
private void InitializeModifyButtonPinYinSongs()
|
||||||
{
|
{
|
||||||
// 載入設定檔資料,取得特殊按鈕的相關配置
|
// 讀取設定檔,載入特殊按鈕的配置資料
|
||||||
var data = LoadConfigData();
|
var data = LoadConfigData();
|
||||||
|
|
||||||
// 從設定檔讀取「修改按鈕」的座標位置與大小
|
// 從設定檔取得「修改按鈕」的座標與大小
|
||||||
modifyButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "modifyButtonPinYinSongs");
|
modifyButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "modifyButtonPinYinSongs");
|
||||||
|
|
||||||
// 從設定檔讀取「修改按鈕」的不同狀態圖片 (一般、滑鼠懸停、按下)
|
// 讀取「修改按鈕」的圖片資源(一般狀態、滑鼠懸停、按下)
|
||||||
var buttonImages = LoadButtonImages(data, "ModifyButtonImagesPinYin");
|
var buttonImages = LoadButtonImages(data, "ModifyButtonImagesPinYin");
|
||||||
|
|
||||||
// 創建「修改按鈕」,並綁定點擊事件
|
// 創建「修改」按鈕,並綁定點擊事件
|
||||||
modifyButtonPinYinSongs = CreateSpecialButton(
|
modifyButtonPinYinSongs = CreateSpecialButton(
|
||||||
"btnModifyPinYinSongs", // 按鈕名稱
|
"btnModifyPinYinSongs", // 按鈕名稱
|
||||||
modifyButtonPinYinCoords, // 設定按鈕的座標與大小
|
modifyButtonPinYinCoords, // 設定按鈕的座標與大小
|
||||||
@ -146,43 +170,51 @@ namespace DualScreenDemo
|
|||||||
buttonImages.mouseDown, // 設定按鈕的按下狀態圖片
|
buttonImages.mouseDown, // 設定按鈕的按下狀態圖片
|
||||||
ModifyButtonPinYinSongs_Click // 綁定按鈕的點擊事件處理函式
|
ModifyButtonPinYinSongs_Click // 綁定按鈕的點擊事件處理函式
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 「修改」按鈕點擊事件:刪除拼音輸入框 (inputBoxPinYinSongs) 中的最後一個字母。
|
||||||
|
/// </summary>
|
||||||
private void ModifyButtonPinYinSongs_Click(object sender, EventArgs e)
|
private void ModifyButtonPinYinSongs_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
// 確保 inputBoxPinYinSongs 存在於視窗控制項集合內,且輸入框內有文字
|
||||||
// 檢查 `inputBoxPinYinSongs` 是否已被加入到 `Controls` 集合中 (確保輸入框存在)
|
|
||||||
if (this.Controls.Contains(inputBoxPinYinSongs) && inputBoxPinYinSongs.Text.Length > 0)
|
if (this.Controls.Contains(inputBoxPinYinSongs) && inputBoxPinYinSongs.Text.Length > 0)
|
||||||
{
|
{
|
||||||
// 若 `inputBoxPinYinSongs` 有內容,刪除最後一個字母
|
// 刪除輸入框內的最後一個字母
|
||||||
inputBoxPinYinSongs.Text = inputBoxPinYinSongs.Text.Substring(0, inputBoxPinYinSongs.Text.Length - 1);
|
inputBoxPinYinSongs.Text = inputBoxPinYinSongs.Text.Substring(0, inputBoxPinYinSongs.Text.Length - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化「清除」按鈕 (clearButtonPinYinSongs),用於清空拼音輸入框 (inputBoxPinYinSongs)。
|
||||||
|
/// </summary>
|
||||||
private void InitializeClearButtonPinYinSongs()
|
private void InitializeClearButtonPinYinSongs()
|
||||||
{
|
{
|
||||||
// 從設定檔載入資料
|
// 從設定檔載入資料
|
||||||
var data = LoadConfigData();
|
var data = LoadConfigData();
|
||||||
|
|
||||||
// 讀取清除按鈕的座標配置 (X, Y, Width, Height)
|
// 讀取「清除」按鈕的座標配置 (X, Y, Width, Height)
|
||||||
clearButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "clearButtonPinYinSongs");
|
clearButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "clearButtonPinYinSongs");
|
||||||
|
|
||||||
// 載入清除按鈕的圖片 (一般狀態、滑鼠懸停、按下時的圖片)
|
// 載入「清除」按鈕的圖片 (一般狀態、滑鼠懸停、按下時的圖片)
|
||||||
var buttonImages = LoadButtonImages(data, "ClearButtonImagesPinYin");
|
var buttonImages = LoadButtonImages(data, "ClearButtonImagesPinYin");
|
||||||
|
|
||||||
// 建立「清除按鈕」並指定對應的座標與圖片
|
// 建立「清除」按鈕,設定對應的座標與圖片,並綁定點擊事件
|
||||||
clearButtonPinYinSongs = CreateSpecialButton(
|
clearButtonPinYinSongs = CreateSpecialButton(
|
||||||
"btnClearPinYinSongs", // 按鈕名稱
|
"btnClearPinYinSongs", // 按鈕名稱
|
||||||
clearButtonPinYinCoords, // 按鈕的座標與大小
|
clearButtonPinYinCoords, // 設定按鈕的座標與大小
|
||||||
buttonImages.normal, // 按鈕的普通狀態圖片
|
buttonImages.normal, // 設定按鈕的正常狀態圖片
|
||||||
buttonImages.mouseOver, // 滑鼠懸停時的圖片
|
buttonImages.mouseOver, // 設定按鈕的滑鼠懸停圖片
|
||||||
buttonImages.mouseDown, // 滑鼠按下時的圖片
|
buttonImages.mouseDown, // 設定按鈕的按下狀態圖片
|
||||||
ClearButtonPinYinSongs_Click // 點擊事件處理函式
|
ClearButtonPinYinSongs_Click // 綁定按鈕的點擊事件處理函式
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 清空拼音輸入框的內容。
|
||||||
|
/// 當使用者點擊清除按鈕時,若輸入框存在且有內容,則將其清空。
|
||||||
|
/// </summary>
|
||||||
private void ClearButtonPinYinSongs_Click(object sender, EventArgs e)
|
private void ClearButtonPinYinSongs_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
// 檢查視窗內是否包含 inputBoxPinYinSongs 控制項,且輸入框內是否有文字
|
// 檢查視窗內是否包含 inputBoxPinYinSongs 控制項,且輸入框內是否有文字
|
||||||
@ -193,38 +225,48 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化「關閉」按鈕 (closeButtonPinYinSongs),用於隱藏拼音輸入介面。
|
||||||
|
/// </summary>
|
||||||
private void InitializeCloseButtonPinYinSongs()
|
private void InitializeCloseButtonPinYinSongs()
|
||||||
{
|
{
|
||||||
// 讀取設定檔中的按鈕配置數據
|
// 讀取設定檔中的按鈕配置數據
|
||||||
var data = LoadConfigData();
|
var data = LoadConfigData();
|
||||||
|
|
||||||
// 從設定檔中取得「關閉」按鈕的座標
|
// 從設定檔中取得「關閉」按鈕的座標 (X, Y, Width, Height)
|
||||||
closeButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "closeButtonPinYinSongs");
|
closeButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "closeButtonPinYinSongs");
|
||||||
|
|
||||||
// 從設定檔中讀取「關閉」按鈕的圖片
|
// 從設定檔中讀取「關閉」按鈕的圖片 (一般狀態、滑鼠懸停、按下時的圖片)
|
||||||
var buttonImages = LoadButtonImages(data, "CloseButtonImagesPinYin");
|
var buttonImages = LoadButtonImages(data, "CloseButtonImagesPinYin");
|
||||||
|
|
||||||
// 建立「關閉」按鈕,並設定名稱、座標、按鈕圖片及點擊事件
|
// 建立「關閉」按鈕,設定名稱、座標、圖片及點擊事件
|
||||||
closeButtonPinYinSongs = CreateSpecialButton(
|
closeButtonPinYinSongs = CreateSpecialButton(
|
||||||
"btnClosePinYinSongs", // 按鈕名稱
|
"btnClosePinYinSongs", // 按鈕名稱
|
||||||
closeButtonPinYinCoords, // 按鈕座標 (X, Y, Width, Height)
|
closeButtonPinYinCoords, // 設定按鈕的座標與大小
|
||||||
buttonImages.normal, // 按鈕的普通狀態圖片
|
buttonImages.normal, // 設定按鈕的正常狀態圖片
|
||||||
buttonImages.mouseOver, // 滑鼠懸停時的圖片
|
buttonImages.mouseOver, // 設定按鈕的滑鼠懸停圖片
|
||||||
buttonImages.mouseDown, // 按下時的圖片
|
buttonImages.mouseDown, // 設定按鈕的按下狀態圖片
|
||||||
CloseButtonPinYinSongs_Click // 點擊事件處理函式
|
CloseButtonPinYinSongs_Click // 綁定按鈕的點擊事件處理函式
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 關閉拼音輸入模式,隱藏相關 UI 元件。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender">觸發事件的按鈕。</param>
|
||||||
|
/// <param name="e">事件參數。</param>
|
||||||
private void CloseButtonPinYinSongs_Click(object sender, EventArgs e)
|
private void CloseButtonPinYinSongs_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
// 隱藏拼音輸入的背景圖片 (可能是 UI 中的輸入框背景)
|
// 隱藏拼音輸入的背景圖片 (可能是 UI 中的輸入框背景)
|
||||||
pictureBoxPinYinSongs.Visible = false;
|
pictureBoxPinYinSongs.Visible = false;
|
||||||
|
pinyinSearchSongButton.BackgroundImage = pinyinSearchSongNormalBackground;
|
||||||
// 設定拼音輸入框與所有相關按鈕的可見性為 false
|
// 設定拼音輸入框與所有相關按鈕的可見性為 false
|
||||||
SetPinYinSongsAndButtonsVisibility(false);
|
SetPinYinSongsAndButtonsVisibility(false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化拼音輸入框 (RichTextBox),並從 config.ini 讀取相關設定。
|
||||||
|
/// </summary>
|
||||||
private void InitializeInputBoxPinYinSongs()
|
private void InitializeInputBoxPinYinSongs()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@ -233,31 +275,31 @@ namespace DualScreenDemo
|
|||||||
var parser = new FileIniDataParser();
|
var parser = new FileIniDataParser();
|
||||||
|
|
||||||
// 配置解析器的參數
|
// 配置解析器的參數
|
||||||
parser.Parser.Configuration.AssigmentSpacer = ""; // 設定 `=` 兩側沒有空格
|
parser.Parser.Configuration.AssigmentSpacer = ""; // 設定 = 兩側沒有空格
|
||||||
parser.Parser.Configuration.CommentString = "#"; // 使用 `#` 作為註解符號
|
parser.Parser.Configuration.CommentString = "#"; // 使用 # 作為註解符號
|
||||||
parser.Parser.Configuration.CaseInsensitive = true; // 參數名稱不區分大小寫
|
parser.Parser.Configuration.CaseInsensitive = true; // 參數名稱不區分大小寫
|
||||||
|
|
||||||
IniData data; // 儲存解析後的 INI 數據
|
IniData data; // 儲存解析後的 INI 數據
|
||||||
|
|
||||||
// 讀取 `config.ini` 文件,使用 UTF-8 編碼
|
// 讀取 config.ini 文件,使用 UTF-8 編碼
|
||||||
using (var reader = new StreamReader("config.ini", System.Text.Encoding.UTF8))
|
using (var reader = new StreamReader("config.ini", System.Text.Encoding.UTF8))
|
||||||
{
|
{
|
||||||
data = parser.ReadData(reader);
|
data = parser.ReadData(reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 從 INI 檔案讀取拼音輸入框的位置與大小
|
// **從 INI 檔案讀取拼音輸入框的位置與大小**
|
||||||
int x = int.Parse(data["InputBoxPinYinSongs"]["X"]); // X 座標
|
int x = int.Parse(data["InputBoxPinYinSongs"]["X"]); // X 座標
|
||||||
int y = int.Parse(data["InputBoxPinYinSongs"]["Y"]); // Y 座標
|
int y = int.Parse(data["InputBoxPinYinSongs"]["Y"]); // Y 座標
|
||||||
int width = int.Parse(data["InputBoxPinYinSongs"]["Width"]); // 寬度
|
int width = int.Parse(data["InputBoxPinYinSongs"]["Width"]); // 寬度
|
||||||
int height = int.Parse(data["InputBoxPinYinSongs"]["Height"]); // 高度
|
int height = int.Parse(data["InputBoxPinYinSongs"]["Height"]); // 高度
|
||||||
|
|
||||||
// 讀取字型設定
|
// **讀取字型設定**
|
||||||
string fontName = data["InputBoxPinYinSongs"]["FontName"]; // 字型名稱
|
string fontName = data["InputBoxPinYinSongs"]["FontName"]; // 字型名稱
|
||||||
float fontSize = float.Parse(data["InputBoxPinYinSongs"]["FontSize"]); // 字體大小
|
float fontSize = float.Parse(data["InputBoxPinYinSongs"]["FontSize"]); // 字體大小
|
||||||
FontStyle fontStyle = (FontStyle)Enum.Parse(typeof(FontStyle), data["InputBoxPinYinSongs"]["FontStyle"]); // 字體樣式
|
FontStyle fontStyle = (FontStyle)Enum.Parse(typeof(FontStyle), data["InputBoxPinYinSongs"]["FontStyle"]); // 字體樣式
|
||||||
Color foreColor = Color.FromName(data["InputBoxPinYinSongs"]["ForeColor"]); // 文字顏色
|
Color foreColor = Color.FromName(data["InputBoxPinYinSongs"]["ForeColor"]); // 文字顏色
|
||||||
|
|
||||||
// 創建拼音輸入框 (`RichTextBox`)
|
// 創建拼音輸入框 (RichTextBox)
|
||||||
inputBoxPinYinSongs = new RichTextBox
|
inputBoxPinYinSongs = new RichTextBox
|
||||||
{
|
{
|
||||||
Visible = false, // 預設為隱藏
|
Visible = false, // 預設為隱藏
|
||||||
@ -273,7 +315,7 @@ namespace DualScreenDemo
|
|||||||
// 設定輸入框的位置與大小
|
// 設定輸入框的位置與大小
|
||||||
ResizeAndPositionControl(inputBoxPinYinSongs, x, y, width, height);
|
ResizeAndPositionControl(inputBoxPinYinSongs, x, y, width, height);
|
||||||
|
|
||||||
// 綁定 `TextChanged` 事件 (當輸入內容改變時觸發搜尋)
|
// **綁定 TextChanged 事件 (當輸入內容改變時觸發搜尋)**
|
||||||
inputBoxPinYinSongs.TextChanged += (sender, e) =>
|
inputBoxPinYinSongs.TextChanged += (sender, e) =>
|
||||||
{
|
{
|
||||||
string searchText = inputBoxPinYinSongs.Text;
|
string searchText = inputBoxPinYinSongs.Text;
|
||||||
@ -298,23 +340,34 @@ namespace DualScreenDemo
|
|||||||
// 發生錯誤時輸出錯誤訊息 (避免程式崩潰)
|
// 發生錯誤時輸出錯誤訊息 (避免程式崩潰)
|
||||||
Console.WriteLine($"An error occurred: {ex.Message}");
|
Console.WriteLine($"An error occurred: {ex.Message}");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
// 讀取 PictureBoxPinYinSongs 的座標設定
|
/// <summary>
|
||||||
|
/// 存儲 PictureBoxPinYinSongs 的座標與尺寸信息。
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// 此元組包含以下四個值:
|
||||||
|
/// X:X 座標
|
||||||
|
/// , Y:Y 座標
|
||||||
|
/// , Width:寬度
|
||||||
|
/// , Height:高度
|
||||||
|
/// </remarks>
|
||||||
private (int X, int Y, int Width, int Height) pictureBoxPinYinSongCoords;
|
private (int X, int Y, int Width, int Height) pictureBoxPinYinSongCoords;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 從 config.ini 配置檔案中載入 PictureBoxPinYinSongs 的座標與尺寸設定。
|
||||||
|
/// </summary>
|
||||||
private void LoadPictureBoxPinYinSongCoordsFromConfig()
|
private void LoadPictureBoxPinYinSongCoordsFromConfig()
|
||||||
{
|
{
|
||||||
// 創建一個 INI 檔案解析器
|
// 創建一個 INI 檔案解析器
|
||||||
var parser = new FileIniDataParser();
|
var parser = new FileIniDataParser();
|
||||||
|
|
||||||
// 讀取 `config.ini` 文件並解析成 `IniData` 對象
|
// 讀取 config.ini 文件並解析成 IniData 對象
|
||||||
IniData data = parser.ReadFile("config.ini");
|
IniData data = parser.ReadFile("config.ini");
|
||||||
|
|
||||||
// 取得 `PictureBoxPinYinSongs` 區段的設定值
|
// 取得 PictureBoxPinYinSongs 區段的設定值
|
||||||
var coords = data["PictureBoxPinYinSongs"];
|
var coords = data["PictureBoxPinYinSongs"];
|
||||||
|
|
||||||
// 解析 `X`, `Y`, `Width`, `Height`,並存入 `pictureBoxPinYinSongCoords`
|
// 解析 X, Y, Width, Height,並存入 pictureBoxPinYinSongCoords
|
||||||
pictureBoxPinYinSongCoords = (
|
pictureBoxPinYinSongCoords = (
|
||||||
int.Parse(coords["X"]), // 解析 X 座標
|
int.Parse(coords["X"]), // 解析 X 座標
|
||||||
int.Parse(coords["Y"]), // 解析 Y 座標
|
int.Parse(coords["Y"]), // 解析 Y 座標
|
||||||
@ -322,7 +375,10 @@ namespace DualScreenDemo
|
|||||||
int.Parse(coords["Height"]) // 解析 高度
|
int.Parse(coords["Height"]) // 解析 高度
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
// 顯示拼音歌曲圖片
|
/// <summary>
|
||||||
|
/// 顯示拼音歌曲圖片
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="imagePath">圖片路徑</param>
|
||||||
private void ShowImageOnPictureBoxPinYinSongs(string imagePath)
|
private void ShowImageOnPictureBoxPinYinSongs(string imagePath)
|
||||||
{
|
{
|
||||||
// 從設定檔載入 PictureBox 的座標與大小
|
// 從設定檔載入 PictureBox 的座標與大小
|
||||||
@ -339,10 +395,10 @@ namespace DualScreenDemo
|
|||||||
pictureBoxPinYinSongCoords.Height // 設定 高度
|
pictureBoxPinYinSongCoords.Height // 設定 高度
|
||||||
);
|
);
|
||||||
|
|
||||||
// 將載入的圖片設定為 `pictureBoxPinYinSongs` 的影像
|
// 將載入的圖片設定為 pictureBoxPinYinSongs 的影像
|
||||||
pictureBoxPinYinSongs.Image = originalImage;
|
pictureBoxPinYinSongs.Image = originalImage;
|
||||||
|
|
||||||
// 調整 `PictureBox` 的大小與位置,使其符合 `displayArea` 的設定
|
// 調整 PictureBox 的大小與位置,使其符合 displayArea 的設定
|
||||||
ResizeAndPositionPictureBox(
|
ResizeAndPositionPictureBox(
|
||||||
pictureBoxPinYinSongs,
|
pictureBoxPinYinSongs,
|
||||||
displayArea.X,
|
displayArea.X,
|
||||||
@ -351,11 +407,14 @@ namespace DualScreenDemo
|
|||||||
displayArea.Height
|
displayArea.Height
|
||||||
);
|
);
|
||||||
|
|
||||||
// 顯示 `PictureBox`
|
// 顯示 PictureBox
|
||||||
pictureBoxPinYinSongs.Visible = true;
|
pictureBoxPinYinSongs.Visible = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
// 設定拼音模式的 UI 是否可見
|
/// <summary>
|
||||||
|
/// 設定拼音模式的 UI 是否可見
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="isVisible">是否可見</param>
|
||||||
private void SetPinYinSongsAndButtonsVisibility(bool isVisible)
|
private void SetPinYinSongsAndButtonsVisibility(bool isVisible)
|
||||||
{
|
{
|
||||||
// 定義一個委派 (Action),用於更新 UI 控件的可見性
|
// 定義一個委派 (Action),用於更新 UI 控件的可見性
|
||||||
@ -364,7 +423,7 @@ namespace DualScreenDemo
|
|||||||
// 暫停佈局更新,以防止 UI 閃爍或重繪時出現異常
|
// 暫停佈局更新,以防止 UI 閃爍或重繪時出現異常
|
||||||
SuspendLayout();
|
SuspendLayout();
|
||||||
|
|
||||||
// 設定 `pictureBoxPinYinSongs` 的可見性
|
// 設定 pictureBoxPinYinSongs 的可見性
|
||||||
pictureBoxPinYinSongs.Visible = isVisible;
|
pictureBoxPinYinSongs.Visible = isVisible;
|
||||||
if (isVisible) pictureBoxPinYinSongs.BringToFront(); // 確保顯示時位於最前方
|
if (isVisible) pictureBoxPinYinSongs.BringToFront(); // 確保顯示時位於最前方
|
||||||
|
|
||||||
@ -375,25 +434,25 @@ namespace DualScreenDemo
|
|||||||
if (isVisible) button.BringToFront();
|
if (isVisible) button.BringToFront();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 設定 `modifyButtonPinYinSongs` (修改按鈕) 的可見性
|
// 設定 modifyButtonPinYinSongs (修改按鈕) 的可見性
|
||||||
if (modifyButtonPinYinSongs != null)
|
if (modifyButtonPinYinSongs != null)
|
||||||
{
|
{
|
||||||
modifyButtonPinYinSongs.Visible = isVisible;
|
modifyButtonPinYinSongs.Visible = isVisible;
|
||||||
if (isVisible) modifyButtonPinYinSongs.BringToFront();
|
if (isVisible) modifyButtonPinYinSongs.BringToFront();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 設定 `clearButtonPinYinSongs` (清除按鈕) 的可見性
|
// 設定 clearButtonPinYinSongs (清除按鈕) 的可見性
|
||||||
if (clearButtonPinYinSongs != null)
|
if (clearButtonPinYinSongs != null)
|
||||||
{
|
{
|
||||||
clearButtonPinYinSongs.Visible = isVisible;
|
clearButtonPinYinSongs.Visible = isVisible;
|
||||||
if (isVisible) clearButtonPinYinSongs.BringToFront();
|
if (isVisible) clearButtonPinYinSongs.BringToFront();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 設定 `closeButtonPinYinSongs` (關閉按鈕) 的可見性
|
// 設定 closeButtonPinYinSongs (關閉按鈕) 的可見性
|
||||||
closeButtonPinYinSongs.Visible = isVisible;
|
closeButtonPinYinSongs.Visible = isVisible;
|
||||||
if (isVisible) closeButtonPinYinSongs.BringToFront();
|
if (isVisible) closeButtonPinYinSongs.BringToFront();
|
||||||
|
|
||||||
// 設定 `inputBoxPinYinSongs` (輸入框) 的可見性
|
// 設定 inputBoxPinYinSongs (輸入框) 的可見性
|
||||||
inputBoxPinYinSongs.Visible = isVisible;
|
inputBoxPinYinSongs.Visible = isVisible;
|
||||||
if (isVisible) inputBoxPinYinSongs.BringToFront();
|
if (isVisible) inputBoxPinYinSongs.BringToFront();
|
||||||
|
|
||||||
@ -401,7 +460,7 @@ namespace DualScreenDemo
|
|||||||
ResumeLayout();
|
ResumeLayout();
|
||||||
PerformLayout();
|
PerformLayout();
|
||||||
|
|
||||||
// 刷新 `pictureBoxPinYinSongs`,確保畫面更新
|
// 刷新 pictureBoxPinYinSongs,確保畫面更新
|
||||||
pictureBoxPinYinSongs.Refresh();
|
pictureBoxPinYinSongs.Refresh();
|
||||||
|
|
||||||
// 刷新拼音字母按鈕
|
// 刷新拼音字母按鈕
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using Microsoft.Ink;
|
|
||||||
|
|
||||||
namespace DualScreenDemo
|
|
||||||
{
|
|
||||||
public partial class PrimaryForm
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -4,9 +4,13 @@ using System.Windows.Forms;
|
|||||||
|
|
||||||
namespace DualScreenDemo
|
namespace DualScreenDemo
|
||||||
{
|
{
|
||||||
/* 建構子創立,程式進入初始位置,所有搜尋初始化設置 */
|
/*
|
||||||
|
* 主要視窗 (PrimaryForm) 的部分定義
|
||||||
|
* 負責初始化搜尋按鈕並處理歌曲搜尋 UI 相關邏輯
|
||||||
|
*/
|
||||||
public partial class PrimaryForm
|
public partial class PrimaryForm
|
||||||
{
|
{
|
||||||
|
// 各種歌曲搜尋按鈕及其對應的背景圖片 (一般狀態 / 啟動狀態)
|
||||||
private Button zhuyinSearchSongButton;
|
private Button zhuyinSearchSongButton;
|
||||||
private Bitmap zhuyinSearchSongNormalBackground;
|
private Bitmap zhuyinSearchSongNormalBackground;
|
||||||
private Bitmap zhuyinSearchSongActiveBackground;
|
private Bitmap zhuyinSearchSongActiveBackground;
|
||||||
@ -26,8 +30,15 @@ namespace DualScreenDemo
|
|||||||
private Bitmap numberSearchSongNormalBackground;
|
private Bitmap numberSearchSongNormalBackground;
|
||||||
private Bitmap numberSearchSongActiveBackground;
|
private Bitmap numberSearchSongActiveBackground;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 點擊「歌曲搜尋」按鈕時的事件處理函式
|
||||||
|
/// 1. 更新導航按鈕的背景圖片,使「歌曲搜尋」按鈕顯示為啟動狀態
|
||||||
|
/// 2. 隱藏其他搜尋/分類 UI,僅顯示歌曲搜尋選單
|
||||||
|
/// 3. 若有 QR Code 顯示,則將其隱藏
|
||||||
|
/// </summary>
|
||||||
private void SongSearchButton_Click(object sender, EventArgs e)
|
private void SongSearchButton_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
// 更新導航按鈕的背景圖片
|
||||||
newSongAlertButton.BackgroundImage = newSongAlertNormalBackground;
|
newSongAlertButton.BackgroundImage = newSongAlertNormalBackground;
|
||||||
hotPlayButton.BackgroundImage = hotPlayNormalBackground;
|
hotPlayButton.BackgroundImage = hotPlayNormalBackground;
|
||||||
singerSearchButton.BackgroundImage = singerSearchNormalBackground;
|
singerSearchButton.BackgroundImage = singerSearchNormalBackground;
|
||||||
@ -41,7 +52,7 @@ namespace DualScreenDemo
|
|||||||
deliciousFoodButton.BackgroundImage = deliciousFoodNormalBackground;
|
deliciousFoodButton.BackgroundImage = deliciousFoodNormalBackground;
|
||||||
isOnOrderedSongsPage = false;
|
isOnOrderedSongsPage = false;
|
||||||
|
|
||||||
|
// 隱藏其他 UI
|
||||||
SetHotSongButtonsVisibility(false);
|
SetHotSongButtonsVisibility(false);
|
||||||
SetNewSongButtonsVisibility(false);
|
SetNewSongButtonsVisibility(false);
|
||||||
SetSingerSearchButtonsVisibility(false);
|
SetSingerSearchButtonsVisibility(false);
|
||||||
@ -51,14 +62,15 @@ namespace DualScreenDemo
|
|||||||
SetZhuYinSingersAndButtonsVisibility(false);
|
SetZhuYinSingersAndButtonsVisibility(false);
|
||||||
SetZhuYinSongsAndButtonsVisibility(false);
|
SetZhuYinSongsAndButtonsVisibility(false);
|
||||||
SetEnglishSingersAndButtonsVisibility(false);
|
SetEnglishSingersAndButtonsVisibility(false);
|
||||||
|
|
||||||
SetPinYinSingersAndButtonsVisibility(false);
|
SetPinYinSingersAndButtonsVisibility(false);
|
||||||
SetPinYinSongsAndButtonsVisibility(false);
|
SetPinYinSongsAndButtonsVisibility(false);
|
||||||
SetPictureBoxToggleLightAndButtonsVisibility(false);
|
SetPictureBoxToggleLightAndButtonsVisibility(false);
|
||||||
SetPictureBoxSceneSoundEffectsAndButtonsVisibility(false);
|
SetPictureBoxSceneSoundEffectsAndButtonsVisibility(false);
|
||||||
|
|
||||||
|
// 顯示歌曲搜尋選單按鈕
|
||||||
SetSongSearchButtonsVisibility(true);
|
SetSongSearchButtonsVisibility(true);
|
||||||
|
|
||||||
|
// 隱藏 QR Code (若有)
|
||||||
if (pictureBoxQRCode != null)
|
if (pictureBoxQRCode != null)
|
||||||
{
|
{
|
||||||
pictureBoxQRCode.Visible = false;
|
pictureBoxQRCode.Visible = false;
|
||||||
@ -66,12 +78,25 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 設定「歌曲搜尋」相關按鈕的可見性
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="isVisible">是否顯示</param>
|
||||||
private void SetSongSearchButtonsVisibility(bool isVisible)
|
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)
|
foreach (var button in songSearchButtons)
|
||||||
{
|
{
|
||||||
button.Visible = isVisible;
|
button.Visible = isVisible;
|
||||||
@ -82,25 +107,41 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化所有「歌曲搜尋」按鈕
|
||||||
|
/// 依據不同的搜尋方式 (注音、英文、拼音、筆劃、手寫、數字) 建立對應按鈕
|
||||||
|
/// </summary>
|
||||||
private void InitializeButtonsForSongSearch()
|
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 pinyinSearchSongButton, "pinyinSearchSongButton",
|
||||||
|
1214, 356, 209, 58, ref pinyinSearchSongNormalBackground, ref pinyinSearchSongActiveBackground,
|
||||||
|
normalStateImageSongQuery, mouseDownImageSongQuery, PinyinSearchSongsButton_Click);
|
||||||
|
|
||||||
InitializeSearchButton(ref englishSearchSongButton, "englishSearchSongButton", 1214, 293, 209, 58, ref englishSearchSongNormalBackground, ref englishSearchSongActiveBackground, normalStateImageSongQuery, mouseDownImageSongQuery, EnglishSearchSongsButton_Click);
|
// 初始化「筆劃搜尋」按鈕
|
||||||
|
InitializeSearchButton(ref wordCountSearchSongButton, "wordCountSearchSongButton",
|
||||||
|
1214, 418, 209, 59, ref wordCountSearchSongNormalBackground, ref wordCountSearchSongActiveBackground,
|
||||||
|
normalStateImageSongQuery, mouseDownImageSongQuery, WordCountSearchSongsButton_Click);
|
||||||
|
|
||||||
|
// 初始化「手寫搜尋」按鈕
|
||||||
|
InitializeSearchButton(ref handWritingSearchSongButton, "handWritingSearchSongButton",
|
||||||
|
1214, 481, 209, 59, ref handWritingSearchSongNormalBackground, ref handWritingSearchSongActiveBackground,
|
||||||
|
normalStateImageSongQuery, mouseDownImageSongQuery, HandWritingSearchButtonForSongs_Click);
|
||||||
|
|
||||||
InitializeSearchButton(ref pinyinSearchSongButton, "pinyinSearchSongButton", 1214, 356, 209, 58, ref pinyinSearchSongNormalBackground, ref pinyinSearchSongActiveBackground, normalStateImageSongQuery, mouseDownImageSongQuery, PinyinSearchSongsButton_Click);
|
// 初始化「數字搜尋」按鈕
|
||||||
|
InitializeSearchButton(ref numberSearchSongButton, "numberSearchSongButton",
|
||||||
|
1214, 544, 209, 58, ref numberSearchSongNormalBackground, ref numberSearchSongActiveBackground,
|
||||||
InitializeSearchButton(ref wordCountSearchSongButton, "wordCountSearchSongButton", 1214, 418, 209, 59, ref wordCountSearchSongNormalBackground, ref wordCountSearchSongActiveBackground, normalStateImageSongQuery, mouseDownImageSongQuery, WordCountSearchSong_Click);
|
normalStateImageSongQuery, mouseDownImageSongQuery, SongIDSearchSongsButton_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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
46
Program.cs
@ -32,6 +32,7 @@ using Microsoft.Ink;
|
|||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using DualScreenDemo;
|
using DualScreenDemo;
|
||||||
|
using DBObj;
|
||||||
|
|
||||||
namespace DualScreenDemo
|
namespace DualScreenDemo
|
||||||
{
|
{
|
||||||
@ -56,19 +57,6 @@ static void Main()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// URL ACL 配置
|
|
||||||
string ipAddress = "192.168.88.66";
|
|
||||||
string port = "9090";
|
|
||||||
string url = $"http://{ipAddress}:{port}/";
|
|
||||||
|
|
||||||
if (!IsUrlAclExists(url))
|
|
||||||
{
|
|
||||||
RunBatchFileToAddUrlAcl(ipAddress, port);
|
|
||||||
}
|
|
||||||
|
|
||||||
Application.EnableVisualStyles();
|
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
|
||||||
|
|
||||||
// 初始化管理器
|
// 初始化管理器
|
||||||
|
|
||||||
songListManager = SongListManager.Instance; // 使用单例
|
songListManager = SongListManager.Instance; // 使用单例
|
||||||
@ -160,38 +148,6 @@ static void Main()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 动态创建并运行批处理文件以添加 URL ACL
|
|
||||||
private static void RunBatchFileToAddUrlAcl(string ipAddress, string port)
|
|
||||||
{
|
|
||||||
// 确保批处理文件在当前程序的同一目录下
|
|
||||||
string batchFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AddUrlAcl.bat");
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// 创建批处理内容
|
|
||||||
string batchContent =
|
|
||||||
$"netsh http add urlacl url=http://{ipAddress}:{port}/ user=Everyone\n";
|
|
||||||
|
|
||||||
// 写入批处理文件,确保使用 UTF-8 编码
|
|
||||||
File.WriteAllText(batchFilePath, batchContent);
|
|
||||||
|
|
||||||
ProcessStartInfo startInfo = new ProcessStartInfo
|
|
||||||
{
|
|
||||||
FileName = "cmd.exe", // 使用 cmd 执行
|
|
||||||
Arguments = $"/c \"{batchFilePath}\"", // /c 参数用于执行命令后关闭命令窗口
|
|
||||||
UseShellExecute = true, // 使用系统外壳程序来启动
|
|
||||||
Verb = "runas" // 以管理员身份运行
|
|
||||||
};
|
|
||||||
|
|
||||||
Process process = Process.Start(startInfo);
|
|
||||||
process.WaitForExit(); // 等待批处理执行完成
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine("执行批处理文件失败: " + ex.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void InitializeSecondaryScreen()
|
private static void InitializeSecondaryScreen()
|
||||||
{
|
{
|
||||||
if (Screen.AllScreens.Length > 1)
|
if (Screen.AllScreens.Length > 1)
|
||||||
|
BIN
References.zip
@ -106,7 +106,7 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
catch (Exception processEx)
|
catch (Exception processEx)
|
||||||
{
|
{
|
||||||
// Console.WriteLine($"處理資料時發生錯誤: {processEx.Message}");
|
Console.WriteLine($"處理資料時發生錯誤: {processEx.Message}");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -117,7 +117,7 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
// Console.WriteLine($"接收資料時發生錯誤: {ex.Message}");
|
Console.WriteLine($"接收資料時發生錯誤: {ex.Message}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,7 +137,7 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
// Console.WriteLine($"關閉串列埠時發生錯誤: {ex.Message}");
|
Console.WriteLine($"關閉串列埠時發生錯誤: {ex.Message}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
69
TCPServer.cs
@ -8,7 +8,8 @@ using System.Threading.Tasks;
|
|||||||
using System.IO; // 為 Path 和 File 提供支持
|
using System.IO; // 為 Path 和 File 提供支持
|
||||||
using System.Windows.Forms; // 為 Invoke 和 Form 控件提供支持
|
using System.Windows.Forms; // 為 Invoke 和 Form 控件提供支持
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using DBObj;
|
||||||
|
using OverlayFormObj;
|
||||||
namespace DualScreenDemo
|
namespace DualScreenDemo
|
||||||
{
|
{
|
||||||
public class TCPServer
|
public class TCPServer
|
||||||
@ -16,7 +17,7 @@ namespace DualScreenDemo
|
|||||||
private TcpListener listener;
|
private TcpListener listener;
|
||||||
private const int Port = 1000;
|
private const int Port = 1000;
|
||||||
private readonly string hostNameSuffix;
|
private readonly string hostNameSuffix;
|
||||||
private bool isProcessingCommand = false;
|
//private bool isProcessingCommand = false;
|
||||||
|
|
||||||
|
|
||||||
public TCPServer()
|
public TCPServer()
|
||||||
@ -81,14 +82,18 @@ namespace DualScreenDemo
|
|||||||
Console.WriteLine("Failed to invoke action after maximum retries");
|
Console.WriteLine("Failed to invoke action after maximum retries");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Start()
|
public void Start()
|
||||||
{
|
{
|
||||||
|
// 啟動 TCP 監聽器
|
||||||
listener.Start();
|
listener.Start();
|
||||||
Console.WriteLine("Server started on port " + Port + ".");
|
Console.WriteLine("Server started on port " + Port + ".");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// 讀取初始狀態檔案
|
||||||
string stateFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "states.txt");
|
string stateFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "states.txt");
|
||||||
string initialState = ReadStateFile(stateFilePath);
|
string initialState = ReadStateFile(stateFilePath);
|
||||||
|
|
||||||
|
// 若初始狀態為 "CLOSE",則顯示送客畫面,並禁用所有主畫面的控制項
|
||||||
if (initialState.Equals("CLOSE", StringComparison.OrdinalIgnoreCase))
|
if (initialState.Equals("CLOSE", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
_ = SafeInvoke(PrimaryForm.Instance, () =>
|
_ = SafeInvoke(PrimaryForm.Instance, () =>
|
||||||
@ -106,14 +111,17 @@ namespace DualScreenDemo
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 不斷等待並處理 TCP 連線
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Waiting for connections...");
|
Console.WriteLine("Waiting for connections...");
|
||||||
|
|
||||||
using (TcpClient client = listener.AcceptTcpClient())
|
using (TcpClient client = listener.AcceptTcpClient())
|
||||||
{
|
{
|
||||||
Console.WriteLine("Connected!");
|
Console.WriteLine("Connected!");
|
||||||
NetworkStream stream = client.GetStream();
|
NetworkStream stream = client.GetStream();
|
||||||
|
|
||||||
|
// 處理來自 client 的指令
|
||||||
while (client.Connected)
|
while (client.Connected)
|
||||||
{
|
{
|
||||||
byte[] buffer = new byte[1024];
|
byte[] buffer = new byte[1024];
|
||||||
@ -124,16 +132,20 @@ namespace DualScreenDemo
|
|||||||
string request = Encoding.UTF8.GetString(buffer, 0, bytesRead);
|
string request = Encoding.UTF8.GetString(buffer, 0, bytesRead);
|
||||||
Console.WriteLine("Received: " + request.Trim());
|
Console.WriteLine("Received: " + request.Trim());
|
||||||
|
|
||||||
|
// 忽略長度太短的請求
|
||||||
if (request.Length < 5)
|
if (request.Length < 5)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 解析 host 名稱字尾與指令本體
|
||||||
string requestHostSuffix = request.Substring(0, 3);
|
string requestHostSuffix = request.Substring(0, 3);
|
||||||
string command = request.Substring(4);
|
string command = request.Substring(4);
|
||||||
|
|
||||||
|
// 比對主機名稱是否符合
|
||||||
if (requestHostSuffix.Equals(hostNameSuffix, StringComparison.OrdinalIgnoreCase))
|
if (requestHostSuffix.Equals(hostNameSuffix, StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
|
// 指令為 "X":播放 CLOSE.MPG,並顯示送客畫面
|
||||||
if (command.Trim().Equals("X", StringComparison.OrdinalIgnoreCase))
|
if (command.Trim().Equals("X", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
_ = SafeInvoke(VideoPlayerForm.Instance, async () =>
|
_ = SafeInvoke(VideoPlayerForm.Instance, async () =>
|
||||||
@ -143,33 +155,46 @@ namespace DualScreenDemo
|
|||||||
await SafeInvoke(PrimaryForm.Instance, () =>
|
await SafeInvoke(PrimaryForm.Instance, () =>
|
||||||
{
|
{
|
||||||
PrimaryForm.Instance.ShowSendOffScreen();
|
PrimaryForm.Instance.ShowSendOffScreen();
|
||||||
|
PrimaryForm.Instance.HideFireScreen();
|
||||||
|
string marqueeMessage= "歡迎使用網路版系統,與你共度美好時光。";
|
||||||
|
OverlayForm.MainForm.UpdateMarqueeText(marqueeMessage, OverlayForm.MarqueeStartPosition.Middle, Color.White);
|
||||||
Console.WriteLine("開始設置新的播放列表");
|
Console.WriteLine("開始設置新的播放列表");
|
||||||
|
|
||||||
string closePath = @"C:\video\CLOSE.MPG";
|
string closePath = @"C:\video\CLOSE.MPG";
|
||||||
|
|
||||||
if (File.Exists(closePath))
|
if (File.Exists(closePath))
|
||||||
{
|
{
|
||||||
|
// 建立結束播放用的 SongData 實例
|
||||||
SongData closeSong = new SongData(
|
SongData closeSong = new SongData(
|
||||||
"", "", "結束播放", 0, "", "", "", "",
|
"", "", "結束播放", 0, "", "", "", "",
|
||||||
DateTime.Now, closePath, "", "", "", "",
|
DateTime.Now, closePath, "", "", "", "",
|
||||||
"", "", "", "", "", "", "", 1
|
"", "", "", "", "", "", "", 1
|
||||||
);
|
);
|
||||||
|
|
||||||
VideoPlayerForm.playingSongList = new List<SongData>();
|
// 建立新的播放清單
|
||||||
|
|
||||||
|
VideoPlayerForm.publicPlaylist = new List<SongData>();
|
||||||
|
VideoPlayerForm.playingSongList = new List<SongData>();
|
||||||
|
PrimaryForm.playedSongsHistory = new List<SongData>();
|
||||||
|
// 如果有正在播放的歌曲也加進去
|
||||||
if (VideoPlayerForm.Instance.currentPlayingSong != null)
|
if (VideoPlayerForm.Instance.currentPlayingSong != null)
|
||||||
{
|
{
|
||||||
VideoPlayerForm.playingSongList.Add(VideoPlayerForm.Instance.currentPlayingSong);
|
VideoPlayerForm.playingSongList.Add(VideoPlayerForm.Instance.currentPlayingSong);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VideoPlayerForm.publicPlaylist.Add(closeSong);
|
||||||
|
// 將 CLOSE.MPG 加入播放清單
|
||||||
VideoPlayerForm.playingSongList.Add(closeSong);
|
VideoPlayerForm.playingSongList.Add(closeSong);
|
||||||
|
|
||||||
|
// 清空使用者點播清單
|
||||||
PrimaryForm.userRequestedSongs = new List<SongData>();
|
PrimaryForm.userRequestedSongs = new List<SongData>();
|
||||||
|
|
||||||
|
// 隱藏 Overlay 的「下一首提示」
|
||||||
if (IsFormReady(OverlayForm.MainForm))
|
if (IsFormReady(OverlayForm.MainForm))
|
||||||
{
|
{
|
||||||
OverlayForm.MainForm.nextSongLabel.Visible = false;
|
OverlayForm.MainForm.nextSongLabel.Visible = false;
|
||||||
}
|
}
|
||||||
|
VideoPlayerForm.Instance.PlayNextSong();
|
||||||
Console.WriteLine("已設置新的播放列表,包含當前歌曲和 CLOSE.MPG");
|
Console.WriteLine("已設置新的播放列表,包含當前歌曲和 CLOSE.MPG");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -180,22 +205,47 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 更新狀態檔案為 CLOSE
|
||||||
UpdateStateFile(stateFilePath, "CLOSE");
|
UpdateStateFile(stateFilePath, "CLOSE");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 指令為 "O":開啟系統,隱藏送客畫面
|
||||||
if (command.Trim().Equals("O", StringComparison.OrdinalIgnoreCase))
|
if (command.Trim().Equals("O", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
_ = SafeInvoke(PrimaryForm.Instance, () =>
|
_ = SafeInvoke(PrimaryForm.Instance, () =>
|
||||||
{
|
{
|
||||||
PrimaryForm.Instance.HideSendOffScreen();
|
PrimaryForm.Instance.HideSendOffScreen();
|
||||||
|
PrimaryForm.Instance.HideFireScreen();
|
||||||
|
string marqueeMessage= "歡迎使用網路版系統,與你共度美好時光。";
|
||||||
|
OverlayForm.MainForm.UpdateMarqueeText(marqueeMessage, OverlayForm.MarqueeStartPosition.Middle, Color.White);
|
||||||
|
});
|
||||||
|
VideoPlayerForm.publicPlaylist = new List<SongData>();
|
||||||
|
VideoPlayerForm.playingSongList = new List<SongData>();
|
||||||
|
VideoPlayerForm.Instance.PlayPublicPlaylist(); // 播放公播
|
||||||
|
// 更新狀態檔案為 OPEN
|
||||||
|
UpdateStateFile(stateFilePath, "OPEN");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (command.Trim().Equals("F", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
_ = SafeInvoke(PrimaryForm.Instance, () =>
|
||||||
|
{
|
||||||
|
PrimaryForm.Instance.HideSendOffScreen();
|
||||||
|
PrimaryForm.Instance.ShowFireScreen();
|
||||||
|
VideoPlayerForm.Instance.Pause();
|
||||||
|
string marqueeMessage = "發生火災,請跟隨引導至逃生出口!!!";
|
||||||
|
OverlayForm.MainForm.UpdateMarqueeText(marqueeMessage, OverlayForm.MarqueeStartPosition.Middle, Color.Red);
|
||||||
});
|
});
|
||||||
|
|
||||||
UpdateStateFile(stateFilePath, "OPEN");
|
// 更新狀態檔案(可選,若你要記錄狀態)
|
||||||
|
UpdateStateFile(stateFilePath, "PAUSE");
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 若 Overlay Form 準備好,嘗試顯示跑馬燈文字
|
||||||
if (IsFormReady(OverlayForm.MainForm))
|
if (IsFormReady(OverlayForm.MainForm))
|
||||||
{
|
{
|
||||||
string message = request.Trim();
|
string message = request.Trim();
|
||||||
@ -206,18 +256,21 @@ namespace DualScreenDemo
|
|||||||
{
|
{
|
||||||
if (match.Success)
|
if (match.Success)
|
||||||
{
|
{
|
||||||
|
// 若符合格式,顯示主跑馬燈文字
|
||||||
string marqueeMessage = message.Substring(match.Value.Length).Trim();
|
string marqueeMessage = message.Substring(match.Value.Length).Trim();
|
||||||
Color textColor = GetColorFromString(match.Groups[2].Value);
|
Color textColor = GetColorFromString(match.Groups[2].Value);
|
||||||
OverlayForm.MainForm.UpdateMarqueeText(marqueeMessage, OverlayForm.MarqueeStartPosition.Middle, textColor);
|
OverlayForm.MainForm.UpdateMarqueeText(marqueeMessage, OverlayForm.MarqueeStartPosition.Middle, textColor);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// 不符合格式,顯示在第二行跑馬燈
|
||||||
string marqueeMessage = "系統公告: " + message;
|
string marqueeMessage = "系統公告: " + message;
|
||||||
OverlayForm.MainForm.UpdateMarqueeTextSecondLine(marqueeMessage);
|
OverlayForm.MainForm.UpdateMarqueeTextSecondLine(marqueeMessage);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 指令為 "exit":結束此連線
|
||||||
if (request.Trim().Equals("exit", StringComparison.OrdinalIgnoreCase))
|
if (request.Trim().Equals("exit", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@ -234,10 +287,12 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
// 關閉 listener
|
||||||
listener.Stop();
|
listener.Stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private Color GetColorFromString(string colorName)
|
private Color GetColorFromString(string colorName)
|
||||||
{
|
{
|
||||||
switch (colorName)
|
switch (colorName)
|
||||||
|
BIN
VOD_送客畫面.jpg
Before Width: | Height: | Size: 214 KiB |
@ -7,7 +7,8 @@ using System.Runtime.InteropServices;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using DirectShowLib;
|
using DirectShowLib;
|
||||||
|
using DBObj;
|
||||||
|
using OverlayFormObj;
|
||||||
namespace DualScreenDemo
|
namespace DualScreenDemo
|
||||||
{
|
{
|
||||||
public class VideoPlayerForm : Form
|
public class VideoPlayerForm : Form
|
||||||
@ -91,8 +92,8 @@ namespace DualScreenDemo
|
|||||||
private IVideoWindow videoWindowPrimary;
|
private IVideoWindow videoWindowPrimary;
|
||||||
private IMediaEventEx mediaEventExPrimary;
|
private IMediaEventEx mediaEventExPrimary;
|
||||||
private IMediaEventEx mediaEventExSecondary;
|
private IMediaEventEx mediaEventExSecondary;
|
||||||
private int videoWidth;
|
//private int videoWidth;
|
||||||
private int videoHeight;
|
//private int videoHeight;
|
||||||
private static bool isInitializationComplete = false;
|
private static bool isInitializationComplete = false;
|
||||||
|
|
||||||
public static OverlayForm overlayForm;
|
public static OverlayForm overlayForm;
|
||||||
@ -399,7 +400,7 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
// Console.WriteLine($"Exception in AddFilterByClsid: {ex.Message}");
|
Console.WriteLine($"Exception in AddFilterByClsid: {ex.Message}");
|
||||||
throw; // Rethrow the exception to handle it further up the call stack
|
throw; // Rethrow the exception to handle it further up the call stack
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -514,10 +515,10 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void InitializePublicPlaylist(List<SongData> initialPlaylist)
|
public async void InitializePublicPlaylist(List<SongData> initialPlaylist)
|
||||||
{
|
{
|
||||||
publicPlaylist = initialPlaylist;
|
publicPlaylist = initialPlaylist;
|
||||||
PlayPublicPlaylist(); // 开始播放公播歌单
|
await PlayPublicPlaylist(); // 开始播放公播歌单
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SetPlayingSongList(List<SongData> songList)
|
public async Task SetPlayingSongList(List<SongData> songList)
|
||||||
@ -1520,7 +1521,7 @@ namespace DualScreenDemo
|
|||||||
string labelText = isVocalRemoved ? "無人聲" : "有人聲";
|
string labelText = isVocalRemoved ? "無人聲" : "有人聲";
|
||||||
// 显示标签
|
// 显示标签
|
||||||
OverlayForm.MainForm.ShowOriginalSongLabel(labelText);
|
OverlayForm.MainForm.ShowOriginalSongLabel(labelText);
|
||||||
await Task.Delay(300);
|
await Task.Delay(3000);
|
||||||
// 隐藏标签
|
// 隐藏标签
|
||||||
OverlayForm.MainForm.HideOriginalSongLabel();
|
OverlayForm.MainForm.HideOriginalSongLabel();
|
||||||
}
|
}
|
||||||
@ -1528,6 +1529,7 @@ namespace DualScreenDemo
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine( ex.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1570,16 +1572,11 @@ namespace DualScreenDemo
|
|||||||
DsUtils.FreeAMMediaType(mediaType);
|
DsUtils.FreeAMMediaType(mediaType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine( ex.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1 +0,0 @@
|
|||||||
歡迎使用超級巨星歡唱網路版系統,與你共度美好時光。
|
|
10
app.manifest
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||||
|
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||||
|
<security>
|
||||||
|
<requestedPrivileges>
|
||||||
|
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
|
||||||
|
</requestedPrivileges>
|
||||||
|
</security>
|
||||||
|
</trustInfo>
|
||||||
|
</assembly>
|
1
bin/WelcomeMessage.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
歡迎使用網路版系統,與你共度美好時光。
|
786
bin/config.ini
Normal file
@ -0,0 +1,786 @@
|
|||||||
|
[ImagePaths]
|
||||||
|
ZhuYinSingers = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)_未按.png
|
||||||
|
EnglishSingers = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)_歌星查詢-注音查詢_未按.png
|
||||||
|
PinYinSingers = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)_歌星查詢-注音查詢_未按.png
|
||||||
|
HandWritingSingers = themes\superstar\歌星\手寫\3.歌星查詢(手寫按鍵)_未按.png
|
||||||
|
ZhuYinSongs = themes\superstar\歌名\注音\VOD_歌名查詢_注音查詢(按鍵)_未按.png
|
||||||
|
EnglishSongs = themes\superstar\歌名\英文\VOD_歌名查詢_英文查詢(按鍵)_歌星查詢-注音查詢_未按.png
|
||||||
|
PinYinSongs = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)_歌星查詢-注音查詢_未按.png
|
||||||
|
HandWritingSongs = themes\superstar\歌星\手寫\3.歌星查詢(手寫按鍵)_未按.png
|
||||||
|
WordCountSongs = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)_未按.png
|
||||||
|
WordCountSingers = themes\superstar\歌星\字數\VOD_歌星查詢_編號查詢(按鍵)_未按.png
|
||||||
|
SongIDSearch = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)_未按.png
|
||||||
|
|
||||||
|
[PictureBoxZhuYinSingers]
|
||||||
|
X = 130
|
||||||
|
Y = 250
|
||||||
|
Width = 1078
|
||||||
|
Height = 475
|
||||||
|
|
||||||
|
[PictureBoxEnglishSingers]
|
||||||
|
X = 390
|
||||||
|
Y = 350
|
||||||
|
Width = 808
|
||||||
|
Height = 356
|
||||||
|
|
||||||
|
[PictureBoxPinYinSingers]
|
||||||
|
X = 130
|
||||||
|
Y = 350
|
||||||
|
Width = 1079
|
||||||
|
Height = 394
|
||||||
|
|
||||||
|
[PictureBoxZhuYinSongs]
|
||||||
|
X = 130
|
||||||
|
Y = 250
|
||||||
|
Width = 1078
|
||||||
|
Height = 475
|
||||||
|
|
||||||
|
[PictureBoxEnglishSongs]
|
||||||
|
X = 390
|
||||||
|
Y = 350
|
||||||
|
Width = 808
|
||||||
|
Height = 356
|
||||||
|
|
||||||
|
[PictureBoxPinYinSongs]
|
||||||
|
X = 130
|
||||||
|
Y = 350
|
||||||
|
Width = 1079
|
||||||
|
Height = 394
|
||||||
|
|
||||||
|
[PhoneticSymbols]
|
||||||
|
Symbols=ㄅ,ㄉ,ㄍ,ㄐ,ㄓ,ㄗ,ㄛ,ㄡ,ㄤ,ㄧ,ㄆ,ㄊ,ㄎ,ㄑ,ㄔ,ㄘ,ㄜ,ㄢ,ㄦ,ㄨ,ㄇ,ㄋ,ㄏ,ㄒ,ㄕ,ㄙ,ㄞ,ㄣ,ㄩ,ㄈ,ㄌ, ,ㄖ,ㄚ,ㄠ
|
||||||
|
|
||||||
|
[PhoneticButtonCoordinates]
|
||||||
|
button1 = 150,338,93,86
|
||||||
|
button2 = 255,338,93,86
|
||||||
|
button3 = 359,338,93,86
|
||||||
|
button4 = 463,338,93,86
|
||||||
|
button5 = 567,338,93,87
|
||||||
|
button6 = 671,338,93,86
|
||||||
|
button7 = 775,338,93,86
|
||||||
|
button8 = 879,338,93,86
|
||||||
|
button9 = 984,338,93,86
|
||||||
|
button10 = 1088,338,93,86
|
||||||
|
button11 = 151,434,93,86
|
||||||
|
button12 = 255,434,93,86
|
||||||
|
button13 = 359,434,93,86
|
||||||
|
button14 = 463,434,93,86
|
||||||
|
button15 = 567,434,93,86
|
||||||
|
button16 = 671,434,93,86
|
||||||
|
button17 = 775,434,93,86
|
||||||
|
button18 = 879,434,93,86
|
||||||
|
button19 = 984,434,93,86
|
||||||
|
button20 = 1088,434,93,86
|
||||||
|
button21 = 203,530,93,86
|
||||||
|
button22 = 307,530,93,86
|
||||||
|
button23 = 411,530,93,86
|
||||||
|
button24 = 515,530,93,86
|
||||||
|
button25 = 619,530,93,86
|
||||||
|
button26 = 723,530,93,86
|
||||||
|
button27 = 827,530,93,86
|
||||||
|
button28 = 931,530,93,86
|
||||||
|
button29 = 1035,530,93,86
|
||||||
|
button30 = 255,624,93,86
|
||||||
|
button31 = 359,624,93,86
|
||||||
|
button32 = 463,624,202,86
|
||||||
|
button33 = 676,624,93,86
|
||||||
|
button34 = 780,624,93,86
|
||||||
|
button35 = 884,624,93,86
|
||||||
|
|
||||||
|
[SpecialButtonCoordinates]
|
||||||
|
modifyButtonZhuYinSingers = 989,624,94,87
|
||||||
|
clearButtonZhuYinSingers = 151,624,93,87
|
||||||
|
closeButtonZhuYinSingers = 1093,624,94,87
|
||||||
|
modifyButtonEnglishSingers = 1032,632,70,66
|
||||||
|
clearButtonEnglishSingers = 408,632,70,66
|
||||||
|
closeButtonEnglishSingers = 1110,632,70,66
|
||||||
|
modifyButtonPinYinSingers = 987,642,94,87
|
||||||
|
clearButtonPinYinSingers = 154,642,94,87
|
||||||
|
closeButtonPinYinSingers = 1091,642,94,87
|
||||||
|
refillButtonHandWritingSingers = 918,372,70,65
|
||||||
|
clearButtonHandWritingSingers = 996,372,70,65
|
||||||
|
closeButtonForSingers = 1074,372,70,65
|
||||||
|
modifyButtonZhuYinSongs = 989,624,94,87
|
||||||
|
clearButtonZhuYinSongs = 151,624,93,87
|
||||||
|
closeButtonZhuYinSongs = 1093,624,94,87
|
||||||
|
modifyButtonEnglishSongs = 1032,632,70,66
|
||||||
|
clearButtonEnglishSongs = 408,632,70,66
|
||||||
|
closeButtonEnglishSongs = 1110,632,70,66
|
||||||
|
modifyButtonPinYinSongs = 987,642,94,87
|
||||||
|
clearButtonPinYinSongs = 154,642,94,87
|
||||||
|
closeButtonPinYinSongs = 1091,642,94,87
|
||||||
|
refillButtonHandWritingSongs = 918,372,70,65
|
||||||
|
clearButtonHandWritingSongs = 996,372,70,65
|
||||||
|
closeButtonForSongs = 1074,372,70,65
|
||||||
|
modifyButtonWordCountSongs = 926,624,72,67
|
||||||
|
clearButtonWordCountSongs = 845,624,72,67
|
||||||
|
closeButtonWordCountSongs = 1088,624,72,67
|
||||||
|
modifyButtonWordCountSingers = 926,624,72,67
|
||||||
|
clearButtonWordCountSingers = 845,624,72,67
|
||||||
|
closeButtonWordCountSingers = 1088,624,72,67
|
||||||
|
modifyButtonSongIDSearch = 829,643,94,87
|
||||||
|
clearButtonSongIDSearch = 722,643,93,87
|
||||||
|
closeButtonSongIDSearch = 1043,643,94,87
|
||||||
|
|
||||||
|
|
||||||
|
[ModifyButtonImagesZhuYin]
|
||||||
|
normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-38.png
|
||||||
|
mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-38.png
|
||||||
|
mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-76.png
|
||||||
|
|
||||||
|
[ClearButtonImagesZhuYin]
|
||||||
|
normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-31.png
|
||||||
|
mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-31.png
|
||||||
|
mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-69.png
|
||||||
|
|
||||||
|
[CloseButtonImagesZhuYin]
|
||||||
|
normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-39.png
|
||||||
|
mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-39.png
|
||||||
|
mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-77.png
|
||||||
|
|
||||||
|
[InputBoxZhuYinSingers]
|
||||||
|
X=150
|
||||||
|
Y=264
|
||||||
|
Width=605
|
||||||
|
Height=63
|
||||||
|
FontName=微軟正黑體
|
||||||
|
FontSize=26
|
||||||
|
FontStyle=Bold
|
||||||
|
ForeColor=Black
|
||||||
|
|
||||||
|
[PhoneticButtonImages]
|
||||||
|
button0_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-02.png
|
||||||
|
button0_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-40.png
|
||||||
|
button0_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-02.png
|
||||||
|
button1_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-03.png
|
||||||
|
button1_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-41.png
|
||||||
|
button1_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-03.png
|
||||||
|
button2_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-04.png
|
||||||
|
button2_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-42.png
|
||||||
|
button2_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-04.png
|
||||||
|
button3_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-05.png
|
||||||
|
button3_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-43.png
|
||||||
|
button3_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-05.png
|
||||||
|
button4_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-06.png
|
||||||
|
button4_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-44.png
|
||||||
|
button4_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-06.png
|
||||||
|
button5_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-07.png
|
||||||
|
button5_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-45.png
|
||||||
|
button5_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-07.png
|
||||||
|
button6_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-08.png
|
||||||
|
button6_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-46.png
|
||||||
|
button6_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-08.png
|
||||||
|
button7_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-09.png
|
||||||
|
button7_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-47.png
|
||||||
|
button7_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-09.png
|
||||||
|
button8_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-10.png
|
||||||
|
button8_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-48.png
|
||||||
|
button8_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-10.png
|
||||||
|
button9_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-11.png
|
||||||
|
button9_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-49.png
|
||||||
|
button9_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-11.png
|
||||||
|
button10_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-12.png
|
||||||
|
button10_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-50.png
|
||||||
|
button10_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-12.png
|
||||||
|
button11_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-13.png
|
||||||
|
button11_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-51.png
|
||||||
|
button11_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-13.png
|
||||||
|
button12_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-14.png
|
||||||
|
button12_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-52.png
|
||||||
|
button12_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-14.png
|
||||||
|
button13_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-15.png
|
||||||
|
button13_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-53.png
|
||||||
|
button13_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-15.png
|
||||||
|
button14_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-16.png
|
||||||
|
button14_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-54.png
|
||||||
|
button14_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-16.png
|
||||||
|
button15_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-17.png
|
||||||
|
button15_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-55.png
|
||||||
|
button15_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-17.png
|
||||||
|
button16_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-18.png
|
||||||
|
button16_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-56.png
|
||||||
|
button16_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-18.png
|
||||||
|
button17_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-19.png
|
||||||
|
button17_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-57.png
|
||||||
|
button17_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-19.png
|
||||||
|
button18_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-20.png
|
||||||
|
button18_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-58.png
|
||||||
|
button18_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-20.png
|
||||||
|
button19_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-21.png
|
||||||
|
button19_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-59.png
|
||||||
|
button19_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-21.png
|
||||||
|
button20_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-22.png
|
||||||
|
button20_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-60.png
|
||||||
|
button20_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-22.png
|
||||||
|
button21_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-23.png
|
||||||
|
button21_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-61.png
|
||||||
|
button21_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-23.png
|
||||||
|
button22_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-24.png
|
||||||
|
button22_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-62.png
|
||||||
|
button22_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-24.png
|
||||||
|
button23_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-25.png
|
||||||
|
button23_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-63.png
|
||||||
|
button23_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-25.png
|
||||||
|
button24_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-26.png
|
||||||
|
button24_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-64.png
|
||||||
|
button24_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-26.png
|
||||||
|
button25_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-27.png
|
||||||
|
button25_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-65.png
|
||||||
|
button25_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-27.png
|
||||||
|
button26_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-28.png
|
||||||
|
button26_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-66.png
|
||||||
|
button26_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-28.png
|
||||||
|
button27_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-29.png
|
||||||
|
button27_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-67.png
|
||||||
|
button27_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-29.png
|
||||||
|
button28_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-30.png
|
||||||
|
button28_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-68.png
|
||||||
|
button28_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-30.png
|
||||||
|
button29_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-32.png
|
||||||
|
button29_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-70.png
|
||||||
|
button29_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-32.png
|
||||||
|
button30_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-33.png
|
||||||
|
button30_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-71.png
|
||||||
|
button30_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-33.png
|
||||||
|
button31_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-34.png
|
||||||
|
button31_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-72.png
|
||||||
|
button31_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-34.png
|
||||||
|
button32_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-35.png
|
||||||
|
button32_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-73.png
|
||||||
|
button32_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-35.png
|
||||||
|
button33_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-36.png
|
||||||
|
button33_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-74.png
|
||||||
|
button33_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-36.png
|
||||||
|
button34_normal = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-37.png
|
||||||
|
button34_mouseDown = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-75.png
|
||||||
|
button34_mouseOver = themes\superstar\歌星\注音\VOD_歌星查詢_注音查詢(按鍵)-37.png
|
||||||
|
|
||||||
|
[NumberButtonCoordinates]
|
||||||
|
button1 = 408,418,70,66
|
||||||
|
button2 = 486,418,70,66
|
||||||
|
button3 = 564,418,70,66
|
||||||
|
button4 = 642,418,70,66
|
||||||
|
button5 = 719,417,70,66
|
||||||
|
button6 = 797,418,70,66
|
||||||
|
button7 = 875,418,70,66
|
||||||
|
button8 = 953,418,70,66
|
||||||
|
button9 = 1032,418,70,66
|
||||||
|
button10 = 1110,418,70,66
|
||||||
|
|
||||||
|
[NumberButtonImages]
|
||||||
|
button0_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-03.png
|
||||||
|
button0_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-42.png
|
||||||
|
button0_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-03.png
|
||||||
|
button1_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-04.png
|
||||||
|
button1_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-43.png
|
||||||
|
button1_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-04.png
|
||||||
|
button2_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-05.png
|
||||||
|
button2_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-44.png
|
||||||
|
button2_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-05.png
|
||||||
|
button3_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-06.png
|
||||||
|
button3_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-45.png
|
||||||
|
button3_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-06.png
|
||||||
|
button4_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-07.png
|
||||||
|
button4_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-46.png
|
||||||
|
button4_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-07.png
|
||||||
|
button5_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-08.png
|
||||||
|
button5_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-47.png
|
||||||
|
button5_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-08.png
|
||||||
|
button6_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-09.png
|
||||||
|
button6_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-48.png
|
||||||
|
button6_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-09.png
|
||||||
|
button7_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-10.png
|
||||||
|
button7_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-49.png
|
||||||
|
button7_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-10.png
|
||||||
|
button8_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-11.png
|
||||||
|
button8_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-50.png
|
||||||
|
button8_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-11.png
|
||||||
|
button9_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-12.png
|
||||||
|
button9_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-51.png
|
||||||
|
button9_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-12.png
|
||||||
|
|
||||||
|
[EnglishLetterButtonCoordinates]
|
||||||
|
button0 = 408,489,70,66
|
||||||
|
button1 = 486,489,70,66
|
||||||
|
button2 = 564,489,70,66
|
||||||
|
button3 = 642,489,70,66
|
||||||
|
button4 = 720,489,70,66
|
||||||
|
button5 = 798,489,70,66
|
||||||
|
button6 = 876,489,70,66
|
||||||
|
button7 = 953,489,70,66
|
||||||
|
button8 = 1032,489,70,66
|
||||||
|
button9 = 1110,489,70,66
|
||||||
|
button10 = 449,560,70,66
|
||||||
|
button11 = 527,560,70,66
|
||||||
|
button12 = 605,560,70,66
|
||||||
|
button13 = 683,560,70,66
|
||||||
|
button14 = 761,560,70,66
|
||||||
|
button15 = 838,560,70,66
|
||||||
|
button16 = 916,560,70,66
|
||||||
|
button17 = 994,560,70,66
|
||||||
|
button18 = 1072,560,70,66
|
||||||
|
button19 = 486,631,70,66
|
||||||
|
button20 = 564,631,70,66
|
||||||
|
button21 = 642,631,70,66
|
||||||
|
button22 = 720,631,70,66
|
||||||
|
button23 = 798,631,70,66
|
||||||
|
button24 = 876,631,70,66
|
||||||
|
button25 = 954,631,70,66
|
||||||
|
|
||||||
|
[EnglishLetterButtonImages]
|
||||||
|
button0_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-13.png
|
||||||
|
button0_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-52.png
|
||||||
|
button0_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-13.png
|
||||||
|
button1_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-14.png
|
||||||
|
button1_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-53.png
|
||||||
|
button1_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-14.png
|
||||||
|
button2_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-15.png
|
||||||
|
button2_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-54.png
|
||||||
|
button2_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-15.png
|
||||||
|
button3_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-16.png
|
||||||
|
button3_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-55.png
|
||||||
|
button3_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-16.png
|
||||||
|
button4_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-17.png
|
||||||
|
button4_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-56.png
|
||||||
|
button4_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-17.png
|
||||||
|
button5_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-18.png
|
||||||
|
button5_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-57.png
|
||||||
|
button5_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-18.png
|
||||||
|
button6_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-19.png
|
||||||
|
button6_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-58.png
|
||||||
|
button6_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-19.png
|
||||||
|
button7_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-20.png
|
||||||
|
button7_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-59.png
|
||||||
|
button7_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-20.png
|
||||||
|
button8_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-21.png
|
||||||
|
button8_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-60.png
|
||||||
|
button8_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-21.png
|
||||||
|
button9_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-22.png
|
||||||
|
button9_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-61.png
|
||||||
|
button9_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-22.png
|
||||||
|
button10_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-23.png
|
||||||
|
button10_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-62.png
|
||||||
|
button10_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-23.png
|
||||||
|
button11_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-24.png
|
||||||
|
button11_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-63.png
|
||||||
|
button11_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-24.png
|
||||||
|
button12_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-25.png
|
||||||
|
button12_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-64.png
|
||||||
|
button12_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-25.png
|
||||||
|
button13_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-26.png
|
||||||
|
button13_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-65.png
|
||||||
|
button13_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-26.png
|
||||||
|
button14_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-27.png
|
||||||
|
button14_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-66.png
|
||||||
|
button14_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-27.png
|
||||||
|
button15_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-28.png
|
||||||
|
button15_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-67.png
|
||||||
|
button15_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-28.png
|
||||||
|
button16_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-29.png
|
||||||
|
button16_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-68.png
|
||||||
|
button16_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-29.png
|
||||||
|
button17_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-30.png
|
||||||
|
button17_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-69.png
|
||||||
|
button17_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-30.png
|
||||||
|
button18_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-31.png
|
||||||
|
button18_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-70.png
|
||||||
|
button18_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-31.png
|
||||||
|
button19_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-33.png
|
||||||
|
button19_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-72.png
|
||||||
|
button19_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-33.png
|
||||||
|
button20_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-34.png
|
||||||
|
button20_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-73.png
|
||||||
|
button20_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-34.png
|
||||||
|
button21_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-35.png
|
||||||
|
button21_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-74.png
|
||||||
|
button21_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-35.png
|
||||||
|
button22_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-36.png
|
||||||
|
button22_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-75.png
|
||||||
|
button22_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-36.png
|
||||||
|
button23_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-37.png
|
||||||
|
button23_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-76.png
|
||||||
|
button23_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-37.png
|
||||||
|
button24_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-38.png
|
||||||
|
button24_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-77.png
|
||||||
|
button24_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-38.png
|
||||||
|
button25_normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-39.png
|
||||||
|
button25_mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-78.png
|
||||||
|
button25_mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-39.png
|
||||||
|
|
||||||
|
[ModifyButtonImagesEnglish]
|
||||||
|
normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-40.png
|
||||||
|
mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-40.png
|
||||||
|
mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-79.png
|
||||||
|
|
||||||
|
[ClearButtonImagesEnglish]
|
||||||
|
normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-32.png
|
||||||
|
mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-32.png
|
||||||
|
mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-71.png
|
||||||
|
|
||||||
|
[CloseButtonImagesEnglish]
|
||||||
|
normal = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-41.png
|
||||||
|
mouseOver = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-41.png
|
||||||
|
mouseDown = themes\superstar\歌星\英文\VOD_歌星查詢_英文查詢(按鍵)-80.png
|
||||||
|
|
||||||
|
[InputBoxEnglishSingers]
|
||||||
|
X = 409
|
||||||
|
Y = 360
|
||||||
|
Width = 478
|
||||||
|
Height = 47
|
||||||
|
FontName = Times New Roman
|
||||||
|
FontSize = 26
|
||||||
|
FontStyle = Regular
|
||||||
|
ForeColor = Black
|
||||||
|
|
||||||
|
[PinYinLetterButtonCoordinates]
|
||||||
|
button0 = 154,450,94,87
|
||||||
|
button1 = 258,450,94,87
|
||||||
|
button2 = 362,450,94,87
|
||||||
|
button3 = 466,450,94,87
|
||||||
|
button4 = 570,450,94,87
|
||||||
|
button5 = 674,450,94,87
|
||||||
|
button6 = 778,450,94,87
|
||||||
|
button7 = 882,450,94,87
|
||||||
|
button8 = 988,450,94,87
|
||||||
|
button9 = 1092,450,94,87
|
||||||
|
button10 = 206,546,94,87
|
||||||
|
button11 = 310,546,94,87
|
||||||
|
button12 = 414,546,94,87
|
||||||
|
button13 = 518,546,94,87
|
||||||
|
button14 = 622,545,94,87
|
||||||
|
button15 = 726,546,94,87
|
||||||
|
button16 = 830,546,94,87
|
||||||
|
button17 = 934,546,94,87
|
||||||
|
button18 = 1038,546,94,87
|
||||||
|
button19 = 258,642,94,87
|
||||||
|
button20 = 362,642,94,87
|
||||||
|
button21 = 466,642,94,87
|
||||||
|
button22 = 570,643,94,87
|
||||||
|
button23 = 674,642,94,87
|
||||||
|
button24 = 778,642,94,87
|
||||||
|
button25 = 882,642,94,87
|
||||||
|
|
||||||
|
[PinYinLetterButtonImages]
|
||||||
|
button0_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-03.png
|
||||||
|
button0_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-32.png
|
||||||
|
button0_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-03.png
|
||||||
|
button1_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-04.png
|
||||||
|
button1_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-33.png
|
||||||
|
button1_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-04.png
|
||||||
|
button2_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-05.png
|
||||||
|
button2_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-34.png
|
||||||
|
button2_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-05.png
|
||||||
|
button3_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-06.png
|
||||||
|
button3_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-35.png
|
||||||
|
button3_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-06.png
|
||||||
|
button4_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-07.png
|
||||||
|
button4_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-36.png
|
||||||
|
button4_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-07.png
|
||||||
|
button5_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-08.png
|
||||||
|
button5_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-37.png
|
||||||
|
button5_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-08.png
|
||||||
|
button6_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-09.png
|
||||||
|
button6_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-38.png
|
||||||
|
button6_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-09.png
|
||||||
|
button7_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-10.png
|
||||||
|
button7_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-39.png
|
||||||
|
button7_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-10.png
|
||||||
|
button8_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-11.png
|
||||||
|
button8_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-40.png
|
||||||
|
button8_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-11.png
|
||||||
|
button9_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-12.png
|
||||||
|
button9_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-41.png
|
||||||
|
button9_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-12.png
|
||||||
|
button10_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-13.png
|
||||||
|
button10_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-42.png
|
||||||
|
button10_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-13.png
|
||||||
|
button11_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-14.png
|
||||||
|
button11_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-43.png
|
||||||
|
button11_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-14.png
|
||||||
|
button12_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-15.png
|
||||||
|
button12_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-44.png
|
||||||
|
button12_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-15.png
|
||||||
|
button13_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-16.png
|
||||||
|
button13_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-45.png
|
||||||
|
button13_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-16.png
|
||||||
|
button14_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-17.png
|
||||||
|
button14_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-46.png
|
||||||
|
button14_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-17.png
|
||||||
|
button15_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-18.png
|
||||||
|
button15_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-47.png
|
||||||
|
button15_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-18.png
|
||||||
|
button16_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-19.png
|
||||||
|
button16_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-48.png
|
||||||
|
button16_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-19.png
|
||||||
|
button17_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-20.png
|
||||||
|
button17_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-49.png
|
||||||
|
button17_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-20.png
|
||||||
|
button18_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-21.png
|
||||||
|
button18_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-50.png
|
||||||
|
button18_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-21.png
|
||||||
|
button19_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-23.png
|
||||||
|
button19_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-52.png
|
||||||
|
button19_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-23.png
|
||||||
|
button20_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-24.png
|
||||||
|
button20_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-53.png
|
||||||
|
button20_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-24.png
|
||||||
|
button21_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-25.png
|
||||||
|
button21_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-54.png
|
||||||
|
button21_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-25.png
|
||||||
|
button22_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-26.png
|
||||||
|
button22_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-55.png
|
||||||
|
button22_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-26.png
|
||||||
|
button23_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-27.png
|
||||||
|
button23_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-56.png
|
||||||
|
button23_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-27.png
|
||||||
|
button24_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-28.png
|
||||||
|
button24_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-57.png
|
||||||
|
button24_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-28.png
|
||||||
|
button25_normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-29.png
|
||||||
|
button25_mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-58.png
|
||||||
|
button25_mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-29.png
|
||||||
|
|
||||||
|
[ModifyButtonImagesPinYin]
|
||||||
|
normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-30.png
|
||||||
|
mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-30.png
|
||||||
|
mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-59.png
|
||||||
|
|
||||||
|
[ClearButtonImagesPinYin]
|
||||||
|
normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-22.png
|
||||||
|
mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-22.png
|
||||||
|
mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-51.png
|
||||||
|
|
||||||
|
[CloseButtonImagesPinYin]
|
||||||
|
normal = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-31.png
|
||||||
|
mouseOver = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-31.png
|
||||||
|
mouseDown = themes\superstar\歌星\拼音\VOD_歌星查詢_拼音查詢(按鍵)-60.png
|
||||||
|
|
||||||
|
[InputBoxPinYinSingers]
|
||||||
|
X = 156
|
||||||
|
Y = 370
|
||||||
|
Width = 628
|
||||||
|
Height = 63
|
||||||
|
FontName = Times New Roman
|
||||||
|
FontSize = 26
|
||||||
|
FontStyle = Regular
|
||||||
|
ForeColor = Black
|
||||||
|
|
||||||
|
[RefillButtonImagesHandWriting]
|
||||||
|
normal = themes\superstar\歌星\手寫\3.歌星查詢(手寫按鍵)_重填.png
|
||||||
|
mouseOver = themes\superstar\歌星\手寫\3.歌星查詢(手寫按鍵)_重填.png
|
||||||
|
mouseDown = themes\superstar\歌星\手寫\3.歌星查詢(手寫按鍵)_重填 複本.png
|
||||||
|
|
||||||
|
[ClearButtonImagesHandWriting]
|
||||||
|
normal = themes\superstar\歌星\手寫\3.歌星查詢(手寫按鍵)_清除.png
|
||||||
|
mouseOver = themes\superstar\歌星\手寫\3.歌星查詢(手寫按鍵)_清除.png
|
||||||
|
mouseDown = themes\superstar\歌星\手寫\3.歌星查詢(手寫按鍵)_清除 複本.png
|
||||||
|
|
||||||
|
[CloseButtonImagesHandWriting]
|
||||||
|
normal = themes\superstar\歌星\手寫\3.歌星查詢(手寫按鍵)_關閉.png
|
||||||
|
mouseOver = themes\superstar\歌星\手寫\3.歌星查詢(手寫按鍵)_關閉.png
|
||||||
|
mouseDown = themes\superstar\歌星\手寫\3.歌星查詢(手寫按鍵)_關閉 複本.png
|
||||||
|
|
||||||
|
[InputBoxZhuYinSongs]
|
||||||
|
X=150
|
||||||
|
Y=264
|
||||||
|
Width=596
|
||||||
|
Height=63
|
||||||
|
FontName=微軟正黑體
|
||||||
|
FontSize=26
|
||||||
|
FontStyle=Bold
|
||||||
|
ForeColor=Black
|
||||||
|
|
||||||
|
[InputBoxEnglishSongs]
|
||||||
|
X = 409
|
||||||
|
Y = 360
|
||||||
|
Width = 478
|
||||||
|
Height = 47
|
||||||
|
FontName = Times New Roman
|
||||||
|
FontSize = 26
|
||||||
|
FontStyle = Regular
|
||||||
|
ForeColor = Black
|
||||||
|
|
||||||
|
[InputBoxPinYinSongs]
|
||||||
|
X = 156
|
||||||
|
Y = 370
|
||||||
|
Width = 628
|
||||||
|
Height = 63
|
||||||
|
FontName = Times New Roman
|
||||||
|
FontSize = 26
|
||||||
|
FontStyle = Regular
|
||||||
|
ForeColor = Black
|
||||||
|
|
||||||
|
[PictureBoxWordCountSongs]
|
||||||
|
X = 790
|
||||||
|
Y = 350
|
||||||
|
Width = 420
|
||||||
|
Height = 350
|
||||||
|
|
||||||
|
[InputBoxWordCountSongs]
|
||||||
|
X = 800
|
||||||
|
Y = 405
|
||||||
|
Width = 400
|
||||||
|
Height = 60
|
||||||
|
FontName = Times New Roman
|
||||||
|
FontSize = 26
|
||||||
|
FontStyle = Regular
|
||||||
|
ForeColor = Black
|
||||||
|
|
||||||
|
[NumberWordCountSymbols]
|
||||||
|
Symbols=1,2,3,4,5,6,7,8,9,0
|
||||||
|
|
||||||
|
[NumberWordCountButtonCoordinates]
|
||||||
|
button0 = 650,420,70,65
|
||||||
|
button1 = 804,474,72,67
|
||||||
|
button2 = 886,474,72,67
|
||||||
|
button3 = 965,474,73,67
|
||||||
|
button4 = 1048,474,72,67
|
||||||
|
button5 = 1129,474,72,67
|
||||||
|
button6 = 804,548,72,67
|
||||||
|
button7 = 886,548,72,67
|
||||||
|
button8 = 965,548,73,67
|
||||||
|
button9 = 1048,548,72,67
|
||||||
|
button10 = 1129,548,72,67
|
||||||
|
|
||||||
|
[NumberWordCountButtonImages]
|
||||||
|
button0_normal = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-02.png
|
||||||
|
button0_mouseDown = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-17.png
|
||||||
|
button0_mouseOver = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-02.png
|
||||||
|
button1_normal = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-03.png
|
||||||
|
button1_mouseDown = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-18.png
|
||||||
|
button1_mouseOver = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-03.png
|
||||||
|
button2_normal = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-04.png
|
||||||
|
button2_mouseDown = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-19.png
|
||||||
|
button2_mouseOver = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-04.png
|
||||||
|
button3_normal = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-05.png
|
||||||
|
button3_mouseDown = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-20.png
|
||||||
|
button3_mouseOver = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-05.png
|
||||||
|
button4_normal = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-06.png
|
||||||
|
button4_mouseDown = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-21.png
|
||||||
|
button4_mouseOver = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-06.png
|
||||||
|
button5_normal = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-07.png
|
||||||
|
button5_mouseDown = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-22.png
|
||||||
|
button5_mouseOver = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-07.png
|
||||||
|
button6_normal = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-08.png
|
||||||
|
button6_mouseDown = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-23.png
|
||||||
|
button6_mouseOver = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-08.png
|
||||||
|
button7_normal = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-09.png
|
||||||
|
button7_mouseDown = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-24.png
|
||||||
|
button7_mouseOver = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-09.png
|
||||||
|
button8_normal = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-10.png
|
||||||
|
button8_mouseDown = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-25.png
|
||||||
|
button8_mouseOver = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-10.png
|
||||||
|
button9_normal = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-11.png
|
||||||
|
button9_mouseDown = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-26.png
|
||||||
|
button9_mouseOver = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-11.png
|
||||||
|
|
||||||
|
[ModifyButtonImagesWordCount]
|
||||||
|
normal = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-13.png
|
||||||
|
mouseOver = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-13.png
|
||||||
|
mouseDown = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-28.png
|
||||||
|
|
||||||
|
[ClearButtonImagesWordCount]
|
||||||
|
normal = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-14.png
|
||||||
|
mouseOver = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-14.png
|
||||||
|
mouseDown = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-29.png
|
||||||
|
|
||||||
|
[CloseButtonImagesWordCount]
|
||||||
|
normal = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-15.png
|
||||||
|
mouseOver = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-15.png
|
||||||
|
mouseDown = themes\superstar\歌名\字數\VOD_歌名查詢_編號查詢(按鍵)-30.png
|
||||||
|
|
||||||
|
[PictureBoxSongIDSearch]
|
||||||
|
X = 650
|
||||||
|
Y = 300
|
||||||
|
Width = 554
|
||||||
|
Height = 442
|
||||||
|
|
||||||
|
[InputBoxSongIDSearch]
|
||||||
|
X = 660
|
||||||
|
Y = 380
|
||||||
|
Width = 530
|
||||||
|
Height = 63
|
||||||
|
FontName = Times New Roman
|
||||||
|
FontSize = 26
|
||||||
|
FontStyle = Regular
|
||||||
|
ForeColor = Black
|
||||||
|
|
||||||
|
[NumberSongIDSymbols]
|
||||||
|
Symbols=1,2,3,4,5,6,7,8,9,0
|
||||||
|
|
||||||
|
[NumberSongIDButtonCoordinates]
|
||||||
|
button0 = 650,300,94,87
|
||||||
|
button1 = 668,453,94,87
|
||||||
|
button2 = 775,453,94,87
|
||||||
|
button3 = 882,453,94,87
|
||||||
|
button4 = 989,453,94,87
|
||||||
|
button5 = 1097,453,94,87
|
||||||
|
button6 = 668,547,94,87
|
||||||
|
button7 = 775,547,94,87
|
||||||
|
button8 = 882,547,94,87
|
||||||
|
button9 = 989,547,94,87
|
||||||
|
button10 = 1097,547,94,87
|
||||||
|
|
||||||
|
[NumberSongIDButtonImages]
|
||||||
|
button0_normal = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-02.png
|
||||||
|
button0_mouseDown = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-17.png
|
||||||
|
button0_mouseOver = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-02.png
|
||||||
|
button1_normal = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-03.png
|
||||||
|
button1_mouseDown = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-18.png
|
||||||
|
button1_mouseOver = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-03.png
|
||||||
|
button2_normal = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-04.png
|
||||||
|
button2_mouseDown = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-19.png
|
||||||
|
button2_mouseOver = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-04.png
|
||||||
|
button3_normal = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-05.png
|
||||||
|
button3_mouseDown = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-20.png
|
||||||
|
button3_mouseOver = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-05.png
|
||||||
|
button4_normal = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-06.png
|
||||||
|
button4_mouseDown = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-21.png
|
||||||
|
button4_mouseOver = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-06.png
|
||||||
|
button5_normal = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-07.png
|
||||||
|
button5_mouseDown = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-22.png
|
||||||
|
button5_mouseOver = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-07.png
|
||||||
|
button6_normal = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-08.png
|
||||||
|
button6_mouseDown = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-23.png
|
||||||
|
button6_mouseOver = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-08.png
|
||||||
|
button7_normal = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-09.png
|
||||||
|
button7_mouseDown = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-24.png
|
||||||
|
button7_mouseOver = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-09.png
|
||||||
|
button8_normal = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-10.png
|
||||||
|
button8_mouseDown = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-25.png
|
||||||
|
button8_mouseOver = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-10.png
|
||||||
|
button9_normal = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-11.png
|
||||||
|
button9_mouseDown = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-26.png
|
||||||
|
button9_mouseOver = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-11.png
|
||||||
|
|
||||||
|
[ModifyButtonImagesSongID]
|
||||||
|
normal = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-13.png
|
||||||
|
mouseOver = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-13.png
|
||||||
|
mouseDown = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-28.png
|
||||||
|
|
||||||
|
[ClearButtonImagesSongID]
|
||||||
|
normal = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-14.png
|
||||||
|
mouseOver = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-14.png
|
||||||
|
mouseDown = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-29.png
|
||||||
|
|
||||||
|
[CloseButtonImagesSongID]
|
||||||
|
normal = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-15.png
|
||||||
|
mouseOver = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-15.png
|
||||||
|
mouseDown = themes\superstar\歌名\編號\VOD_歌名查詢_編號查詢(按鍵)-30.png
|
||||||
|
|
||||||
|
|
||||||
|
[PictureBoxWordCountSingers]
|
||||||
|
X = 790
|
||||||
|
Y = 350
|
||||||
|
Width = 420
|
||||||
|
Height = 350
|
||||||
|
|
||||||
|
[InputBoxWordCountSingers]
|
||||||
|
X = 800
|
||||||
|
Y = 405
|
||||||
|
Width = 400
|
||||||
|
Height = 60
|
||||||
|
FontName = Times New Roman
|
||||||
|
FontSize = 26
|
||||||
|
FontStyle = Regular
|
||||||
|
ForeColor = Black
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.2 MiB |
Before Width: | Height: | Size: 486 KiB After Width: | Height: | Size: 486 KiB |
Before Width: | Height: | Size: 552 KiB After Width: | Height: | Size: 552 KiB |
Before Width: | Height: | Size: 662 KiB After Width: | Height: | Size: 662 KiB |
Before Width: | Height: | Size: 720 KiB After Width: | Height: | Size: 720 KiB |
Before Width: | Height: | Size: 462 KiB After Width: | Height: | Size: 462 KiB |
Before Width: | Height: | Size: 496 KiB After Width: | Height: | Size: 496 KiB |