test #1
6
.gitignore
vendored
@ -3,5 +3,7 @@ Superstar.mdf
|
||||
Superstar_log.ldf
|
||||
.vs
|
||||
build.bat
|
||||
DualScreenKTVPlayStation.exe
|
||||
themes/superstar/_www/
|
||||
*.exe
|
||||
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,29 +7,30 @@ using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
|
||||
using DBObj;
|
||||
using OverlayFormObj;
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
public class CommandHandler
|
||||
{
|
||||
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;
|
||||
|
||||
public CommandHandler(SongListManager songListManager)
|
||||
{
|
||||
this.songListManager = songListManager;
|
||||
}
|
||||
|
||||
|
||||
//關機錨點
|
||||
public async Task ProcessData(string indata)
|
||||
{
|
||||
string filePath = Path.Combine(Application.StartupPath, "dataLog.txt");
|
||||
if (CheckLogForShutdown(filePath))
|
||||
{
|
||||
Console.WriteLine("Shutdown condition met. Application will now close.");
|
||||
ShutdownComputer();
|
||||
}
|
||||
|
||||
AddToHistory(indata);
|
||||
switch (indata)
|
||||
{
|
||||
case "A261A4":
|
||||
@ -40,6 +41,9 @@ namespace DualScreenDemo
|
||||
break;
|
||||
case "A263A4":
|
||||
ClearDisplay();
|
||||
_wrongInputCountfor62 = 0; // 重置計數器
|
||||
_wrongInputCountfor61 = 0; // 重置計數器
|
||||
_indataHistory.Clear(); // 清空歷史紀錄
|
||||
break;
|
||||
case "A268A4":
|
||||
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)
|
||||
{
|
||||
if (OverlayForm.MainForm.InvokeRequired)
|
||||
@ -316,7 +342,18 @@ namespace DualScreenDemo
|
||||
else
|
||||
{
|
||||
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.displayTimer.Start();
|
||||
}
|
||||
@ -335,7 +372,18 @@ namespace DualScreenDemo
|
||||
else
|
||||
{
|
||||
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.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()
|
||||
{
|
||||
@ -388,7 +446,18 @@ namespace DualScreenDemo
|
||||
else
|
||||
{
|
||||
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.displayTimer.Start();
|
||||
}
|
||||
@ -405,7 +474,18 @@ namespace DualScreenDemo
|
||||
else
|
||||
{
|
||||
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.displayTimer.Start();
|
||||
}
|
||||
@ -415,9 +495,8 @@ namespace DualScreenDemo
|
||||
|
||||
private static void ClearDisplay()
|
||||
{
|
||||
|
||||
OverlayForm.displayTimer.Stop();
|
||||
|
||||
|
||||
|
||||
if (OverlayForm.MainForm.InvokeRequired)
|
||||
{
|
||||
@ -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()
|
||||
{
|
||||
try
|
||||
|
@ -1,4 +1,4 @@
|
||||
namespace DualScreenDemo
|
||||
namespace DBObj
|
||||
{
|
||||
// artist OOP test
|
||||
public class Artist
|
@ -4,11 +4,11 @@ using System.Data.SQLite;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace DualScreenDemo
|
||||
using DualScreenDemo;
|
||||
namespace DBObj
|
||||
{
|
||||
/**
|
||||
重資料庫取資料回來
|
||||
從資料庫取資料回來
|
||||
*/
|
||||
public class ArtistManager
|
||||
{
|
@ -1,6 +1,6 @@
|
||||
using System;
|
||||
|
||||
namespace DualScreenDemo
|
||||
namespace DBObj
|
||||
{
|
||||
public class SongData
|
||||
{
|
@ -6,8 +6,8 @@ using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
using System.Globalization;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace DualScreenDemo
|
||||
using DualScreenDemo;
|
||||
namespace DBObj
|
||||
{
|
||||
public class SongListManager
|
||||
{
|
||||
@ -262,25 +262,15 @@ namespace DualScreenDemo
|
||||
string artistB = reader["歌星 B"].ToString();
|
||||
string artistACategory = reader["歌星A分類"].ToString();
|
||||
string artistBCategory = reader["歌星B分類"].ToString();
|
||||
string dateValue = reader["新增日期"].ToString();
|
||||
string dateValue = reader["新增日期"]?.ToString() ?? "";
|
||||
DateTime addedTime;
|
||||
|
||||
if (string.IsNullOrWhiteSpace(dateValue))
|
||||
try
|
||||
{
|
||||
// Console.WriteLine(String.Format("Date value is null or empty for song: {0}. Setting to default DateTime.", song));
|
||||
addedTime = DateTime.Now;
|
||||
addedTime=DateTime.Parse(dateValue, CultureInfo.InvariantCulture).Date ;
|
||||
}
|
||||
else
|
||||
catch (System.FormatException)
|
||||
{
|
||||
try
|
||||
{
|
||||
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;
|
||||
}
|
||||
addedTime = DateTime.Today;
|
||||
}
|
||||
string basePathHost1 = reader["路徑 1"].ToString();
|
||||
string basePathHost2 = reader["路徑 2"].ToString();
|
||||
@ -373,7 +363,7 @@ namespace DualScreenDemo
|
||||
}
|
||||
catch (System.FormatException)
|
||||
{
|
||||
addedTime = DateTime.Now;
|
||||
addedTime = DateTime.Today;
|
||||
}
|
||||
|
||||
string basePathHost1 = reader["路徑 1"].ToString();
|
@ -17,6 +17,8 @@ using SystemAction = System.Action;
|
||||
using ZXingAction = ZXing.Action;
|
||||
using System.Threading;
|
||||
using System.Collections.Concurrent;
|
||||
using DBObj;
|
||||
using OverlayFormObj;
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
public class HttpServer
|
||||
@ -29,7 +31,7 @@ namespace DualScreenDemo
|
||||
public static event ActionString OnDisplayBarrage;
|
||||
private static DateTime lastClickTime = DateTime.MinValue;
|
||||
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 SemaphoreSlim _requestThrottle = new SemaphoreSlim(20); // 限制并发请求数
|
||||
private static readonly CancellationTokenSource _serverCts = new CancellationTokenSource();
|
||||
@ -45,28 +47,40 @@ namespace DualScreenDemo
|
||||
string localAddress = GetLocalIPAddress(); // 使用获取的本地 IP
|
||||
string externalAddress = "";
|
||||
|
||||
// 读取外网地址
|
||||
// 讀取外網地址 沒有端口號
|
||||
string serverAddressFilePath = @"\\SVR01\superstarb\txt\ip.txt";
|
||||
if (File.Exists(serverAddressFilePath))
|
||||
{
|
||||
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();
|
||||
|
||||
// 添加本地地址前缀
|
||||
|
||||
// 構造本地地址的 URL 前綴(包含協議、地址和端口)
|
||||
string localPrefix = String.Format("http://{0}:{1}/", localAddress, port);
|
||||
|
||||
// 在控制台輸出添加的本地前綴,方便調試
|
||||
Console.WriteLine("Adding local prefix: " + localPrefix);
|
||||
|
||||
// 將本地前綴添加到 HttpListener,使其監聽該 URL
|
||||
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))
|
||||
{
|
||||
// 解析外网地址和端口
|
||||
// 錨點 2
|
||||
// 外網 IP 和 port 調整
|
||||
string[] parts = externalAddress.Split(':');
|
||||
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);
|
||||
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", "ss.net.dnsnet.cc", 1102, randomFolderName);
|
||||
|
||||
// 修改外网二维码内容生成
|
||||
|
||||
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;
|
||||
|
||||
|
||||
Console.WriteLine("local QR Content : " + localQrContent);
|
||||
Console.WriteLine("external QR Content : " + externalQrContent);
|
||||
// 生成二维码(这里使用外网地址的二维码,因为通常外网地址更有用)
|
||||
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://111.246.145.170:8080/");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 生成隨機路徑
|
||||
/// </summary>
|
||||
/// <param name="baseDirectory"></param>
|
||||
/// <returns></returns>
|
||||
private static string CreateRandomFolderAndRedirectHTML(string baseDirectory)
|
||||
{
|
||||
string randomFolderName = Path.GetRandomFileName().Replace(".", "");
|
||||
@ -961,16 +983,16 @@ namespace DualScreenDemo
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (JsonException ex)
|
||||
{
|
||||
context.Response.StatusCode = 400;
|
||||
Console.WriteLine("解析留言数据时出错");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
context.Response.StatusCode = 500;
|
||||
Console.WriteLine("服务器内部错误");
|
||||
}
|
||||
//catch (JsonException ex)
|
||||
//{
|
||||
// context.Response.StatusCode = 400;
|
||||
// Console.WriteLine("解析留言数据时出错");
|
||||
//}
|
||||
//catch (Exception ex)
|
||||
//{
|
||||
// context.Response.StatusCode = 500;
|
||||
// Console.WriteLine("服务器内部错误");
|
||||
//}
|
||||
finally
|
||||
{
|
||||
context.Response.Close();
|
||||
|
@ -6,13 +6,13 @@ namespace DualScreenDemo
|
||||
{
|
||||
public static class HttpServerManager
|
||||
{
|
||||
public static void StartServer()
|
||||
public static async void StartServer()
|
||||
{
|
||||
int httpPort = 9090; // 你可以修改此端口
|
||||
string baseDirectory = Path.Combine(Application.StartupPath, @"themes\superstar\_www");
|
||||
|
||||
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.Linq;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace DualScreenDemo
|
||||
using DualScreenDemo;
|
||||
namespace OverlayFormObj
|
||||
{
|
||||
public partial class OverlayForm
|
||||
{
|
@ -7,8 +7,9 @@ using System;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace DualScreenDemo
|
||||
using DBObj;
|
||||
using DualScreenDemo;
|
||||
namespace OverlayFormObj
|
||||
{
|
||||
public partial class OverlayForm
|
||||
{
|
||||
@ -268,12 +269,12 @@ namespace DualScreenDemo
|
||||
this.Controls.Add(displayLabel);
|
||||
}
|
||||
}
|
||||
|
||||
// 播放暫停,字體大小
|
||||
private void InitializePauseLabel()
|
||||
{
|
||||
pauseLabel = new Label();
|
||||
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.TextAlign = ContentAlignment.MiddleCenter;
|
||||
pauseLabel.Size = new Size(1080, 200);
|
||||
@ -317,13 +318,13 @@ namespace DualScreenDemo
|
||||
this.Controls.Add(pauseLabel);
|
||||
}
|
||||
|
||||
|
||||
// 播放靜音,字體大小
|
||||
private void InitializeMuteLabel()
|
||||
{
|
||||
muteLabel = new Label();
|
||||
muteLabel.AutoSize = 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.TextAlign = ContentAlignment.MiddleCenter;
|
||||
muteLabel.Size = new Size(1080, 200);
|
@ -12,8 +12,9 @@ using Newtonsoft.Json;
|
||||
using ZXing;
|
||||
using ZXing.QrCode;
|
||||
using System.Timers;
|
||||
|
||||
namespace DualScreenDemo
|
||||
using DBObj;
|
||||
using DualScreenDemo;
|
||||
namespace OverlayFormObj
|
||||
{
|
||||
public partial class OverlayForm : Form
|
||||
{
|
||||
@ -80,10 +81,10 @@ namespace DualScreenDemo
|
||||
MainForm = this;
|
||||
InitializeFormSettings();
|
||||
ConfigureTimers();
|
||||
LoadBackgroundImage();
|
||||
ConfigureImageDisplay();
|
||||
|
||||
InitializeLabels();
|
||||
ConfigureSegmentTimer();
|
||||
imageYPos = (screenHeight / 3) - 1024 / 6;
|
||||
}
|
||||
private void ConfigureSegmentTimer()
|
||||
{
|
||||
@ -415,8 +416,7 @@ private Rectangle FindContentBounds(Bitmap bmp)
|
||||
firstStickerImage = null;
|
||||
this.Invalidate();
|
||||
}
|
||||
if (secondStickerImage == null)
|
||||
LoadBackgroundImage();
|
||||
|
||||
stickerTimer1.Stop();
|
||||
HideImages();
|
||||
};
|
||||
@ -428,8 +428,6 @@ private Rectangle FindContentBounds(Bitmap bmp)
|
||||
secondStickerImage = null;
|
||||
this.Invalidate();
|
||||
}
|
||||
if (firstStickerImage == null)
|
||||
LoadBackgroundImage();
|
||||
stickerTimer2.Stop();
|
||||
HideImages();
|
||||
};
|
||||
@ -479,7 +477,7 @@ private static void SongDisplayTimer_Elapsed(object sender, EventArgs e)
|
||||
|
||||
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");
|
||||
|
||||
@ -496,28 +494,28 @@ private static void SongDisplayTimer_Elapsed(object sender, EventArgs e)
|
||||
case UIState.SelectingLanguage:
|
||||
|
||||
SetUIState(UIState.Initial);
|
||||
HandleTimeout("");
|
||||
await HandleTimeout("");
|
||||
break;
|
||||
case UIState.SelectingArtistCategory:
|
||||
SetUIState(UIState.Initial);
|
||||
HandleTimeout("");
|
||||
await HandleTimeout("");
|
||||
break;
|
||||
case UIState.SelectingAction:
|
||||
SetUIState(UIState.Initial);
|
||||
HandleTimeout("");
|
||||
await HandleTimeout("");
|
||||
break;
|
||||
case UIState.SelectingSong:
|
||||
|
||||
SetUIState(UIState.Initial);
|
||||
HandleTimeout("");
|
||||
await HandleTimeout("");
|
||||
break;
|
||||
case UIState.SelectingArtist:
|
||||
SetUIState(UIState.Initial);
|
||||
HandleTimeout("");
|
||||
await HandleTimeout("");
|
||||
break;
|
||||
case UIState.PlayHistory:
|
||||
SetUIState(UIState.Initial);
|
||||
HandleTimeout("");
|
||||
await HandleTimeout("");
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -539,40 +537,6 @@ private static void SongDisplayTimer_Elapsed(object sender, EventArgs e)
|
||||
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()
|
||||
{
|
||||
bool anyStickersActive = false;
|
||||
@ -799,7 +763,7 @@ private static void SongDisplayTimer_Elapsed(object sender, EventArgs e)
|
||||
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);
|
||||
try
|
||||
{
|
||||
@ -809,8 +773,7 @@ private static void SongDisplayTimer_Elapsed(object sender, EventArgs e)
|
||||
if (firstStickerImage == null)
|
||||
{
|
||||
firstStickerImage = newSticker;
|
||||
firstStickerXPos = this.Width / 2 - firstStickerImage.Width / 2;
|
||||
LoadBackgroundImage();
|
||||
firstStickerXPos = this.Width / 2 - firstStickerImage.Width / 2;
|
||||
stickerTimer1.Start();
|
||||
}
|
||||
else if (secondStickerImage == null)
|
||||
@ -1313,7 +1276,7 @@ public void UpdateHistoryLabel(List<SongData> historySongs, List<PlayState> play
|
||||
int mainTitleFontSize = 60;
|
||||
int optionFontSize = 50;
|
||||
int lineSpacing = 15;
|
||||
int columnSpacing = 400;
|
||||
//int columnSpacing = 400;
|
||||
|
||||
// 主標題
|
||||
string mainTitle = messages[0];
|
||||
@ -1615,254 +1578,299 @@ private void DisplaySongsInLanguage(string language, Category category)
|
||||
public int totalSongs = 0;
|
||||
|
||||
|
||||
public void DisplaySongs(int page)
|
||||
{
|
||||
if (LanguageSongList == null || LanguageSongList.Count == 0)
|
||||
{
|
||||
Console.WriteLine("LanguageSongList is null or empty.");
|
||||
return;
|
||||
}
|
||||
public void DisplaySongs(int page)
|
||||
{
|
||||
// 檢查 LanguageSongList 是否為空,避免發生錯誤
|
||||
if (LanguageSongList == null || LanguageSongList.Count == 0)
|
||||
{
|
||||
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;
|
||||
int startIndex = (page - 1) * songsPerPage;
|
||||
int endIndex = Math.Min(startIndex + songsPerPage, LanguageSongList.Count);
|
||||
// 每列顯示 5 首歌
|
||||
int songsPerColumn = 5;
|
||||
|
||||
// 計算當前頁面的起始與結束索引
|
||||
int startIndex = (page - 1) * songsPerPage;
|
||||
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 categoryText = OverlayForm.CurrentCategory switch
|
||||
{
|
||||
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);
|
||||
// 根據當前分類選擇標題文字
|
||||
string categoryText = OverlayForm.CurrentCategory switch
|
||||
{
|
||||
OverlayForm.Category.NewSongs => "新歌",
|
||||
OverlayForm.Category.HotSongs => "熱門",
|
||||
_ => ""
|
||||
};
|
||||
|
||||
int startY = 250;
|
||||
int leftColumnX = 100;
|
||||
int rightColumnX = this.Width / 2 + 100;
|
||||
// 設定標題格式,包含語言、分類與當前頁碼
|
||||
string headerText = $"{currentLanguage} - {categoryText} ({page} / {totalPages})";
|
||||
|
||||
// 設定標題的字體樣式
|
||||
Font headerFont = new Font("Microsoft JhengHei", 60, FontStyle.Bold);
|
||||
|
||||
// 生成標題圖片
|
||||
Bitmap headerBitmap = GenerateTextImage(headerText, headerFont, Color.White, Color.Transparent);
|
||||
|
||||
// 顯示標題圖片,垂直置於 150px 處
|
||||
AddCenteredPicture(headerBitmap, 150);
|
||||
|
||||
// 計算當前頁面最大歌名和歌手文字長度
|
||||
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;
|
||||
// 設定歌名顯示區域的起始 Y 位置
|
||||
int startY = 250;
|
||||
|
||||
// 左列與右列的 X 位置
|
||||
int leftColumnX = 100;
|
||||
int rightColumnX = this.Width / 2 + 100;
|
||||
|
||||
maxSongLength = Math.Max(maxSongLength, songText.Length);
|
||||
maxArtistLength = Math.Max(maxArtistLength, artistText.Length);
|
||||
}
|
||||
// 計算當前頁面最大歌名和歌手文字長度,決定適合的字體大小
|
||||
int maxSongLength = 0;
|
||||
int maxArtistLength = 0;
|
||||
|
||||
int songFontSize = maxSongLength > 20 ? 35 : 45;
|
||||
int artistFontSize = maxArtistLength > 20 ? 30 : 35;
|
||||
int verticalSpacing = songFontSize == 30 ? 25 : 10;
|
||||
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 rowHeight = 0;
|
||||
maxSongLength = Math.Max(maxSongLength, songText.Length);
|
||||
maxArtistLength = Math.Max(maxArtistLength, artistText.Length);
|
||||
}
|
||||
|
||||
// 計算行高
|
||||
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 songFontSize = maxSongLength > 20 ? 35 : 45;
|
||||
int artistFontSize = maxArtistLength > 20 ? 30 : 35;
|
||||
|
||||
// 設定歌曲行間距
|
||||
int verticalSpacing = songFontSize == 30 ? 25 : 10;
|
||||
|
||||
Font songFont = new Font("Microsoft JhengHei", songFontSize, FontStyle.Bold);
|
||||
Font artistFont = new Font("Microsoft JhengHei", artistFontSize, FontStyle.Bold);
|
||||
// 設定統一的行高
|
||||
int rowHeight = 0;
|
||||
|
||||
Bitmap songBitmap = GenerateTextImage(songText, songFont, Color.White, Color.Transparent);
|
||||
Bitmap artistBitmap = GenerateTextImage(artistText, artistFont, Color.White, Color.Transparent);
|
||||
// 計算行高
|
||||
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;
|
||||
|
||||
rowHeight = Math.Max(rowHeight, Math.Max(songBitmap.Height, artistBitmap.Height));
|
||||
}
|
||||
Font songFont = new Font("Microsoft JhengHei", songFontSize, FontStyle.Bold);
|
||||
Font artistFont = new Font("Microsoft JhengHei", artistFontSize, FontStyle.Bold);
|
||||
|
||||
for (int i = startIndex; i < endIndex; i++)
|
||||
{
|
||||
int songNumber = i - startIndex + 1;
|
||||
Bitmap songBitmap = GenerateTextImage(songText, songFont, Color.White, Color.Transparent);
|
||||
Bitmap artistBitmap = GenerateTextImage(artistText, artistFont, Color.White, Color.Transparent);
|
||||
|
||||
string songText = $"{songNumber}. {LanguageSongList[i].Song}";
|
||||
string artistText = !string.IsNullOrWhiteSpace(LanguageSongList[i].ArtistB)
|
||||
? $"{LanguageSongList[i].ArtistA} - {LanguageSongList[i].ArtistB}"
|
||||
: LanguageSongList[i].ArtistA;
|
||||
rowHeight = Math.Max(rowHeight, Math.Max(songBitmap.Height, artistBitmap.Height));
|
||||
}
|
||||
|
||||
Font songFont = new Font("Microsoft JhengHei", songFontSize, FontStyle.Bold);
|
||||
Font artistFont = new Font("Microsoft JhengHei", artistFontSize, FontStyle.Bold);
|
||||
// 依據計算出的行高,逐行顯示歌曲與歌手名稱
|
||||
for (int i = startIndex; i < endIndex; i++)
|
||||
{
|
||||
int songNumber = i - startIndex + 1;
|
||||
|
||||
Bitmap songBitmap = GenerateTextImage(songText, songFont, Color.White, Color.Transparent);
|
||||
Bitmap artistBitmap = GenerateTextImage(artistText, artistFont, Color.White, Color.Transparent);
|
||||
string songText = $"{songNumber}. {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;
|
||||
int y = startY + ((i - startIndex) % songsPerColumn) * (rowHeight + verticalSpacing);
|
||||
Font songFont = new Font("Microsoft JhengHei", songFontSize, FontStyle.Bold);
|
||||
Font artistFont = new Font("Microsoft JhengHei", artistFontSize, FontStyle.Bold);
|
||||
|
||||
AddPicture(songBitmap, x, y);
|
||||
AddPicture(artistBitmap, x + songBitmap.Width + 20, y);
|
||||
}
|
||||
}
|
||||
Bitmap songBitmap = GenerateTextImage(songText, songFont, Color.White, Color.Transparent);
|
||||
Bitmap artistBitmap = GenerateTextImage(artistText, artistFont, Color.White, Color.Transparent);
|
||||
|
||||
public void DisplaySongsWithArrows(int page, int highlightIndex)
|
||||
{
|
||||
if (LanguageSongList == null || LanguageSongList.Count == 0)
|
||||
{
|
||||
Console.WriteLine("Error: LanguageSongList is null or empty.");
|
||||
return;
|
||||
}
|
||||
// 根據索引決定左側或右側顯示
|
||||
int x = (i - startIndex) < songsPerColumn ? leftColumnX : rightColumnX;
|
||||
|
||||
this.Controls.OfType<PictureBox>().ToList().ForEach(p => this.Controls.Remove(p));
|
||||
// 計算 Y 位置
|
||||
int y = startY + ((i - startIndex) % songsPerColumn) * (rowHeight + verticalSpacing);
|
||||
|
||||
int songsPerColumn = 5;
|
||||
int startIndex = (page - 1) * songsPerPage;
|
||||
int endIndex = Math.Min(startIndex + songsPerPage, LanguageSongList.Count);
|
||||
// 顯示歌曲名稱圖片
|
||||
AddPicture(songBitmap, x, y);
|
||||
|
||||
// 顯示歌手名稱圖片(稍微右移)
|
||||
AddPicture(artistBitmap, x + songBitmap.Width + 20, y);
|
||||
}
|
||||
}
|
||||
|
||||
int totalPages = (int)Math.Ceiling((double)LanguageSongList.Count / songsPerPage);
|
||||
|
||||
string categoryText = OverlayForm.CurrentCategory switch
|
||||
{
|
||||
OverlayForm.Category.NewSongs => "新歌",
|
||||
OverlayForm.Category.HotSongs => "熱門",
|
||||
_ => ""
|
||||
};
|
||||
public void DisplaySongsWithArrows(int page, int highlightIndex)
|
||||
{
|
||||
// 檢查 LanguageSongList 是否為空,避免發生錯誤
|
||||
if (LanguageSongList == null || LanguageSongList.Count == 0)
|
||||
{
|
||||
Console.WriteLine("Error: LanguageSongList is null or empty.");
|
||||
return;
|
||||
}
|
||||
|
||||
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);
|
||||
// 清除介面上所有 PictureBox 控件,避免重複顯示舊的內容
|
||||
this.Controls.OfType<PictureBox>().ToList().ForEach(p => this.Controls.Remove(p));
|
||||
|
||||
int startY = 250;
|
||||
int leftColumnX = 100;
|
||||
int rightColumnX = this.Width / 2 + 100;
|
||||
// 每列顯示 5 首歌
|
||||
int songsPerColumn = 5;
|
||||
// 計算當前頁面的起始與結束索引
|
||||
int startIndex = (page - 1) * songsPerPage;
|
||||
int endIndex = Math.Min(startIndex + songsPerPage, LanguageSongList.Count);
|
||||
|
||||
// 找到当前页面中最长的 songText 和 artistText 长度
|
||||
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 totalPages = (int)Math.Ceiling((double)LanguageSongList.Count / songsPerPage);
|
||||
|
||||
maxSongLength = Math.Max(maxSongLength, songText.Length);
|
||||
maxArtistLength = Math.Max(maxArtistLength, artistText.Length);
|
||||
}
|
||||
// 根據當前分類選擇標題文字
|
||||
string categoryText = OverlayForm.CurrentCategory switch
|
||||
{
|
||||
OverlayForm.Category.NewSongs => "新歌",
|
||||
OverlayForm.Category.HotSongs => "熱門",
|
||||
_ => ""
|
||||
};
|
||||
|
||||
// 动态调整字体大小
|
||||
int songFontSize = maxSongLength > 20 ? 35 : 45;
|
||||
int artistFontSize = maxArtistLength > 20 ? 30 : 35;
|
||||
int verticalSpacing = songFontSize == 30 ? 25 : 10;
|
||||
// 設定標題格式,包含語言、分類與當前頁碼
|
||||
string headerText = $"{currentLanguage} - {categoryText} ({page} / {totalPages})";
|
||||
// 設定標題的字體樣式
|
||||
Font headerFont = new Font("Microsoft JhengHei", 60, FontStyle.Bold);
|
||||
// 生成標題圖片
|
||||
Bitmap headerBitmap = GenerateTextImage(headerText, headerFont, Color.White, Color.Transparent);
|
||||
// 顯示標題圖片,垂直置於 150px 處
|
||||
AddCenteredPicture(headerBitmap, 150);
|
||||
|
||||
// 统一行高計算
|
||||
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;
|
||||
// 設定歌名顯示區域的起始 Y 位置
|
||||
int startY = 250;
|
||||
// 左列與右列的 X 位置
|
||||
int leftColumnX = 100;
|
||||
int rightColumnX = this.Width / 2 + 100;
|
||||
|
||||
Font tempSongFont = new Font("Microsoft JhengHei", songFontSize, FontStyle.Bold);
|
||||
Font tempArtistFont = new Font("Microsoft JhengHei", artistFontSize, FontStyle.Bold);
|
||||
// 找到當前頁面中最長的 songText 和 artistText 長度
|
||||
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;
|
||||
|
||||
Bitmap tempSongBitmap = GenerateTextImage(songText, tempSongFont, Color.White, Color.Transparent);
|
||||
Bitmap tempArtistBitmap = GenerateTextImage(artistText, tempArtistFont, Color.White, Color.Transparent);
|
||||
maxSongLength = Math.Max(maxSongLength, songText.Length);
|
||||
maxArtistLength = Math.Max(maxArtistLength, artistText.Length);
|
||||
}
|
||||
|
||||
rowHeight = Math.Max(rowHeight, Math.Max(tempSongBitmap.Height, tempArtistBitmap.Height));
|
||||
}
|
||||
// 動態調整字體大小
|
||||
int songFontSize = maxSongLength > 20 ? 35 : 45;
|
||||
int artistFontSize = maxArtistLength > 20 ? 30 : 35;
|
||||
int verticalSpacing = songFontSize == 30 ? 25 : 10;
|
||||
|
||||
for (int i = startIndex; i < endIndex; i++)
|
||||
{
|
||||
int songNumber = i - startIndex + 1;
|
||||
// 統一行高計算
|
||||
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;
|
||||
|
||||
string songText = $"{songNumber}. {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);
|
||||
|
||||
// 设置颜色,选中的索引显示为亮绿色
|
||||
Color songColor = (i == highlightIndex) ? Color.LimeGreen : Color.White;
|
||||
Color artistColor = (i == highlightIndex) ? Color.LimeGreen : Color.White;
|
||||
Bitmap tempSongBitmap = GenerateTextImage(songText, tempSongFont, Color.White, Color.Transparent);
|
||||
Bitmap tempArtistBitmap = GenerateTextImage(artistText, tempArtistFont, Color.White, Color.Transparent);
|
||||
|
||||
Font songFont = new Font("Microsoft JhengHei", songFontSize, FontStyle.Bold);
|
||||
Bitmap songBitmap = GenerateTextImage(songText, songFont, songColor, Color.Transparent);
|
||||
rowHeight = Math.Max(rowHeight, Math.Max(tempSongBitmap.Height, tempArtistBitmap.Height));
|
||||
}
|
||||
|
||||
Font artistFont = new Font("Microsoft JhengHei", artistFontSize, FontStyle.Bold);
|
||||
Bitmap artistBitmap = GenerateTextImage(artistText, artistFont, artistColor, Color.Transparent);
|
||||
// 依據計算出的行高,逐行顯示歌曲與歌手名稱
|
||||
for (int i = startIndex; i < endIndex; i++)
|
||||
{
|
||||
int songNumber = i - startIndex + 1;
|
||||
|
||||
int x = (i - startIndex) < songsPerColumn ? leftColumnX : rightColumnX;
|
||||
int y = startY + ((i - startIndex) % songsPerColumn) * (rowHeight + verticalSpacing);
|
||||
string songText = $"{songNumber}. {LanguageSongList[i].Song}";
|
||||
string artistText = !string.IsNullOrWhiteSpace(LanguageSongList[i].ArtistB)
|
||||
? $"{LanguageSongList[i].ArtistA} - {LanguageSongList[i].ArtistB}"
|
||||
: LanguageSongList[i].ArtistA;
|
||||
|
||||
AddPicture(songBitmap, x, y);
|
||||
AddPicture(artistBitmap, x + songBitmap.Width + 20, y);
|
||||
}
|
||||
}
|
||||
// 設定顏色,選中的索引顯示為亮綠色
|
||||
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)
|
||||
{
|
||||
// try
|
||||
// {
|
||||
// if (LanguageSongList == null || LanguageSongList.Count == 0)
|
||||
// {
|
||||
// Console.WriteLine("Error: LanguageSongList is null or empty.");
|
||||
// return;
|
||||
// }
|
||||
public void DisplayActionWithSong(int page, int songIndex, string actionType)
|
||||
{
|
||||
// try
|
||||
// {
|
||||
// if (LanguageSongList == null || LanguageSongList.Count == 0)
|
||||
// {
|
||||
// Console.WriteLine("Error: LanguageSongList is null or empty.");
|
||||
// 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 startIndex = (page - 1) * songsPerPage;
|
||||
// int endIndex = Math.Min(startIndex + songsPerPage, LanguageSongList.Count);
|
||||
// int songsPerColumn = 5;
|
||||
// int startIndex = (page - 1) * songsPerPage;
|
||||
// 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})";
|
||||
// Font headerFont = new Font("Microsoft JhengHei", 40, FontStyle.Bold);
|
||||
// Color headerColor = actionType == "點播" ? Color.LimeGreen : Color.Yellow;
|
||||
// Bitmap headerBitmap = GenerateTextImage(headerText, headerFont, headerColor, Color.Transparent);
|
||||
// AddCenteredPicture(headerBitmap, 150);
|
||||
// string headerText = $"{actionType}: {song.ArtistA} - {song.Song} ({page} / {totalPages})";
|
||||
// Font headerFont = new Font("Microsoft JhengHei", 40, FontStyle.Bold);
|
||||
// Color headerColor = actionType == "點播" ? Color.LimeGreen : Color.Yellow;
|
||||
// Bitmap headerBitmap = GenerateTextImage(headerText, headerFont, headerColor, Color.Transparent);
|
||||
// AddCenteredPicture(headerBitmap, 150);
|
||||
|
||||
// int startY = 250;
|
||||
// int verticalSpacing = 10;
|
||||
// int leftColumnX = 200;
|
||||
// int rightColumnX = this.Width / 2 + 150;
|
||||
// int startY = 250;
|
||||
// int verticalSpacing = 10;
|
||||
// int leftColumnX = 200;
|
||||
// int rightColumnX = this.Width / 2 + 150;
|
||||
|
||||
// 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;
|
||||
// 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;
|
||||
|
||||
// Font songFont = new Font("Microsoft JhengHei", 40, FontStyle.Bold);
|
||||
// Bitmap songBitmap = GenerateTextImage(songText, songFont, Color.White, Color.Transparent);
|
||||
// Font songFont = new Font("Microsoft JhengHei", 40, FontStyle.Bold);
|
||||
// Bitmap songBitmap = GenerateTextImage(songText, songFont, Color.White, Color.Transparent);
|
||||
|
||||
// Font artistFont = new Font("Microsoft JhengHei", 30, FontStyle.Bold);
|
||||
// Bitmap artistBitmap = GenerateTextImage(artistText, artistFont, Color.White, Color.Transparent);
|
||||
// Font artistFont = new Font("Microsoft JhengHei", 30, FontStyle.Bold);
|
||||
// Bitmap artistBitmap = GenerateTextImage(artistText, artistFont, Color.White, Color.Transparent);
|
||||
|
||||
// int x = (i - startIndex) < songsPerColumn ? leftColumnX : rightColumnX;
|
||||
// int y = startY + ((i - startIndex) % songsPerColumn) * (songBitmap.Height + verticalSpacing);
|
||||
// int x = (i - startIndex) < songsPerColumn ? leftColumnX : rightColumnX;
|
||||
// int y = startY + ((i - startIndex) % songsPerColumn) * (songBitmap.Height + verticalSpacing);
|
||||
|
||||
// AddPicture(songBitmap, x, y);
|
||||
// AddPicture(artistBitmap, x + songBitmap.Width + 20, y);
|
||||
// }
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// Console.WriteLine($"Error in DisplayActionWithSong: {ex.Message}");
|
||||
// Console.WriteLine(ex.StackTrace);
|
||||
// }
|
||||
}
|
||||
// AddPicture(songBitmap, x, y);
|
||||
// AddPicture(artistBitmap, x + songBitmap.Width + 20, y);
|
||||
// }
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// Console.WriteLine($"Error in DisplayActionWithSong: {ex.Message}");
|
||||
// Console.WriteLine(ex.StackTrace);
|
||||
// }
|
||||
}
|
||||
|
||||
public void NextPage()
|
||||
{
|
@ -4,7 +4,7 @@ using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using DBObj;
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
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)
|
||||
{
|
||||
button = new Button { Text = buttonText, Visible = false };
|
||||
button = new Button { Text = "", Visible = false };
|
||||
ResizeAndPositionButton(button, x, y, width, height);
|
||||
normalBackgroundOut = new Bitmap(normalBackground).Clone(cropArea, normalBackground.PixelFormat);
|
||||
activeBackgroundOut = new Bitmap(activeBackground).Clone(cropArea, activeBackground.PixelFormat);
|
||||
|
@ -4,7 +4,7 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using DBObj;
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
public partial class PrimaryForm
|
||||
@ -26,19 +26,19 @@ namespace DualScreenDemo
|
||||
|
||||
private void InitializeButtonsForFavoritePictureBox()
|
||||
{
|
||||
|
||||
// 我的最愛數字座標按鈕
|
||||
int[,] coords = new int[,]
|
||||
{
|
||||
{799, 508, 70, 65},
|
||||
{878, 508, 70, 65},
|
||||
{957, 508, 70, 65},
|
||||
{1036, 508, 70, 65},
|
||||
{1115, 508, 70, 65},
|
||||
{799, 580, 70, 65},
|
||||
{878, 580, 70, 65},
|
||||
{957, 580, 70, 65},
|
||||
{1036, 580, 70, 65},
|
||||
{1115, 580, 70, 65}
|
||||
{794, 508, 70, 65},
|
||||
{873, 508, 70, 65},
|
||||
{952, 508, 70, 65},
|
||||
{1031, 508, 70, 65},
|
||||
{1110, 508, 70, 65},
|
||||
{794, 580, 70, 65},
|
||||
{873, 580, 70, 65},
|
||||
{952, 580, 70, 65},
|
||||
{1031, 580, 70, 65},
|
||||
{1110, 580, 70, 65}
|
||||
};
|
||||
|
||||
int screenW = Screen.PrimaryScreen.Bounds.Width;
|
||||
@ -58,7 +58,7 @@ namespace DualScreenDemo
|
||||
|
||||
|
||||
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].BackgroundImageLayout = ImageLayout.Stretch;
|
||||
favoriteNumberButton[i].FlatStyle = FlatStyle.Flat;
|
||||
@ -89,8 +89,8 @@ namespace DualScreenDemo
|
||||
{
|
||||
Name = "enterFavoriteButton"
|
||||
};
|
||||
ResizeAndPositionButton(enterFavoriteButton, 842, 652, 70, 65);
|
||||
enterFavoriteButton.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-12.jpg"));
|
||||
ResizeAndPositionButton(enterFavoriteButton, 837, 652, 70, 65);
|
||||
enterFavoriteButton.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-12.png"));
|
||||
enterFavoriteButton.BackgroundImageLayout = ImageLayout.Stretch;
|
||||
enterFavoriteButton.FlatStyle = FlatStyle.Flat;
|
||||
enterFavoriteButton.FlatAppearance.BorderSize = 0;
|
||||
@ -104,8 +104,8 @@ namespace DualScreenDemo
|
||||
{
|
||||
Name = "newFavoriteButton"
|
||||
};
|
||||
ResizeAndPositionButton(newFavoriteButton, 921, 652, 70, 65);
|
||||
newFavoriteButton.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-13.jpg"));
|
||||
ResizeAndPositionButton(newFavoriteButton, 916, 652, 70, 65);
|
||||
newFavoriteButton.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-13.png"));
|
||||
newFavoriteButton.BackgroundImageLayout = ImageLayout.Stretch;
|
||||
newFavoriteButton.FlatStyle = FlatStyle.Flat;
|
||||
newFavoriteButton.FlatAppearance.BorderSize = 0;
|
||||
@ -119,8 +119,8 @@ namespace DualScreenDemo
|
||||
{
|
||||
Name = "refillFavoriteButton"
|
||||
};
|
||||
ResizeAndPositionButton(refillFavoriteButton, 999, 652, 70, 65);
|
||||
refillFavoriteButton.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-14.jpg"));
|
||||
ResizeAndPositionButton(refillFavoriteButton, 994, 652, 70, 65);
|
||||
refillFavoriteButton.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-14.png"));
|
||||
refillFavoriteButton.BackgroundImageLayout = ImageLayout.Stretch;
|
||||
refillFavoriteButton.FlatStyle = FlatStyle.Flat;
|
||||
refillFavoriteButton.FlatAppearance.BorderSize = 0;
|
||||
@ -134,8 +134,8 @@ namespace DualScreenDemo
|
||||
{
|
||||
Name = "closeFavoriteButton"
|
||||
};
|
||||
ResizeAndPositionButton(closeFavoriteButton, 1078, 652, 70, 65);
|
||||
closeFavoriteButton.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-15.jpg"));
|
||||
ResizeAndPositionButton(closeFavoriteButton, 1073, 652, 70, 65);
|
||||
closeFavoriteButton.BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛-15.png"));
|
||||
closeFavoriteButton.BackgroundImageLayout = ImageLayout.Stretch;
|
||||
closeFavoriteButton.FlatStyle = FlatStyle.Flat;
|
||||
closeFavoriteButton.FlatAppearance.BorderSize = 0;
|
||||
@ -179,11 +179,19 @@ namespace DualScreenDemo
|
||||
{
|
||||
if (!string.IsNullOrEmpty(mobileNumber))
|
||||
{
|
||||
using (Font font = new Font("Arial", 24))
|
||||
|
||||
using (Brush brush = new SolidBrush(Color.Black))
|
||||
{
|
||||
int x = 16;
|
||||
int y = 68;
|
||||
int screenW = Screen.PrimaryScreen.Bounds.Width;
|
||||
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)
|
||||
{
|
||||
@ -312,7 +320,7 @@ namespace DualScreenDemo
|
||||
if (!FavoritePictureBox.Visible)
|
||||
{
|
||||
|
||||
ShowImageOnFavoritePictureBox(Path.Combine(Application.StartupPath, @"themes\superstar\其他介面\其他_我的最愛.jpg"));
|
||||
ShowImageOnFavoritePictureBox(Path.Combine(Application.StartupPath, @"themes\superstar\我的最愛\我的最愛_工作區域.png"));
|
||||
SetFavoritePictureBoxAndButtonsVisibility(true);
|
||||
}
|
||||
else
|
||||
@ -335,24 +343,24 @@ namespace DualScreenDemo
|
||||
private void ShowImageOnFavoritePictureBox(string imagePath)
|
||||
{
|
||||
|
||||
Bitmap originalImage = new Bitmap(imagePath);
|
||||
if (File.Exists(imagePath))
|
||||
{
|
||||
// 直接載入完整圖
|
||||
Bitmap image = new Bitmap(imagePath);
|
||||
|
||||
|
||||
Console.WriteLine(String.Format("Original Image Size: {0}x{1}", originalImage.Width, originalImage.Height));
|
||||
// 顯示在 PictureBox 上
|
||||
FavoritePictureBox.Image = image;
|
||||
|
||||
|
||||
Rectangle cropArea = new Rectangle(784, 393, 555, 442);
|
||||
// 設定 PictureBox 的大小與位置(依你的需要調整)
|
||||
ResizeAndPositionPictureBox(FavoritePictureBox, 773, 380, image.Width, image.Height);
|
||||
|
||||
|
||||
Bitmap croppedImage = CropImage(originalImage, cropArea);
|
||||
FavoritePictureBox.Visible = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("圖片檔案不存在:" + imagePath);
|
||||
}
|
||||
|
||||
|
||||
FavoritePictureBox.Image = croppedImage;
|
||||
|
||||
|
||||
ResizeAndPositionPictureBox(FavoritePictureBox, cropArea.X, cropArea.Y, 416, 323);
|
||||
|
||||
FavoritePictureBox.Visible = true;
|
||||
}
|
||||
|
||||
private void ToggleFavoritePictureBoxButtonsVisibility()
|
||||
|
@ -100,9 +100,10 @@ namespace DualScreenDemo
|
||||
|
||||
return images;
|
||||
}
|
||||
|
||||
// 優惠活動 按鈕事件
|
||||
private void promotionsButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
promotionsAndMenuPanel.currentPageIndex=0;
|
||||
newSongAlertButton.BackgroundImage = newSongAlertNormalBackground;
|
||||
hotPlayButton.BackgroundImage = hotPlayNormalBackground;
|
||||
singerSearchButton.BackgroundImage = singerSearchNormalBackground;
|
||||
@ -135,7 +136,7 @@ namespace DualScreenDemo
|
||||
pictureBoxQRCode.Visible = false;
|
||||
closeQRCodeButton.Visible = false;
|
||||
}
|
||||
|
||||
|
||||
SetPictureBoxToggleLightAndButtonsVisibility(false);
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,7 @@ namespace DualScreenDemo
|
||||
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))
|
||||
{
|
||||
Console.WriteLine("Base image not found: " + imagePath);
|
||||
@ -81,7 +81,7 @@ namespace DualScreenDemo
|
||||
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);
|
||||
|
@ -25,6 +25,28 @@ namespace DualScreenDemo
|
||||
{
|
||||
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()
|
||||
{
|
||||
@ -33,9 +55,9 @@ namespace DualScreenDemo
|
||||
{
|
||||
Name = "constructionButton",
|
||||
};
|
||||
ConfigureButton(constructionButton, 876, 494, 148, 64,
|
||||
resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects,
|
||||
ConstructionButton_Click);
|
||||
string path = Path.Combine(Application.StartupPath, @"themes\superstar\場景音效\場景音效_工地.png");
|
||||
ConfigureImageButton(constructionButton, 1183, 634, 148, 64,
|
||||
path, ConstructionButton_Click);
|
||||
this.Controls.Add(constructionButton);
|
||||
|
||||
|
||||
@ -43,9 +65,9 @@ namespace DualScreenDemo
|
||||
{
|
||||
Name = "marketButton",
|
||||
};
|
||||
ConfigureButton(marketButton, 1037, 495, 148, 63,
|
||||
resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects,
|
||||
MarketButton_Click);
|
||||
path = Path.Combine(Application.StartupPath, @"themes\superstar\場景音效\場景音效_市場.png");
|
||||
ConfigureImageButton(marketButton, 1394, 634, 148, 63,
|
||||
path, MarketButton_Click);
|
||||
this.Controls.Add(marketButton);
|
||||
|
||||
|
||||
@ -53,9 +75,9 @@ namespace DualScreenDemo
|
||||
{
|
||||
Name = "drivingButton",
|
||||
};
|
||||
ConfigureButton(drivingButton, 876, 570, 148, 63,
|
||||
resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects,
|
||||
DrivingButton_Click);
|
||||
path = Path.Combine(Application.StartupPath, @"themes\superstar\場景音效\場景音效_開車.png");
|
||||
ConfigureImageButton(drivingButton, 1183, 720, 148, 63,
|
||||
path, DrivingButton_Click);
|
||||
this.Controls.Add(drivingButton);
|
||||
|
||||
|
||||
@ -63,9 +85,9 @@ namespace DualScreenDemo
|
||||
{
|
||||
Name = "airportButton",
|
||||
};
|
||||
ConfigureButton(airportButton, 1037, 570, 148, 63,
|
||||
resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects,
|
||||
AirportButton_Click);
|
||||
path = Path.Combine(Application.StartupPath, @"themes\superstar\場景音效\場景音效_機場.png");
|
||||
ConfigureImageButton(airportButton, 1394, 720, 148, 63,
|
||||
path, AirportButton_Click);
|
||||
this.Controls.Add(airportButton);
|
||||
|
||||
|
||||
@ -73,9 +95,9 @@ namespace DualScreenDemo
|
||||
{
|
||||
Name = "officeButton",
|
||||
};
|
||||
ConfigureButton(officeButton, 876, 646, 148, 64,
|
||||
resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects,
|
||||
OfficeButton_Click);
|
||||
path = Path.Combine(Application.StartupPath, @"themes\superstar\場景音效\場景音效_辦公室.png");
|
||||
ConfigureImageButton(officeButton, 1183, 806, 148, 64,
|
||||
path, OfficeButton_Click);
|
||||
this.Controls.Add(officeButton);
|
||||
|
||||
|
||||
@ -83,10 +105,9 @@ namespace DualScreenDemo
|
||||
{
|
||||
Name = "closeButton",
|
||||
};
|
||||
|
||||
ConfigureButton(closeButton, 1036, 646, 150, 63,
|
||||
resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects, resizedNormalStateImageForSceneSoundEffects,
|
||||
CloseButton_Click);
|
||||
path = Path.Combine(Application.StartupPath, @"themes\superstar\場景音效\場景音效_關閉.png");
|
||||
ConfigureImageButton(closeButton, 1394, 806, 150, 63,
|
||||
path, CloseButton_Click);
|
||||
this.Controls.Add(closeButton);
|
||||
}
|
||||
|
||||
@ -100,7 +121,7 @@ namespace DualScreenDemo
|
||||
|
||||
if (!pictureBoxSceneSoundEffects.Visible)
|
||||
{
|
||||
ShowImageOnPictureBoxSceneSoundEffects(Path.Combine(Application.StartupPath, @"themes\superstar\555022.jpg"));
|
||||
ShowImageOnPictureBoxSceneSoundEffects(Path.Combine(Application.StartupPath, @"themes\superstar\場景音效\場景音效.png"));
|
||||
SetPictureBoxSceneSoundEffectsAndButtonsVisibility(true);
|
||||
}
|
||||
else
|
||||
@ -135,28 +156,30 @@ namespace DualScreenDemo
|
||||
|
||||
public void PlayApplauseSound()
|
||||
{
|
||||
mediaPlayer.URL = Path.Combine(Application.StartupPath, "zs.m4a");
|
||||
mediaPlayer.URL = Path.Combine(Application.StartupPath,"sounds" ,"zs.m4a");
|
||||
mediaPlayer.controls.play();
|
||||
}
|
||||
|
||||
// 按鈕位置需要更改,底圖需要更改
|
||||
private void ShowImageOnPictureBoxSceneSoundEffects(string imagePath)
|
||||
{
|
||||
|
||||
Bitmap originalImage = new Bitmap(imagePath);
|
||||
if (File.Exists(imagePath))
|
||||
{
|
||||
// 直接載入完整圖
|
||||
Bitmap image = new Bitmap(imagePath);
|
||||
|
||||
|
||||
Rectangle cropArea = new Rectangle(859, 427, 342, 295);
|
||||
// 顯示在 PictureBox 上
|
||||
pictureBoxSceneSoundEffects.Image = image;
|
||||
|
||||
|
||||
Bitmap croppedImage = CropImage(originalImage, cropArea);
|
||||
// 設定 PictureBox 的大小與位置(依你的需要調整)
|
||||
ResizeAndPositionPictureBox(pictureBoxSceneSoundEffects, 850, 450, image.Width , image.Height);
|
||||
|
||||
|
||||
pictureBoxSceneSoundEffects.Image = croppedImage;
|
||||
|
||||
|
||||
ResizeAndPositionPictureBox(pictureBoxSceneSoundEffects, cropArea.X, cropArea.Y, cropArea.Width, cropArea.Height);
|
||||
|
||||
pictureBoxSceneSoundEffects.Visible = true;
|
||||
pictureBoxSceneSoundEffects.Visible = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("圖片檔案不存在:" + imagePath);
|
||||
}
|
||||
}
|
||||
|
||||
private void TogglePictureBoxSceneSoundEffectsButtonsVisibility()
|
||||
|
@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
|
||||
using OverlayFormObj;
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
public partial class PrimaryForm : Form
|
||||
@ -49,11 +49,11 @@ namespace DualScreenDemo
|
||||
|
||||
|
||||
|
||||
|
||||
//同步畫面 服務鈴
|
||||
ConfigureButton(this.syncServiceBellButton, 1240, 17, 161, 161,
|
||||
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.IO;
|
||||
using System.Linq;
|
||||
|
||||
using DBObj;
|
||||
using OverlayFormObj;
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
public partial class PrimaryForm
|
||||
|
@ -36,296 +36,508 @@ namespace DualScreenDemo
|
||||
private FontStyle inputBoxFontStyle;
|
||||
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)
|
||||
{
|
||||
// 設定按鈕背景,將「注音搜尋」設為啟動狀態,其餘按鈕恢復為正常狀態
|
||||
zhuyinSearchButton.BackgroundImage = zhuyinSearchActiveBackground;
|
||||
englishSearchButton.BackgroundImage = englishSearchNormalBackground;
|
||||
pinyinSearchButton.BackgroundImage = pinyinSearchNormalBackground;
|
||||
wordCountSearchButton.BackgroundImage = wordCountSearchNormalBackground;
|
||||
handWritingSearchButton.BackgroundImage = handWritingSearchNormalBackground;
|
||||
|
||||
|
||||
// 載入設定檔,取得圖片路徑資訊
|
||||
var configData = LoadConfigData();
|
||||
|
||||
// 取得「注音歌手圖片」的完整路徑
|
||||
string imagePath = Path.Combine(Application.StartupPath, configData["ImagePaths"]["ZhuYinSingers"]);
|
||||
|
||||
// 在 PictureBox 中顯示對應的「注音歌手」圖片
|
||||
ShowImageOnPictureBoxZhuYinSingers(Path.Combine(Application.StartupPath, imagePath));
|
||||
|
||||
// 設定不同搜尋模式的 UI 控件可見性
|
||||
SetEnglishSingersAndButtonsVisibility(false); // 隱藏英文字母搜尋相關控件
|
||||
SetPinYinSingersAndButtonsVisibility(false); // 隱藏拼音搜尋相關控件
|
||||
SetHandWritingForSingersAndButtonsVisibility(false); // 隱藏手寫搜尋相關控件
|
||||
SetWordCountSingersAndButtonsVisibility(false); // 隱藏字數搜尋相關控件
|
||||
|
||||
SetZhuYinSingersAndButtonsVisibility(true); // 顯示注音搜尋相關控件
|
||||
//SetPictureBoxArtistSearchAndButtonsVisibility(false); // 隱藏其他搜尋模式的圖片框
|
||||
|
||||
|
||||
|
||||
SetEnglishSingersAndButtonsVisibility(false);
|
||||
SetPinYinSingersAndButtonsVisibility(false);
|
||||
SetHandWritingForSingersAndButtonsVisibility(false);
|
||||
SetZhuYinSingersAndButtonsVisibility(true);
|
||||
SetPictureBoxArtistSearchAndButtonsVisibility(false);
|
||||
ResetinputBox(); // 重置輸入框
|
||||
|
||||
// 顯示「注音歌手搜尋」的圖片框
|
||||
pictureBoxZhuYinSingers.Visible = true;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// <para>從 config.ini 設定檔中載入注音符號(Phonetic Symbols)。</para>
|
||||
/// <para>讀取 ini 檔的 [PhoneticSymbols] 區塊,並將「Symbols」欄位的值解析為陣列。</para>
|
||||
/// </summary>
|
||||
private void LoadPhoneticSymbolsFromConfig()
|
||||
{
|
||||
// 建立 INI 檔案解析器
|
||||
var parser = new FileIniDataParser();
|
||||
|
||||
// 設定檔路徑
|
||||
string iniFilePath = "config.ini";
|
||||
|
||||
|
||||
IniData data;
|
||||
|
||||
// 以 UTF-8 編碼開啟並讀取 INI 檔案
|
||||
using (var reader = new StreamReader(iniFilePath, Encoding.UTF8))
|
||||
{
|
||||
// 解析 INI 檔內容
|
||||
data = parser.ReadData(reader);
|
||||
}
|
||||
|
||||
// 取得 [PhoneticSymbols] 區塊中的 "Symbols" 欄位內容
|
||||
string symbols = data["PhoneticSymbols"]["Symbols"];
|
||||
|
||||
// 將符號字串以逗號分隔,轉換為字串陣列
|
||||
phoneticSymbols = symbols.Split(',');
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 從設定檔 (config.ini) 載入 INI 設定數據。
|
||||
/// </summary>
|
||||
/// <returns>回傳解析後的 INI 設定數據 (IniData)。</returns>
|
||||
private IniData LoadConfigData()
|
||||
{
|
||||
var parser = new FileIniDataParser();
|
||||
string iniFilePath = "config.ini";
|
||||
|
||||
// 使用 UTF-8 讀取 INI 檔案並解析內容
|
||||
using (var reader = new StreamReader(iniFilePath, Encoding.UTF8))
|
||||
{
|
||||
return parser.ReadData(reader);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 從 INI 設定數據中讀取注音符號 (Phonetic Symbols)。
|
||||
/// </summary>
|
||||
/// <param name="data">已解析的 INI 設定數據。</param>
|
||||
/// <returns>回傳包含注音符號的字串陣列。</returns>
|
||||
private string[] LoadPhoneticSymbols(IniData data)
|
||||
{
|
||||
// 從 INI 檔案的 [PhoneticSymbols] 區塊取得 Symbols 欄位值
|
||||
string symbols = data["PhoneticSymbols"]["Symbols"];
|
||||
|
||||
// 以逗號分隔字串並轉換為字串陣列
|
||||
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)
|
||||
{
|
||||
var buttonList = new List<(int X, int Y, int Width, int Height)>();
|
||||
|
||||
// 迴圈讀取每個按鈕的座標設定
|
||||
for (int i = 1; i <= buttonCount; i++)
|
||||
{
|
||||
// 取得按鈕座標的字串 (格式: X,Y,Width,Height)
|
||||
var coordString = data[section][$"button{i}"];
|
||||
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();
|
||||
}
|
||||
|
||||
/// <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)
|
||||
{
|
||||
var buttonImages = new Dictionary<string, (string normal, string mouseDown, string mouseOver)>();
|
||||
|
||||
// 迴圈讀取每個按鈕的圖片設定
|
||||
for (int i = 0; i < 35; i++)
|
||||
{
|
||||
// 讀取按鈕的三種圖片狀態:正常、點擊、滑鼠移過
|
||||
buttonImages[$"button{i}"] = (
|
||||
data[section][$"button{i}_normal"],
|
||||
data[section][$"button{i}_mouseDown"],
|
||||
data[section][$"button{i}_mouseOver"]
|
||||
data[section][$"button{i}_normal"], // 正常狀態圖片路徑
|
||||
data[section][$"button{i}_mouseDown"], // 點擊狀態圖片路徑
|
||||
data[section][$"button{i}_mouseOver"] // 滑鼠移過狀態圖片路徑
|
||||
);
|
||||
}
|
||||
|
||||
// 回傳包含所有按鈕圖片路徑資料的字典
|
||||
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)
|
||||
{
|
||||
// 取得按鈕座標的字串 (格式: X,Y,Width,Height)
|
||||
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]));
|
||||
}
|
||||
|
||||
/// <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)
|
||||
{
|
||||
// 讀取按鈕三種狀態的圖片路徑
|
||||
return (
|
||||
data[section]["normal"],
|
||||
data[section]["mouseDown"],
|
||||
data[section]["mouseOver"]
|
||||
data[section]["normal"], // 正常狀態圖片路徑
|
||||
data[section]["mouseDown"], // 點擊狀態圖片路徑
|
||||
data[section]["mouseOver"] // 滑鼠移過狀態圖片路徑
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 初始化並設置語音按鈕的相關資料,包括符號、座標與圖片等。
|
||||
/// </summary>
|
||||
private void InitializePhoneticButtons()
|
||||
{
|
||||
// 載入配置資料
|
||||
var data = LoadConfigData();
|
||||
|
||||
// 載入語音符號(如拼音、注音符號等)
|
||||
phoneticSymbols = LoadPhoneticSymbols(data);
|
||||
|
||||
// 載入按鈕座標資料
|
||||
phoneticButtonCoords = LoadButtonCoordinates(data, "PhoneticButtonCoordinates", 35);
|
||||
|
||||
// 載入按鈕圖片資料
|
||||
phoneticButtonImages = LoadButtonImages(data, "PhoneticButtonImages", 35);
|
||||
|
||||
// 初始化語音按鈕陣列,總共有 35 個按鈕
|
||||
phoneticButtonsForSingers = new Button[35];
|
||||
|
||||
// 設置每個語音按鈕
|
||||
for (int i = 0; i < 35; i++)
|
||||
{
|
||||
// 根據按鈕索引讀取其圖片資料
|
||||
var buttonImages = phoneticButtonImages[$"button{i}"];
|
||||
|
||||
// 創建並初始化語音按鈕,設定其背景圖片
|
||||
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)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
|
||||
// 創建語音按鈕並設置其屬性
|
||||
phoneticButtonsForSingers[index] = new Button
|
||||
{
|
||||
Name = $"phoneticButton_{phoneticSymbols[index]}",
|
||||
BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath)),
|
||||
BackgroundImageLayout = ImageLayout.Stretch,
|
||||
FlatStyle = FlatStyle.Flat,
|
||||
FlatAppearance = { BorderSize = 0 }
|
||||
Name = $"phoneticButton_{phoneticSymbols[index]}", // 按鈕名稱設為語音符號名稱
|
||||
BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath)), // 設定背景圖片
|
||||
BackgroundImageLayout = ImageLayout.Stretch, // 設定圖片拉伸樣式
|
||||
FlatStyle = FlatStyle.Flat, // 設定為平面風格
|
||||
FlatAppearance = { BorderSize = 0 } // 設定無邊框
|
||||
};
|
||||
|
||||
// 調整按鈕大小並設置位置
|
||||
ResizeAndPositionButton(phoneticButtonsForSingers[index], phoneticButtonCoords[index].X, phoneticButtonCoords[index].Y,
|
||||
phoneticButtonCoords[index].Width, phoneticButtonCoords[index].Height);
|
||||
|
||||
// 從檔案中讀取正常、點擊和滑鼠懸停狀態的圖片
|
||||
Image normalImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath));
|
||||
Image mouseDownImage = Image.FromFile(Path.Combine(Application.StartupPath, mouseDownImagePath));
|
||||
Image mouseOverImage = Image.FromFile(Path.Combine(Application.StartupPath, mouseOverImagePath));
|
||||
|
||||
// 設置滑鼠事件:點擊、進入、離開等,改變按鈕的背景圖片
|
||||
phoneticButtonsForSingers[index].MouseDown += (s, e) => phoneticButtonsForSingers[index].BackgroundImage = mouseDownImage;
|
||||
phoneticButtonsForSingers[index].MouseUp += (s, e) => phoneticButtonsForSingers[index].BackgroundImage = normalImage;
|
||||
phoneticButtonsForSingers[index].MouseEnter += (s, e) => phoneticButtonsForSingers[index].BackgroundImage = mouseOverImage;
|
||||
phoneticButtonsForSingers[index].MouseLeave += (s, e) => phoneticButtonsForSingers[index].BackgroundImage = normalImage;
|
||||
|
||||
// 設置點擊事件處理方法
|
||||
phoneticButtonsForSingers[index].Click += PhoneticButton_Click;
|
||||
|
||||
// 設置按鈕的 Tag 屬性為對應的語音符號
|
||||
phoneticButtonsForSingers[index].Tag = phoneticSymbols[index];
|
||||
|
||||
// 將按鈕添加到表單的控制項集合中
|
||||
this.Controls.Add(phoneticButtonsForSingers[index]);
|
||||
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 捕捉錯誤並輸出錯誤訊息
|
||||
Console.WriteLine($"Error creating button at index {index}: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 初始化所有與注音歌手相關的按鈕,包括語音符號按鈕、特殊按鈕及輸入框。
|
||||
/// </summary>
|
||||
private void InitializeButtonsForZhuYinSingers()
|
||||
{
|
||||
// 從配置檔案加載注音符號並初始化按鈕
|
||||
LoadPhoneticSymbolsFromConfig();
|
||||
|
||||
// 初始化所有語音按鈕
|
||||
InitializePhoneticButtons();
|
||||
|
||||
// 初始化注音歌手的特殊按鈕(例如音量、搜尋等)
|
||||
InitializeSpecialButtonsForZhuYinSingers();
|
||||
|
||||
// 初始化注音歌手的輸入框
|
||||
InitializeInputBoxZhuYinSingers();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 移除圖像周圍的白色邊框,將邊框的像素透明化。
|
||||
/// </summary>
|
||||
/// <param name="imagePath">待處理的圖像文件路徑。</param>
|
||||
/// <returns>處理後的圖像,其中白色邊框已被去除並替換為透明。</returns>
|
||||
private Image RemoveWhiteBorder(string imagePath)
|
||||
{
|
||||
// 創建一個 Bitmap 物件來加載圖像
|
||||
Bitmap bmp = new Bitmap(imagePath);
|
||||
|
||||
|
||||
// 定義圖像的矩形區域,這是我們將要操作的區域
|
||||
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
|
||||
|
||||
// 鎖定圖像的位圖數據,以便進行直接修改
|
||||
BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);
|
||||
|
||||
IntPtr ptr = bmpData.Scan0;
|
||||
int bytes = Math.Abs(bmpData.Stride) * bmp.Height;
|
||||
byte[] rgbValues = new byte[bytes];
|
||||
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
|
||||
IntPtr ptr = bmpData.Scan0; // 獲取位圖數據的起始位置
|
||||
int bytes = Math.Abs(bmpData.Stride) * bmp.Height; // 計算圖像的總字節數
|
||||
byte[] rgbValues = new byte[bytes]; // 用來存儲圖像的像素數據
|
||||
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes); // 從圖像數據中複製像素數據到 rgbValues 陣列
|
||||
|
||||
// 遍歷每個像素點,檢查是否為白色邊框
|
||||
for (int y = 0; y < bmp.Height; y++)
|
||||
{
|
||||
for (int x = 0; x < bmp.Width; x++)
|
||||
{
|
||||
int position = (y * bmpData.Stride) + (x * 4);
|
||||
byte b = rgbValues[position];
|
||||
byte g = rgbValues[position + 1];
|
||||
byte r = rgbValues[position + 2];
|
||||
byte a = rgbValues[position + 3];
|
||||
int position = (y * bmpData.Stride) + (x * 4); // 計算當前像素的位址
|
||||
byte b = rgbValues[position]; // 藍色分量
|
||||
byte g = rgbValues[position + 1]; // 綠色分量
|
||||
byte r = rgbValues[position + 2]; // 紅色分量
|
||||
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)
|
||||
{
|
||||
// 將白色像素的 RGB 設置為 255, 255, 255 且 alpha 設為 0 (透明)
|
||||
rgbValues[position] = 255;
|
||||
rgbValues[position + 1] = 255;
|
||||
rgbValues[position + 2] = 255;
|
||||
rgbValues[position + 3] = 0;
|
||||
rgbValues[position + 3] = 0; // 透明
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 將修改後的像素數據重新複製回位圖數據
|
||||
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
|
||||
|
||||
// 解鎖圖像數據
|
||||
bmp.UnlockBits(bmpData);
|
||||
|
||||
// 返回處理後的圖像
|
||||
return bmp;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 初始化與注音歌手相關的特殊按鈕,包括修改、清除和關閉按鈕。
|
||||
/// </summary>
|
||||
private void InitializeSpecialButtonsForZhuYinSingers()
|
||||
{
|
||||
|
||||
// 初始化修改按鈕
|
||||
InitializeModifyButtonZhuYinSingers();
|
||||
|
||||
|
||||
// 初始化清除按鈕
|
||||
InitializeClearButtonZhuYinSingers();
|
||||
|
||||
|
||||
// 初始化關閉按鈕
|
||||
InitializeCloseButtonZhuYinSingers();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 初始化「修改」按鈕,設定按鈕的坐標、圖片和點擊事件。
|
||||
/// </summary>
|
||||
private void InitializeModifyButtonZhuYinSingers()
|
||||
{
|
||||
// 加載配置數據
|
||||
var data = LoadConfigData();
|
||||
|
||||
// 讀取按鈕坐標
|
||||
modifyButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "modifyButtonZhuYinSingers");
|
||||
|
||||
// 加載按鈕圖片(正常、鼠標懸停、鼠標按下)
|
||||
var buttonImages = LoadButtonImages(data, "ModifyButtonImagesZhuYin");
|
||||
|
||||
// 創建「修改」按鈕,並設置坐標、圖片及點擊事件
|
||||
modifyButtonZhuYinSingers = CreateSpecialButton(
|
||||
"btnModifyZhuYinSingers",
|
||||
modifyButtonZhuYinCoords,
|
||||
buttonImages.normal,
|
||||
buttonImages.mouseOver,
|
||||
buttonImages.mouseDown,
|
||||
ModifyButtonZhuYinSingers_Click
|
||||
"btnModifyZhuYinSingers", // 按鈕名稱
|
||||
modifyButtonZhuYinCoords, // 按鈕坐標
|
||||
buttonImages.normal, // 正常狀態圖片
|
||||
buttonImages.mouseOver, // 鼠標懸停圖片
|
||||
buttonImages.mouseDown, // 鼠標按下圖片
|
||||
ModifyButtonZhuYinSingers_Click // 按鈕點擊事件
|
||||
);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 處理「修改」按鈕的點擊事件,該事件會刪除輸入框中的最後一個字符。
|
||||
/// </summary>
|
||||
/// <param name="sender">觸發事件的對象</param>
|
||||
/// <param name="e">事件參數</param>
|
||||
private void ModifyButtonZhuYinSingers_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
// 如果輸入框不為空,且包含輸入內容,則刪除最後一個字符
|
||||
if (this.Controls.Contains(inputBoxZhuYinSingers) && inputBoxZhuYinSingers.Text.Length > 0)
|
||||
{
|
||||
inputBoxZhuYinSingers.Text = inputBoxZhuYinSingers.Text.Substring(0, inputBoxZhuYinSingers.Text.Length - 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 初始化「清除」按鈕,設定按鈕的坐標、圖片和點擊事件。
|
||||
/// </summary>
|
||||
private void InitializeClearButtonZhuYinSingers()
|
||||
{
|
||||
// 加載配置數據
|
||||
var data = LoadConfigData();
|
||||
|
||||
// 讀取按鈕坐標
|
||||
clearButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "clearButtonZhuYinSingers");
|
||||
|
||||
// 加載按鈕圖片(正常、鼠標懸停、鼠標按下)
|
||||
var buttonImages = LoadButtonImages(data, "ClearButtonImagesZhuYin");
|
||||
|
||||
// 創建「清除」按鈕,並設置坐標、圖片及點擊事件
|
||||
clearButtonZhuYinSingers = CreateSpecialButton(
|
||||
"btnClearZhuYinSingers",
|
||||
clearButtonZhuYinCoords,
|
||||
buttonImages.normal,
|
||||
buttonImages.mouseOver,
|
||||
buttonImages.mouseDown,
|
||||
ClearButtonZhuYinSingers_Click
|
||||
"btnClearZhuYinSingers", // 按鈕名稱
|
||||
clearButtonZhuYinCoords, // 按鈕坐標
|
||||
buttonImages.normal, // 正常狀態圖片
|
||||
buttonImages.mouseOver, // 鼠標懸停圖片
|
||||
buttonImages.mouseDown, // 鼠標按下圖片
|
||||
ClearButtonZhuYinSingers_Click // 按鈕點擊事件
|
||||
);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 處理「清除」按鈕的點擊事件,該事件會清空輸入框中的所有文本。
|
||||
/// </summary>
|
||||
/// <param name="sender">觸發事件的對象</param>
|
||||
/// <param name="e">事件參數</param>
|
||||
private void ClearButtonZhuYinSingers_Click(object sender, EventArgs e)
|
||||
{
|
||||
{
|
||||
// 如果輸入框不為空,則清空該框的文本內容
|
||||
if (this.Controls.Contains(inputBoxZhuYinSingers) && inputBoxZhuYinSingers.Text.Length > 0)
|
||||
{
|
||||
inputBoxZhuYinSingers.Text = "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 初始化「關閉」按鈕,設定按鈕的坐標、圖片和點擊事件。
|
||||
/// </summary>
|
||||
private void InitializeCloseButtonZhuYinSingers()
|
||||
{
|
||||
// 加載配置數據
|
||||
var data = LoadConfigData();
|
||||
|
||||
// 讀取按鈕坐標
|
||||
closeButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "closeButtonZhuYinSingers");
|
||||
|
||||
// 加載按鈕圖片(正常、鼠標懸停、鼠標按下)
|
||||
var buttonImages = LoadButtonImages(data, "CloseButtonImagesZhuYin");
|
||||
|
||||
// 創建「關閉」按鈕,並設置坐標、圖片及點擊事件
|
||||
closeButtonZhuYinSingers = CreateSpecialButton(
|
||||
"btnCloseZhuYinSingers",
|
||||
closeButtonZhuYinCoords,
|
||||
buttonImages.normal,
|
||||
buttonImages.mouseOver,
|
||||
buttonImages.mouseDown,
|
||||
CloseButtonZhuYinSingers_Click
|
||||
"btnCloseZhuYinSingers", // 按鈕名稱
|
||||
closeButtonZhuYinCoords, // 按鈕坐標
|
||||
buttonImages.normal, // 正常狀態圖片
|
||||
buttonImages.mouseOver, // 鼠標懸停圖片
|
||||
buttonImages.mouseDown, // 鼠標按下圖片
|
||||
CloseButtonZhuYinSingers_Click // 按鈕點擊事件
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 「關閉」按鈕的點擊事件處理方法。
|
||||
/// 隱藏 ZhuYin 歌手圖片框以及與其相關的按鈕。
|
||||
/// </summary>
|
||||
/// <param name="sender">觸發事件的對象,這裡是關閉按鈕。</param>
|
||||
/// <param name="e">事件參數。</param>
|
||||
private void CloseButtonZhuYinSingers_Click(object sender, EventArgs e)
|
||||
{
|
||||
// 隱藏 ZhuYin 歌手圖片框
|
||||
pictureBoxZhuYinSingers.Visible = false;
|
||||
// 關閉注音搜尋的按鈕顏色
|
||||
zhuyinSearchButton.BackgroundImage = zhuyinSearchNormalBackground;
|
||||
// 隱藏與 ZhuYin 歌手相關的所有按鈕
|
||||
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)
|
||||
{
|
||||
// 創建按鈕並設定基本屬性
|
||||
var button = new Button
|
||||
{
|
||||
Name = name,
|
||||
@ -335,94 +547,127 @@ namespace DualScreenDemo
|
||||
BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath))
|
||||
};
|
||||
|
||||
// 設定按鈕的大小和位置
|
||||
ResizeAndPositionButton(button, coords.X, coords.Y, coords.Width, coords.Height);
|
||||
|
||||
// 設定鼠標事件:進入、離開、按下、放開
|
||||
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.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.Click += clickEventHandler;
|
||||
|
||||
// 將按鈕添加到控件集合中
|
||||
this.Controls.Add(button);
|
||||
|
||||
return button;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 初始化 ZhuYin 歌手的輸入框,並設定其屬性與事件處理程序。
|
||||
/// </summary>
|
||||
private void InitializeInputBoxZhuYinSingers()
|
||||
{
|
||||
try
|
||||
{
|
||||
// 加載輸入框配置
|
||||
LoadInputBoxConfig();
|
||||
|
||||
// 創建一個 RichTextBox 控件來作為輸入框
|
||||
inputBoxZhuYinSingers = new RichTextBox
|
||||
{
|
||||
Name = "inputBoxZhuYinSingers",
|
||||
ForeColor = inputBoxForeColor,
|
||||
Font = new Font(inputBoxFontName, inputBoxFontSize, inputBoxFontStyle),
|
||||
ScrollBars = RichTextBoxScrollBars.None
|
||||
ForeColor = inputBoxForeColor, // 設定文字顏色
|
||||
Font = new Font(inputBoxFontName, inputBoxFontSize, inputBoxFontStyle), // 設定字體樣式
|
||||
ScrollBars = RichTextBoxScrollBars.None // 不顯示滾動條
|
||||
};
|
||||
|
||||
// 調整和定位輸入框的位置及大小
|
||||
ResizeAndPositionControl(inputBoxZhuYinSingers, inputBoxZhuYinCoords.X, inputBoxZhuYinCoords.Y, inputBoxZhuYinCoords.Width, inputBoxZhuYinCoords.Height);
|
||||
|
||||
// 設定文本變更事件,當輸入框內容改變時觸發
|
||||
inputBoxZhuYinSingers.TextChanged += (sender, e) =>
|
||||
{
|
||||
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;
|
||||
currentSongList = relatedSongs;
|
||||
totalPages = (int)Math.Ceiling((double)relatedSongs.Count / itemsPerPage);
|
||||
|
||||
currentArtistList = searchResults;
|
||||
totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage);
|
||||
|
||||
multiPagePanel.currentPageIndex = 0;
|
||||
multiPagePanel.LoadSongs(relatedSongs);
|
||||
multiPagePanel.LoadSingers(currentArtistList);
|
||||
};
|
||||
|
||||
// 將輸入框加入到窗體的控件集合中
|
||||
this.Controls.Add(inputBoxZhuYinSingers);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 如果初始化過程中出現錯誤,則在控制台輸出錯誤信息
|
||||
Console.WriteLine("Error initializing inputBoxZhuYinSingers: " + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 從配置文件 `config.ini` 中加載輸入框的設置,包括位置、大小、字體等屬性。
|
||||
/// </summary>
|
||||
private void LoadInputBoxConfig()
|
||||
{
|
||||
try
|
||||
{
|
||||
// 創建 INI 解析器
|
||||
var parser = new FileIniDataParser();
|
||||
string iniFilePath = "config.ini";
|
||||
string iniFilePath = "config.ini"; // 配置文件的路徑
|
||||
|
||||
IniData data;
|
||||
// 打開並讀取配置文件
|
||||
using (var reader = new StreamReader(iniFilePath, Encoding.UTF8))
|
||||
{
|
||||
data = parser.ReadData(reader);
|
||||
}
|
||||
|
||||
// 從配置中加載輸入框的坐標和大小
|
||||
inputBoxZhuYinCoords = (
|
||||
int.Parse(data["InputBoxZhuYinSingers"]["X"]),
|
||||
int.Parse(data["InputBoxZhuYinSingers"]["Y"]),
|
||||
int.Parse(data["InputBoxZhuYinSingers"]["Width"]),
|
||||
int.Parse(data["InputBoxZhuYinSingers"]["Height"])
|
||||
int.Parse(data["InputBoxZhuYinSingers"]["X"]), // 輸入框的 X 坐標
|
||||
int.Parse(data["InputBoxZhuYinSingers"]["Y"]), // 輸入框的 Y 坐標
|
||||
int.Parse(data["InputBoxZhuYinSingers"]["Width"]), // 輸入框的寬度
|
||||
int.Parse(data["InputBoxZhuYinSingers"]["Height"]) // 輸入框的高度
|
||||
);
|
||||
|
||||
inputBoxFontName = data["InputBoxZhuYinSingers"]["FontName"];
|
||||
inputBoxFontSize = float.Parse(data["InputBoxZhuYinSingers"]["FontSize"]);
|
||||
inputBoxFontStyle = (FontStyle)Enum.Parse(typeof(FontStyle), data["InputBoxZhuYinSingers"]["FontStyle"]);
|
||||
inputBoxForeColor = Color.FromName(data["InputBoxZhuYinSingers"]["ForeColor"]);
|
||||
// 從配置中加載字體屬性
|
||||
inputBoxFontName = data["InputBoxZhuYinSingers"]["FontName"]; // 字體名稱
|
||||
inputBoxFontSize = float.Parse(data["InputBoxZhuYinSingers"]["FontSize"]); // 字體大小
|
||||
inputBoxFontStyle = (FontStyle)Enum.Parse(typeof(FontStyle), data["InputBoxZhuYinSingers"]["FontStyle"]); // 字體樣式
|
||||
inputBoxForeColor = Color.FromName(data["InputBoxZhuYinSingers"]["ForeColor"]); // 字體顏色
|
||||
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 若發生錯誤,顯示錯誤信息
|
||||
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;
|
||||
|
||||
/// <summary>
|
||||
/// 從配置檔案中讀取 `PictureBoxZhuYinSingers` 控制項的坐標和大小設置。
|
||||
/// </summary>
|
||||
private void LoadPictureBoxZhuYinSingerCoordsFromConfig()
|
||||
{
|
||||
var parser = new FileIniDataParser();
|
||||
@ -437,34 +682,48 @@ namespace DualScreenDemo
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 顯示圖片並根據配置文件設置顯示區域的大小和位置。
|
||||
/// </summary>
|
||||
/// <param name="imagePath">圖片的路徑。</param>
|
||||
private void ShowImageOnPictureBoxZhuYinSingers(string imagePath)
|
||||
{
|
||||
|
||||
// 讀取配置文件中的顯示區域設置
|
||||
LoadPictureBoxZhuYinSingerCoordsFromConfig();
|
||||
|
||||
|
||||
// 加載原始圖片
|
||||
Bitmap originalImage = new Bitmap(imagePath);
|
||||
|
||||
|
||||
// 創建顯示區域,根據配置文件中的坐標和大小設置
|
||||
Rectangle displayArea = new Rectangle(pictureBoxZhuYinSingerCoords.X, pictureBoxZhuYinSingerCoords.Y, pictureBoxZhuYinSingerCoords.Width, pictureBoxZhuYinSingerCoords.Height);
|
||||
|
||||
|
||||
// 設置圖片到 PictureBox
|
||||
pictureBoxZhuYinSingers.Image = originalImage;
|
||||
|
||||
|
||||
// 調整 PictureBox 大小和位置
|
||||
ResizeAndPositionPictureBox(pictureBoxZhuYinSingers, displayArea.X, displayArea.Y, displayArea.Width, displayArea.Height);
|
||||
|
||||
// 顯示圖片
|
||||
pictureBoxZhuYinSingers.Visible = true;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 設置注音歌手相關控制項(包括圖片框、按鈕和輸入框)的顯示或隱藏狀態。
|
||||
/// </summary>
|
||||
/// <param name="isVisible">指定控件是否可見。True 為顯示,False 為隱藏。</param>
|
||||
private void SetZhuYinSingersAndButtonsVisibility(bool isVisible)
|
||||
{
|
||||
// 定義一個動作來處理控制項的顯示或隱藏
|
||||
System.Action action = () =>
|
||||
{
|
||||
try
|
||||
{
|
||||
// 暫停控制項佈局的重新排版,提高效率
|
||||
SuspendLayout();
|
||||
|
||||
// 檢查並設置圖片框的可見性
|
||||
if (pictureBoxZhuYinSingers == null)
|
||||
{
|
||||
Console.WriteLine("pictureBoxZhuYinSingers is null");
|
||||
@ -472,9 +731,10 @@ namespace DualScreenDemo
|
||||
else
|
||||
{
|
||||
pictureBoxZhuYinSingers.Visible = isVisible;
|
||||
if (isVisible) pictureBoxZhuYinSingers.BringToFront();
|
||||
if (isVisible) pictureBoxZhuYinSingers.BringToFront(); // 如果顯示,將其置於最前
|
||||
}
|
||||
|
||||
// 檢查並設置拼音按鈕的可見性
|
||||
if (phoneticButtonsForSingers == null)
|
||||
{
|
||||
Console.WriteLine("phoneticButtonsForSingers is null");
|
||||
@ -490,11 +750,12 @@ namespace DualScreenDemo
|
||||
else
|
||||
{
|
||||
button.Visible = isVisible;
|
||||
if (isVisible) button.BringToFront();
|
||||
if (isVisible) button.BringToFront(); // 如果顯示,將其置於最前
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 檢查並設置修改按鈕的可見性
|
||||
if (modifyButtonZhuYinSingers == null)
|
||||
{
|
||||
Console.WriteLine("modifyButtonZhuYinSingers is null");
|
||||
@ -502,9 +763,10 @@ namespace DualScreenDemo
|
||||
else
|
||||
{
|
||||
modifyButtonZhuYinSingers.Visible = isVisible;
|
||||
if (isVisible) modifyButtonZhuYinSingers.BringToFront();
|
||||
if (isVisible) modifyButtonZhuYinSingers.BringToFront(); // 如果顯示,將其置於最前
|
||||
}
|
||||
|
||||
// 檢查並設置清除按鈕的可見性
|
||||
if (clearButtonZhuYinSingers == null)
|
||||
{
|
||||
Console.WriteLine("clearButtonZhuYinSingers is null");
|
||||
@ -512,9 +774,10 @@ namespace DualScreenDemo
|
||||
else
|
||||
{
|
||||
clearButtonZhuYinSingers.Visible = isVisible;
|
||||
if (isVisible) clearButtonZhuYinSingers.BringToFront();
|
||||
if (isVisible) clearButtonZhuYinSingers.BringToFront(); // 如果顯示,將其置於最前
|
||||
}
|
||||
|
||||
// 檢查並設置關閉按鈕的可見性
|
||||
if (closeButtonZhuYinSingers == null)
|
||||
{
|
||||
Console.WriteLine("closeButtonZhuYinSingers is null");
|
||||
@ -522,9 +785,10 @@ namespace DualScreenDemo
|
||||
else
|
||||
{
|
||||
closeButtonZhuYinSingers.Visible = isVisible;
|
||||
if (isVisible) closeButtonZhuYinSingers.BringToFront();
|
||||
if (isVisible) closeButtonZhuYinSingers.BringToFront(); // 如果顯示,將其置於最前
|
||||
}
|
||||
|
||||
// 檢查並設置輸入框的可見性
|
||||
if (inputBoxZhuYinSingers == null)
|
||||
{
|
||||
Console.WriteLine("inputBoxZhuYinSingers is null");
|
||||
@ -532,19 +796,20 @@ namespace DualScreenDemo
|
||||
else
|
||||
{
|
||||
inputBoxZhuYinSingers.Visible = isVisible;
|
||||
if (isVisible) inputBoxZhuYinSingers.BringToFront();
|
||||
if (isVisible) inputBoxZhuYinSingers.BringToFront(); // 如果顯示,將其置於最前
|
||||
}
|
||||
|
||||
// 恢復控制項的佈局重新排版
|
||||
ResumeLayout();
|
||||
PerformLayout();
|
||||
|
||||
|
||||
// 刷新所有控制項的顯示
|
||||
pictureBoxZhuYinSingers?.Refresh();
|
||||
if (phoneticButtonsForSingers != null)
|
||||
{
|
||||
foreach (var button in phoneticButtonsForSingers)
|
||||
{
|
||||
button?.Refresh();
|
||||
button?.Refresh(); // 刷新每個按鈕
|
||||
}
|
||||
}
|
||||
modifyButtonZhuYinSingers?.Refresh();
|
||||
@ -558,14 +823,16 @@ namespace DualScreenDemo
|
||||
}
|
||||
};
|
||||
|
||||
// 檢查是否需要在主執行緒外執行
|
||||
if (this.InvokeRequired)
|
||||
{
|
||||
this.Invoke(action);
|
||||
this.Invoke(action); // 如果需要,透過主執行緒執行
|
||||
}
|
||||
else
|
||||
{
|
||||
action();
|
||||
action(); // 否則直接執行
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -45,8 +45,11 @@ namespace DualScreenDemo
|
||||
SetZhuYinSingersAndButtonsVisibility(false);
|
||||
SetPinYinSingersAndButtonsVisibility(false);
|
||||
SetHandWritingForSingersAndButtonsVisibility(false);
|
||||
SetWordCountSingersAndButtonsVisibility(false); // 隱藏字數搜尋相關控件
|
||||
|
||||
SetEnglishSingersAndButtonsVisibility(true);
|
||||
SetPictureBoxArtistSearchAndButtonsVisibility(false);
|
||||
//SetPictureBoxArtistSearchAndButtonsVisibility(false);
|
||||
ResetinputBox();
|
||||
pictureBoxEnglishSingers.Visible = true;
|
||||
}
|
||||
|
||||
@ -268,6 +271,7 @@ namespace DualScreenDemo
|
||||
{
|
||||
|
||||
pictureBoxEnglishSingers.Visible = false;
|
||||
englishSearchButton.BackgroundImage = englishSearchNormalBackground;
|
||||
SetEnglishSingersAndButtonsVisibility(false);
|
||||
}
|
||||
|
||||
|
@ -45,9 +45,11 @@ namespace DualScreenDemo
|
||||
SetZhuYinSingersAndButtonsVisibility(false);
|
||||
SetEnglishSingersAndButtonsVisibility(false);
|
||||
SetPinYinSingersAndButtonsVisibility(false);
|
||||
SetPictureBoxArtistSearchAndButtonsVisibility(false);
|
||||
SetWordCountSingersAndButtonsVisibility(false); // 隱藏字數搜尋相關控件
|
||||
//SetPictureBoxArtistSearchAndButtonsVisibility(false);
|
||||
SetHandWritingForSingersAndButtonsVisibility(true);
|
||||
|
||||
ResetinputBox();
|
||||
this.ResumeLayout();
|
||||
}
|
||||
|
||||
@ -298,7 +300,7 @@ namespace DualScreenDemo
|
||||
this.SuspendLayout();
|
||||
|
||||
SetHandWritingForSingersAndButtonsVisibility(false);
|
||||
|
||||
handWritingSearchButton.BackgroundImage = handWritingSearchNormalBackground;
|
||||
|
||||
this.ResumeLayout();
|
||||
}
|
||||
|
@ -38,10 +38,13 @@ namespace DualScreenDemo
|
||||
|
||||
|
||||
|
||||
SetZhuYinSingersAndButtonsVisibility(false);
|
||||
SetEnglishSingersAndButtonsVisibility(false);
|
||||
SetZhuYinSingersAndButtonsVisibility(false); // 隱藏注音搜尋相關控件
|
||||
SetEnglishSingersAndButtonsVisibility(false); // 隱藏英文搜尋相關控件
|
||||
SetWordCountSingersAndButtonsVisibility(false); // 隱藏字數搜尋相關控件
|
||||
SetHandWritingForSingersAndButtonsVisibility(false); // 隱藏手寫搜尋相關控件
|
||||
|
||||
SetPinYinSingersAndButtonsVisibility(true);
|
||||
SetPictureBoxArtistSearchAndButtonsVisibility(false);
|
||||
//SetPictureBoxArtistSearchAndButtonsVisibility(false);
|
||||
pictureBoxPinYinSingers.Visible = true;
|
||||
}
|
||||
|
||||
@ -168,6 +171,7 @@ namespace DualScreenDemo
|
||||
private void CloseButtonPinYinSingers_Click(object sender, EventArgs e)
|
||||
{
|
||||
pictureBoxPinYinSingers.Visible = false;
|
||||
pinyinSearchButton.BackgroundImage = pinyinSearchNormalBackground;
|
||||
SetPinYinSingersAndButtonsVisibility(false);
|
||||
}
|
||||
|
||||
@ -218,6 +222,16 @@ namespace DualScreenDemo
|
||||
|
||||
multiPagePanel.currentPageIndex = 0;
|
||||
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 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);
|
||||
}
|
||||
|
@ -13,16 +13,22 @@ namespace DualScreenDemo
|
||||
{
|
||||
public partial class PrimaryForm
|
||||
{
|
||||
// 注音歌曲的 PictureBox
|
||||
private PictureBox pictureBoxZhuYinSongs;
|
||||
|
||||
//存放注音按鈕的陣列
|
||||
private Button[] phoneticButtonsForSongs;
|
||||
//特殊功能按鈕(修改、清除、關閉)
|
||||
private Button modifyButtonZhuYinSongs;
|
||||
private Button clearButtonZhuYinSongs;
|
||||
private Button closeButtonZhuYinSongs;
|
||||
//用於顯示輸入文字的輸入框
|
||||
private RichTextBox inputBoxZhuYinSongs;
|
||||
|
||||
/// <summary>
|
||||
/// 注音歌曲搜尋按鈕點擊事件
|
||||
/// </summary>
|
||||
private void ZhuyinSearchSongsButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
//更新搜尋模式按鈕的背景圖
|
||||
zhuyinSearchSongButton.BackgroundImage = zhuyinSearchSongActiveBackground;
|
||||
englishSearchSongButton.BackgroundImage = englishSearchSongNormalBackground;
|
||||
pinyinSearchSongButton.BackgroundImage = pinyinSearchSongNormalBackground;
|
||||
@ -30,199 +36,320 @@ namespace DualScreenDemo
|
||||
handWritingSearchSongButton.BackgroundImage = handWritingSearchSongNormalBackground;
|
||||
numberSearchSongButton.BackgroundImage = numberSearchSongNormalBackground;
|
||||
|
||||
|
||||
// 讀取 config.ini 並獲取注音圖片的路徑
|
||||
var configData = LoadConfigData();
|
||||
/* 抓注音圖檔(ZhuYinSongs) 來自configData的資料 */
|
||||
/* 要確認路經需確認configData內容值 */
|
||||
string imagePath = Path.Combine(Application.StartupPath, configData["ImagePaths"]["ZhuYinSongs"]);
|
||||
|
||||
//顯示注音歌曲圖片
|
||||
ShowImageOnPictureBoxZhuYinSongs(Path.Combine(Application.StartupPath, imagePath));
|
||||
|
||||
|
||||
|
||||
SetZhuYinSingersAndButtonsVisibility(false);
|
||||
SetEnglishSingersAndButtonsVisibility(false);
|
||||
SetPinYinSingersAndButtonsVisibility(false);
|
||||
SetHandWritingForSingersAndButtonsVisibility(false);
|
||||
//設定不同模式的UI顯示
|
||||
SetWordCountSongsAndButtonsVisibility(false); // 隱藏字數搜尋相關控件
|
||||
SetEnglishSongsAndButtonsVisibility(false);
|
||||
SetPinYinSongsAndButtonsVisibility(false);
|
||||
SetHandWritingForSongsAndButtonsVisibility(false);
|
||||
SetSongIDSearchAndButtonsVisibility(false);
|
||||
SetZhuYinSongsAndButtonsVisibility(true);
|
||||
ResetinputBox();
|
||||
pictureBoxZhuYinSongs.Visible = true;
|
||||
}
|
||||
/* 初始化拼音按鈕 */
|
||||
/// <summary>
|
||||
/// 初始化注音按鈕 (Phonetic Buttons) 並載入其對應的圖片與座標
|
||||
/// <para>1. 讀取 config.ini 設定檔,獲取按鈕的相關數據 (符號、座標、圖片)</para>
|
||||
/// <para>2. 解析注音符號並儲存至 phoneticSymbols 陣列</para>
|
||||
/// <para>3. 解析按鈕的座標資訊,存入 phoneticButtonCoords</para>
|
||||
/// <para>4. 解析按鈕的圖片 (正常狀態、按下狀態、懸停狀態),存入 phoneticButtonImages。</para>
|
||||
/// <para>5. 依序建立 35 個注音按鈕,並套用對應的圖片與事件處理函數。</para>
|
||||
/// </summary>
|
||||
private void InitializePhoneticButtonsForSongs()
|
||||
{
|
||||
// 1. 從設定檔 (config.ini) 讀取配置數據,包含按鈕座標、圖片等
|
||||
var data = LoadConfigData();
|
||||
|
||||
// 2. 讀取注音符號列表,這些符號將用於顯示在按鈕上
|
||||
phoneticSymbols = LoadPhoneticSymbols(data);
|
||||
|
||||
// 3. 從設定檔載入 **注音按鈕的座標**,每個按鈕都有對應的 (X, Y, Width, Height)
|
||||
phoneticButtonCoords = LoadButtonCoordinates(data, "PhoneticButtonCoordinates", 35);
|
||||
|
||||
// 4. 從設定檔載入 **注音按鈕的圖片**,每個按鈕都有正常、按下、懸停三種狀態
|
||||
phoneticButtonImages = LoadButtonImages(data, "PhoneticButtonImages", 35);
|
||||
|
||||
// 5. 建立 35 個注音按鈕的陣列 (每個按鈕對應一個注音符號)
|
||||
phoneticButtonsForSongs = new Button[35];
|
||||
|
||||
// 6. 迴圈建立所有的注音按鈕
|
||||
for (int i = 0; i < 35; i++)
|
||||
{
|
||||
// 取得當前按鈕的圖片 (從已載入的 phoneticButtonImages 字典中獲取)
|
||||
var buttonImages = phoneticButtonImages[$"button{i}"];
|
||||
CreatePhoneticButtonForSongs(i, 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)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
|
||||
// 1. 創建按鈕並初始化屬性
|
||||
phoneticButtonsForSongs[index] = new Button
|
||||
{
|
||||
Name = $"phoneticButton_{phoneticSymbols[index]}",
|
||||
BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath)),
|
||||
BackgroundImageLayout = ImageLayout.Stretch,
|
||||
FlatStyle = FlatStyle.Flat,
|
||||
FlatAppearance = { BorderSize = 0 }
|
||||
Name = $"phoneticButton_{phoneticSymbols[index]}", // 設定按鈕名稱,方便識別
|
||||
BackgroundImage = Image.FromFile(Path.Combine(Application.StartupPath, normalImagePath)), // 設定預設背景圖
|
||||
BackgroundImageLayout = ImageLayout.Stretch, // 背景圖自動填滿按鈕
|
||||
FlatStyle = FlatStyle.Flat, // 設定按鈕為扁平樣式
|
||||
FlatAppearance = { BorderSize = 0 } // 移除按鈕的邊框
|
||||
};
|
||||
|
||||
ResizeAndPositionButton(phoneticButtonsForSongs[index], phoneticButtonCoords[index].X, phoneticButtonCoords[index].Y,
|
||||
phoneticButtonCoords[index].Width, phoneticButtonCoords[index].Height);
|
||||
// 2. 設定按鈕的大小與位置
|
||||
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 mouseDownImage = Image.FromFile(Path.Combine(Application.StartupPath, mouseDownImagePath));
|
||||
Image mouseOverImage = Image.FromFile(Path.Combine(Application.StartupPath, mouseOverImagePath));
|
||||
|
||||
// 4. 設定滑鼠事件,改變背景圖
|
||||
phoneticButtonsForSongs[index].MouseDown += (s, e) => phoneticButtonsForSongs[index].BackgroundImage = mouseDownImage;
|
||||
phoneticButtonsForSongs[index].MouseUp += (s, e) => phoneticButtonsForSongs[index].BackgroundImage = normalImage;
|
||||
phoneticButtonsForSongs[index].MouseEnter += (s, e) => phoneticButtonsForSongs[index].BackgroundImage = mouseOverImage;
|
||||
phoneticButtonsForSongs[index].MouseLeave += (s, e) => phoneticButtonsForSongs[index].BackgroundImage = normalImage;
|
||||
|
||||
// 5. 設定按鈕的點擊事件 (當按下按鈕時,觸發 PhoneticButton_Click)
|
||||
phoneticButtonsForSongs[index].Click += PhoneticButton_Click;
|
||||
|
||||
// 6. 存入對應的注音符號,方便之後的處理
|
||||
phoneticButtonsForSongs[index].Tag = phoneticSymbols[index];
|
||||
|
||||
// 7. 將按鈕加入視窗
|
||||
this.Controls.Add(phoneticButtonsForSongs[index]);
|
||||
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 例外處理,確保按鈕建立失敗時不影響其他部分
|
||||
Console.WriteLine($"Error creating button at index {index}: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 初始化注音輸入界面的所有按鈕和輸入框。
|
||||
/// </summary>
|
||||
private void InitializeButtonsForZhuYinSongs()
|
||||
{
|
||||
// 1. 從設定檔 (config.ini) 載入注音符號
|
||||
LoadPhoneticSymbolsFromConfig();
|
||||
|
||||
// 2. 初始化 35 個注音按鈕
|
||||
InitializePhoneticButtonsForSongs();
|
||||
|
||||
// 3. 初始化特殊按鈕 (例如:刪除、確定、返回按鈕)
|
||||
InitializeSpecialButtonsForZhuYinSongs();
|
||||
|
||||
// 4. 初始化輸入框 (用於顯示使用者輸入的注音符號)
|
||||
InitializeInputBoxZhuYinSongs();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 初始化注音輸入界面的特殊按鈕,包括「修改」、「清除」和「關閉」。
|
||||
/// </summary>
|
||||
private void InitializeSpecialButtonsForZhuYinSongs()
|
||||
{
|
||||
|
||||
// 1. 初始化「修改」按鈕 (刪除上一個輸入的注音符號)
|
||||
InitializeModifyButtonZhuYinSongs();
|
||||
|
||||
|
||||
// 2. 初始化「清除」按鈕 (清空所有輸入內容)
|
||||
InitializeClearButtonZhuYinSongs();
|
||||
|
||||
|
||||
// 3. 初始化「關閉」按鈕 (關閉注音輸入介面)
|
||||
InitializeCloseButtonZhuYinSongs();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 初始化「修改」按鈕,讓使用者可以刪除上一個輸入的注音符號。
|
||||
/// </summary>
|
||||
private void InitializeModifyButtonZhuYinSongs()
|
||||
{
|
||||
// 1. 讀取設定檔 (config.ini) 來獲取特殊按鈕的座標與圖像資訊
|
||||
var data = LoadConfigData();
|
||||
|
||||
// 2. 從設定檔讀取「修改」按鈕的座標數據
|
||||
modifyButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "modifyButtonZhuYinSongs");
|
||||
|
||||
// 3. 從設定檔讀取「修改」按鈕的圖像 (Normal、MouseOver、MouseDown)
|
||||
var buttonImages = LoadButtonImages(data, "ModifyButtonImagesZhuYin");
|
||||
|
||||
// 4. 使用座標與圖像來建立「修改」按鈕,並綁定點擊事件
|
||||
modifyButtonZhuYinSongs = CreateSpecialButton(
|
||||
"btnModifyZhuYinSongs",
|
||||
modifyButtonZhuYinCoords,
|
||||
buttonImages.normal,
|
||||
buttonImages.mouseOver,
|
||||
buttonImages.mouseDown,
|
||||
ModifyButtonZhuYinSongs_Click
|
||||
"btnModifyZhuYinSongs", // 按鈕名稱
|
||||
modifyButtonZhuYinCoords, // 按鈕座標
|
||||
buttonImages.normal, // 預設 (normal) 圖像
|
||||
buttonImages.mouseOver, // 滑鼠移過 (hover) 圖像
|
||||
buttonImages.mouseDown, // 按下 (pressed) 圖像
|
||||
ModifyButtonZhuYinSongs_Click // 綁定按鈕點擊事件
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 「修改」按鈕的點擊事件,刪除輸入框內的最後一個注音符號。
|
||||
/// </summary>
|
||||
private void ModifyButtonZhuYinSongs_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
// 1. 確保輸入框 (inputBoxZhuYinSongs) 存在於目前的視窗控制項中
|
||||
if (this.Controls.Contains(inputBoxZhuYinSongs) && inputBoxZhuYinSongs.Text.Length > 0)
|
||||
{
|
||||
// 2. 刪除輸入框中的最後一個字元 (即移除最後一個注音符號)
|
||||
inputBoxZhuYinSongs.Text = inputBoxZhuYinSongs.Text.Substring(0, inputBoxZhuYinSongs.Text.Length - 1);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化「清除」按鈕,並從設定檔載入其位置與圖片資源。
|
||||
/// </summary>
|
||||
private void InitializeClearButtonZhuYinSongs()
|
||||
{
|
||||
// 1. 從設定檔 (config.ini) 讀取配置數據
|
||||
var data = LoadConfigData();
|
||||
|
||||
// 2. 讀取「清除」按鈕的座標設定 (從 "SpecialButtonCoordinates" 內的 "clearButtonZhuYinSongs" 取得)
|
||||
clearButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "clearButtonZhuYinSongs");
|
||||
|
||||
// 3. 讀取「清除」按鈕的圖片 (正常、滑鼠懸停、按下狀態)
|
||||
var buttonImages = LoadButtonImages(data, "ClearButtonImagesZhuYin");
|
||||
|
||||
// 4. 建立「清除」按鈕,並設定對應的事件處理函式 (ClearButtonZhuYinSongs_Click)
|
||||
clearButtonZhuYinSongs = CreateSpecialButton(
|
||||
"btnClearZhuYinSongs",
|
||||
clearButtonZhuYinCoords,
|
||||
buttonImages.normal,
|
||||
buttonImages.mouseOver,
|
||||
buttonImages.mouseDown,
|
||||
ClearButtonZhuYinSongs_Click
|
||||
"btnClearZhuYinSongs", // 按鈕名稱
|
||||
clearButtonZhuYinCoords, // 按鈕座標與大小
|
||||
buttonImages.normal, // 正常狀態圖片
|
||||
buttonImages.mouseOver, // 滑鼠懸停圖片
|
||||
buttonImages.mouseDown, // 按下時圖片
|
||||
ClearButtonZhuYinSongs_Click // 點擊事件處理函式
|
||||
);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 當使用者點擊「清除」按鈕時,將輸入框 (inputBoxZhuYinSongs) 的內容清空。
|
||||
/// </summary>
|
||||
/// <param name="sender">觸發事件的按鈕。</param>
|
||||
/// <param name="e">事件參數。</param>
|
||||
private void ClearButtonZhuYinSongs_Click(object sender, EventArgs e)
|
||||
{
|
||||
{
|
||||
// 1. 確保視窗內包含「注音輸入框」(inputBoxZhuYinSongs),且輸入框內有文字
|
||||
if (this.Controls.Contains(inputBoxZhuYinSongs) && inputBoxZhuYinSongs.Text.Length > 0)
|
||||
{
|
||||
// 2. 清空輸入框內容
|
||||
inputBoxZhuYinSongs.Text = "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 初始化注音輸入的關閉按鈕,從設定檔讀取按鈕座標與圖片,並設置點擊事件
|
||||
/// </summary>
|
||||
private void InitializeCloseButtonZhuYinSongs()
|
||||
{
|
||||
// 讀取設定檔數據
|
||||
var data = LoadConfigData();
|
||||
|
||||
// 從設定檔讀取關閉按鈕的座標
|
||||
closeButtonZhuYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "closeButtonZhuYinSongs");
|
||||
|
||||
// 從設定檔讀取關閉按鈕的圖片
|
||||
var buttonImages = LoadButtonImages(data, "CloseButtonImagesZhuYin");
|
||||
|
||||
// 創建關閉按鈕並綁定點擊事件
|
||||
closeButtonZhuYinSongs = CreateSpecialButton(
|
||||
"btnCloseZhuYinSongs",
|
||||
closeButtonZhuYinCoords,
|
||||
buttonImages.normal,
|
||||
buttonImages.mouseOver,
|
||||
buttonImages.mouseDown,
|
||||
CloseButtonZhuYinSongs_Click
|
||||
"btnCloseZhuYinSongs", // 按鈕名稱
|
||||
closeButtonZhuYinCoords, // 按鈕座標
|
||||
buttonImages.normal, // 正常狀態圖片
|
||||
buttonImages.mouseOver, // 滑鼠懸停圖片
|
||||
buttonImages.mouseDown, // 按下圖片
|
||||
CloseButtonZhuYinSongs_Click // 綁定點擊事件
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 關閉注音輸入介面,隱藏相關 UI 元件
|
||||
/// </summary>
|
||||
/// <param name="sender">觸發事件的按鈕 (關閉按鈕)</param>
|
||||
/// <param name="e">事件參數</param>
|
||||
private void CloseButtonZhuYinSongs_Click(object sender, EventArgs e)
|
||||
{
|
||||
// 隱藏注音輸入的圖片
|
||||
pictureBoxZhuYinSongs.Visible = false;
|
||||
zhuyinSearchSongButton.BackgroundImage = zhuyinSearchSongNormalBackground;
|
||||
// 隱藏注音輸入的所有按鈕與介面元素
|
||||
SetZhuYinSongsAndButtonsVisibility(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化注音輸入框 (RichTextBox),設定外觀、事件處理及位置大小
|
||||
/// </summary>
|
||||
private void InitializeInputBoxZhuYinSongs()
|
||||
{
|
||||
try
|
||||
{
|
||||
// 讀取輸入框的配置,例如字體、顏色、大小等
|
||||
LoadInputBoxConfig();
|
||||
|
||||
// 建立注音輸入框並套用讀取到的設定
|
||||
inputBoxZhuYinSongs = new RichTextBox
|
||||
{
|
||||
Name = "inputBoxZhuYinSongs",
|
||||
ForeColor = inputBoxForeColor,
|
||||
Font = new Font(inputBoxFontName, inputBoxFontSize, inputBoxFontStyle),
|
||||
ScrollBars = RichTextBoxScrollBars.None
|
||||
ForeColor = inputBoxForeColor, // 設定文字顏色
|
||||
Font = new Font(inputBoxFontName, inputBoxFontSize, inputBoxFontStyle), // 設定字體
|
||||
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) =>
|
||||
{
|
||||
/* 搜尋結果顯示到前歌單點選 */
|
||||
string searchText = inputBoxZhuYinSongs.Text;
|
||||
string searchText = inputBoxZhuYinSongs.Text; // 取得輸入內容
|
||||
|
||||
// 根據輸入的注音篩選歌曲清單
|
||||
var searchResults = allSongs.Where(song => song.PhoneticNotation.StartsWith(searchText)).ToList();
|
||||
|
||||
// 重置分頁
|
||||
currentPage = 0;
|
||||
currentSongList = searchResults;
|
||||
totalPages = (int)Math.Ceiling((double)searchResults.Count / itemsPerPage);
|
||||
|
||||
// 更新多頁面面板的內容
|
||||
multiPagePanel.currentPageIndex = 0;
|
||||
multiPagePanel.LoadSongs(currentSongList);
|
||||
};
|
||||
|
||||
// 將輸入框加入到 UI 控制項
|
||||
this.Controls.Add(inputBoxZhuYinSongs);
|
||||
}
|
||||
catch (Exception ex)
|
||||
@ -230,51 +357,95 @@ namespace DualScreenDemo
|
||||
Console.WriteLine("Error initializing inputBoxZhuYinSongs: " + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 存儲 PictureBoxZhuYinSongs 的座標與尺寸信息。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 此元組包含以下四個值:
|
||||
/// X:X 座標
|
||||
/// , Y:Y 座標
|
||||
/// , Width:寬度
|
||||
/// , Height:高度
|
||||
/// </remarks>
|
||||
private (int X, int Y, int Width, int Height) pictureBoxZhuYinSongCoords;
|
||||
|
||||
/// <summary>
|
||||
/// 從設定檔 (config.ini) 讀取 PictureBoxZhuYinSongs 的座標與尺寸
|
||||
/// </summary>
|
||||
private void LoadPictureBoxZhuYinSongCoordsFromConfig()
|
||||
{
|
||||
// 建立 INI 檔案解析器
|
||||
var parser = new FileIniDataParser();
|
||||
|
||||
// 讀取 config.ini 設定檔的內容
|
||||
IniData data = parser.ReadFile("config.ini");
|
||||
|
||||
// 取得 "PictureBoxZhuYinSongs" 段落的設定數據
|
||||
var coords = data["PictureBoxZhuYinSongs"];
|
||||
|
||||
// 解析座標與尺寸,並存入 pictureBoxZhuYinSongCoords
|
||||
pictureBoxZhuYinSongCoords = (
|
||||
int.Parse(coords["X"]),
|
||||
int.Parse(coords["Y"]),
|
||||
int.Parse(coords["Width"]),
|
||||
int.Parse(coords["Height"])
|
||||
int.Parse(coords["X"]), // 讀取 X 座標
|
||||
int.Parse(coords["Y"]), // 讀取 Y 座標
|
||||
int.Parse(coords["Width"]), // 讀取寬度
|
||||
int.Parse(coords["Height"]) // 讀取高度
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 在 pictureBoxZhuYinSongs 上顯示指定路徑的圖片,並根據設定調整其大小與位置。
|
||||
/// </summary>
|
||||
/// <param name="imagePath">要顯示的圖片檔案路徑</param>
|
||||
private void ShowImageOnPictureBoxZhuYinSongs(string imagePath)
|
||||
{
|
||||
|
||||
// 從 config.ini 讀取 PictureBox 的座標與尺寸
|
||||
LoadPictureBoxZhuYinSongCoordsFromConfig();
|
||||
|
||||
|
||||
// 讀取圖片檔案並載入 Bitmap 物件
|
||||
Bitmap originalImage = new Bitmap(imagePath);
|
||||
|
||||
|
||||
Rectangle displayArea = new Rectangle(pictureBoxZhuYinSongCoords.X, pictureBoxZhuYinSongCoords.Y, pictureBoxZhuYinSongCoords.Width, pictureBoxZhuYinSongCoords.Height);
|
||||
// 設定圖片顯示區域,使用從設定檔讀取的座標與尺寸
|
||||
Rectangle displayArea = new Rectangle(
|
||||
pictureBoxZhuYinSongCoords.X,
|
||||
pictureBoxZhuYinSongCoords.Y,
|
||||
pictureBoxZhuYinSongCoords.Width,
|
||||
pictureBoxZhuYinSongCoords.Height
|
||||
);
|
||||
|
||||
|
||||
// 設定 PictureBox 的圖片
|
||||
pictureBoxZhuYinSongs.Image = originalImage;
|
||||
|
||||
|
||||
ResizeAndPositionPictureBox(pictureBoxZhuYinSongs, displayArea.X, displayArea.Y, displayArea.Width, displayArea.Height);
|
||||
// 調整 PictureBox 的大小與位置,使其符合設定
|
||||
ResizeAndPositionPictureBox(
|
||||
pictureBoxZhuYinSongs,
|
||||
displayArea.X,
|
||||
displayArea.Y,
|
||||
displayArea.Width,
|
||||
displayArea.Height
|
||||
);
|
||||
|
||||
// 顯示 PictureBox
|
||||
pictureBoxZhuYinSongs.Visible = true;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 設定注音歌曲相關的 PictureBox、按鈕和輸入框的可見性。
|
||||
/// </summary>
|
||||
/// <param name="isVisible">若為 true,則顯示這些控件;否則隱藏。</param>
|
||||
private void SetZhuYinSongsAndButtonsVisibility(bool isVisible)
|
||||
{
|
||||
// 定義要執行的操作,設定各控件的可見性
|
||||
System.Action action = () =>
|
||||
{
|
||||
try
|
||||
{
|
||||
// 暫停佈局邏輯,防止在調整控件可見性時觸發不必要的佈局計算,提升性能
|
||||
SuspendLayout();
|
||||
|
||||
// 檢查並設定 pictureBoxZhuYinSongs 的可見性
|
||||
if (pictureBoxZhuYinSongs == null)
|
||||
{
|
||||
Console.WriteLine("pictureBoxZhuYinSongs is null");
|
||||
@ -285,6 +456,7 @@ namespace DualScreenDemo
|
||||
if (isVisible) pictureBoxZhuYinSongs.BringToFront();
|
||||
}
|
||||
|
||||
// 檢查並設定 phoneticButtonsForSongs 陣列中每個按鈕的可見性
|
||||
if (phoneticButtonsForSongs == null)
|
||||
{
|
||||
Console.WriteLine("phoneticButtonsForSongs is null");
|
||||
@ -305,6 +477,7 @@ namespace DualScreenDemo
|
||||
}
|
||||
}
|
||||
|
||||
// 檢查並設定 modifyButtonZhuYinSongs 的可見性
|
||||
if (modifyButtonZhuYinSongs == null)
|
||||
{
|
||||
Console.WriteLine("modifyButtonZhuYinSongs is null");
|
||||
@ -315,6 +488,7 @@ namespace DualScreenDemo
|
||||
if (isVisible) modifyButtonZhuYinSongs.BringToFront();
|
||||
}
|
||||
|
||||
// 檢查並設定 clearButtonZhuYinSongs 的可見性
|
||||
if (clearButtonZhuYinSongs == null)
|
||||
{
|
||||
Console.WriteLine("clearButtonZhuYinSongs is null");
|
||||
@ -325,6 +499,7 @@ namespace DualScreenDemo
|
||||
if (isVisible) clearButtonZhuYinSongs.BringToFront();
|
||||
}
|
||||
|
||||
// 檢查並設定 closeButtonZhuYinSongs 的可見性
|
||||
if (closeButtonZhuYinSongs == null)
|
||||
{
|
||||
Console.WriteLine("closeButtonZhuYinSongs is null");
|
||||
@ -335,6 +510,7 @@ namespace DualScreenDemo
|
||||
if (isVisible) closeButtonZhuYinSongs.BringToFront();
|
||||
}
|
||||
|
||||
// 檢查並設定 inputBoxZhuYinSongs 的可見性
|
||||
if (inputBoxZhuYinSongs == null)
|
||||
{
|
||||
Console.WriteLine("inputBoxZhuYinSongs is null");
|
||||
@ -345,10 +521,12 @@ namespace DualScreenDemo
|
||||
if (isVisible) inputBoxZhuYinSongs.BringToFront();
|
||||
}
|
||||
|
||||
// 恢復佈局邏輯,允許佈局計算
|
||||
ResumeLayout();
|
||||
PerformLayout();
|
||||
// 強制控件立即執行佈局邏輯,確保佈局更新立即生效
|
||||
PerformLayout();
|
||||
|
||||
|
||||
// 刷新各控件,確保其狀態立即更新
|
||||
pictureBoxZhuYinSongs?.Refresh();
|
||||
if (phoneticButtonsForSongs != null)
|
||||
{
|
||||
@ -364,10 +542,12 @@ namespace DualScreenDemo
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 捕捉並輸出異常資訊,方便除錯
|
||||
Console.WriteLine("Error in SetZhuYinSongsAndButtonsVisibility: " + ex.Message);
|
||||
}
|
||||
};
|
||||
|
||||
// 如果當前執行緒需要呼叫 Invoke 方法才能修改控件,則使用 Invoke
|
||||
if (this.InvokeRequired)
|
||||
{
|
||||
this.Invoke(action);
|
||||
@ -377,5 +557,6 @@ namespace DualScreenDemo
|
||||
action();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -28,7 +28,7 @@ namespace DualScreenDemo
|
||||
englishSearchSongButton.BackgroundImage = englishSearchSongActiveBackground;
|
||||
pinyinSearchSongButton.BackgroundImage = pinyinSearchSongNormalBackground;
|
||||
wordCountSearchSongButton.BackgroundImage = wordCountSearchSongNormalBackground;
|
||||
handWritingSearchButton.BackgroundImage = handWritingSearchSongNormalBackground;;
|
||||
handWritingSearchSongButton.BackgroundImage = handWritingSearchSongNormalBackground;
|
||||
numberSearchSongButton.BackgroundImage = numberSearchSongNormalBackground;
|
||||
|
||||
bool shouldBeVisible = !pictureBoxEnglishSongs.Visible;
|
||||
@ -38,13 +38,15 @@ namespace DualScreenDemo
|
||||
string imagePath = Path.Combine(Application.StartupPath, configData["ImagePaths"]["EnglishSongs"]);
|
||||
|
||||
ShowImageOnPictureBoxEnglishSongs(Path.Combine(Application.StartupPath, imagePath));
|
||||
|
||||
SetZhuYinSingersAndButtonsVisibility(false);
|
||||
SetEnglishSingersAndButtonsVisibility(false);
|
||||
SetPinYinSingersAndButtonsVisibility(false);
|
||||
SetHandWritingForSingersAndButtonsVisibility(false);
|
||||
SetZhuYinSongsAndButtonsVisibility(false);
|
||||
// 鍵盤UI介面顯示設定
|
||||
SetWordCountSongsAndButtonsVisibility(false);
|
||||
SetEnglishSongsAndButtonsVisibility(true);
|
||||
SetPinYinSongsAndButtonsVisibility(false);
|
||||
SetHandWritingForSongsAndButtonsVisibility(false);
|
||||
SetSongIDSearchAndButtonsVisibility(false);
|
||||
SetZhuYinSongsAndButtonsVisibility(false);
|
||||
|
||||
ResetinputBox();
|
||||
pictureBoxEnglishSongs.Visible = true;
|
||||
}
|
||||
|
||||
@ -225,6 +227,7 @@ namespace DualScreenDemo
|
||||
{
|
||||
|
||||
pictureBoxEnglishSongs.Visible = false;
|
||||
englishSearchSongButton.BackgroundImage = englishSearchSongNormalBackground;
|
||||
SetEnglishSongsAndButtonsVisibility(false);
|
||||
}
|
||||
|
||||
|
@ -40,15 +40,15 @@ namespace DualScreenDemo
|
||||
|
||||
ShowImageOnPictureBoxHandWritingSongs(Path.Combine(Application.StartupPath, handWritingImagePath));
|
||||
|
||||
SetZhuYinSingersAndButtonsVisibility(false);
|
||||
SetEnglishSingersAndButtonsVisibility(false);
|
||||
SetPinYinSingersAndButtonsVisibility(false);
|
||||
SetHandWritingForSingersAndButtonsVisibility(false);
|
||||
SetZhuYinSongsAndButtonsVisibility(false);
|
||||
// 鍵盤UI介面顯示設定
|
||||
SetWordCountSongsAndButtonsVisibility(false);
|
||||
SetEnglishSongsAndButtonsVisibility(false);
|
||||
SetPinYinSongsAndButtonsVisibility(false);
|
||||
SetHandWritingForSongsAndButtonsVisibility(true);
|
||||
SetSongIDSearchAndButtonsVisibility(false);
|
||||
SetZhuYinSongsAndButtonsVisibility(false);
|
||||
|
||||
ResetinputBox();
|
||||
this.ResumeLayout();
|
||||
}
|
||||
|
||||
@ -295,7 +295,7 @@ namespace DualScreenDemo
|
||||
{
|
||||
|
||||
this.SuspendLayout();
|
||||
|
||||
handWritingSearchSongButton.BackgroundImage = handWritingSearchSongNormalBackground;
|
||||
SetHandWritingForSongsAndButtonsVisibility(false);
|
||||
|
||||
|
||||
|
@ -20,7 +20,9 @@ namespace DualScreenDemo
|
||||
private Button closeButtonPinYinSongs;
|
||||
// 用於顯示輸入文字的輸入框
|
||||
private RichTextBox inputBoxPinYinSongs;
|
||||
// 拼音歌曲搜尋按鈕點擊事件
|
||||
/// <summary>
|
||||
/// 拼音歌曲搜尋按鈕點擊事件
|
||||
/// </summary>
|
||||
private void PinyinSearchSongsButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
// 更新搜尋模式按鈕的背景圖
|
||||
@ -38,14 +40,20 @@ namespace DualScreenDemo
|
||||
ShowImageOnPictureBoxPinYinSongs(Path.Combine(Application.StartupPath, pinyinImagePath));
|
||||
|
||||
|
||||
// 設定不同模式的 UI 顯示
|
||||
SetZhuYinSingersAndButtonsVisibility(false);
|
||||
SetEnglishSingersAndButtonsVisibility(false);
|
||||
SetPinYinSingersAndButtonsVisibility(false);
|
||||
// 鍵盤UI介面顯示設定
|
||||
SetWordCountSongsAndButtonsVisibility(false);
|
||||
SetEnglishSongsAndButtonsVisibility(false);
|
||||
SetPinYinSongsAndButtonsVisibility(true);
|
||||
SetHandWritingForSongsAndButtonsVisibility(false);
|
||||
SetSongIDSearchAndButtonsVisibility(false);
|
||||
SetZhuYinSongsAndButtonsVisibility(false);
|
||||
|
||||
ResetinputBox();
|
||||
pictureBoxPinYinSongs.Visible = true;
|
||||
}
|
||||
// 初始化拼音按鈕
|
||||
/// <summary>
|
||||
/// 初始化拼音按鈕
|
||||
/// </summary>
|
||||
private void InitializeLetterButtonsForPinYinSongs()
|
||||
{
|
||||
// 從設定檔 (config.ini) 讀取配置數據
|
||||
@ -83,7 +91,11 @@ namespace DualScreenDemo
|
||||
this.Controls.Add(letterButtonsForPinYinSongs[i]);
|
||||
}
|
||||
}
|
||||
// 處理拼音按鈕點擊事件
|
||||
/// <summary>
|
||||
/// 處理拼音按鈕點擊事件
|
||||
/// </summary>
|
||||
/// <param name="sender">觸發事件按鈕</param>
|
||||
/// <param name="e">事件參數</param>
|
||||
private void LetterButtonPinYinSongs_Click(object sender, EventArgs e)
|
||||
{
|
||||
// 嘗試將觸發事件的物件轉換為 Button 類型
|
||||
@ -101,43 +113,55 @@ namespace DualScreenDemo
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化拼音輸入相關的 UI 控件,包括字母按鈕、特殊功能按鈕(修改、清除、關閉),以及拼音輸入框。
|
||||
/// </summary>
|
||||
private void InitializeButtonsForPinYinSongs()
|
||||
{
|
||||
// 初始化拼音字母按鈕,根據 QWERTY 鍵盤佈局建立對應的按鈕
|
||||
InitializeLetterButtonsForPinYinSongs();
|
||||
|
||||
// 初始化特殊功能按鈕,包括修改、清除和關閉按鈕
|
||||
// 初始化特殊功能按鈕(修改、清除、關閉)
|
||||
InitializeSpecialButtonsForPinYinSongs();
|
||||
|
||||
// 初始化拼音輸入框,讓使用者可以輸入拼音來搜尋歌曲
|
||||
// 初始化拼音輸入框,使用者可透過輸入拼音來搜尋歌曲
|
||||
InitializeInputBoxPinYinSongs();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化拼音輸入的特殊功能按鈕,包括:
|
||||
/// <para>1. 修改按鈕 - 刪除輸入框中的最後一個字母</para>
|
||||
/// <para>2. 清除按鈕 - 清空輸入框的內容</para>
|
||||
/// <para>3. 關閉按鈕 - 隱藏拼音輸入的 UI 元件</para>
|
||||
/// </summary>
|
||||
private void InitializeSpecialButtonsForPinYinSongs()
|
||||
{
|
||||
|
||||
// 初始化「修改」按鈕,讓使用者可以刪除輸入框中的最後一個字母
|
||||
// 初始化「修改」按鈕(刪除輸入框最後一個字母)
|
||||
InitializeModifyButtonPinYinSongs();
|
||||
|
||||
// 初始化「清除」按鈕,讓使用者可以清空輸入框的內容
|
||||
// 初始化「清除」按鈕(清空輸入框內容)
|
||||
InitializeClearButtonPinYinSongs();
|
||||
|
||||
// 初始化「關閉」按鈕,讓使用者可以關閉拼音輸入的 UI 元件
|
||||
// 初始化「關閉」按鈕(關閉拼音輸入 UI)
|
||||
InitializeCloseButtonPinYinSongs();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 初始化「修改」按鈕,提供刪除拼音輸入框最後一個字母的功能。
|
||||
/// </summary>
|
||||
private void InitializeModifyButtonPinYinSongs()
|
||||
{
|
||||
// 載入設定檔資料,取得特殊按鈕的相關配置
|
||||
// 讀取設定檔,載入特殊按鈕的配置資料
|
||||
var data = LoadConfigData();
|
||||
|
||||
// 從設定檔讀取「修改按鈕」的座標位置與大小
|
||||
// 從設定檔取得「修改按鈕」的座標與大小
|
||||
modifyButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "modifyButtonPinYinSongs");
|
||||
|
||||
// 從設定檔讀取「修改按鈕」的不同狀態圖片 (一般、滑鼠懸停、按下)
|
||||
// 讀取「修改按鈕」的圖片資源(一般狀態、滑鼠懸停、按下)
|
||||
var buttonImages = LoadButtonImages(data, "ModifyButtonImagesPinYin");
|
||||
|
||||
// 創建「修改按鈕」,並綁定點擊事件
|
||||
// 創建「修改」按鈕,並綁定點擊事件
|
||||
modifyButtonPinYinSongs = CreateSpecialButton(
|
||||
"btnModifyPinYinSongs", // 按鈕名稱
|
||||
modifyButtonPinYinCoords, // 設定按鈕的座標與大小
|
||||
@ -146,43 +170,51 @@ namespace DualScreenDemo
|
||||
buttonImages.mouseDown, // 設定按鈕的按下狀態圖片
|
||||
ModifyButtonPinYinSongs_Click // 綁定按鈕的點擊事件處理函式
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 「修改」按鈕點擊事件:刪除拼音輸入框 (inputBoxPinYinSongs) 中的最後一個字母。
|
||||
/// </summary>
|
||||
private void ModifyButtonPinYinSongs_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
// 檢查 `inputBoxPinYinSongs` 是否已被加入到 `Controls` 集合中 (確保輸入框存在)
|
||||
// 確保 inputBoxPinYinSongs 存在於視窗控制項集合內,且輸入框內有文字
|
||||
if (this.Controls.Contains(inputBoxPinYinSongs) && inputBoxPinYinSongs.Text.Length > 0)
|
||||
{
|
||||
// 若 `inputBoxPinYinSongs` 有內容,刪除最後一個字母
|
||||
// 刪除輸入框內的最後一個字母
|
||||
inputBoxPinYinSongs.Text = inputBoxPinYinSongs.Text.Substring(0, inputBoxPinYinSongs.Text.Length - 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 初始化「清除」按鈕 (clearButtonPinYinSongs),用於清空拼音輸入框 (inputBoxPinYinSongs)。
|
||||
/// </summary>
|
||||
private void InitializeClearButtonPinYinSongs()
|
||||
{
|
||||
// 從設定檔載入資料
|
||||
var data = LoadConfigData();
|
||||
|
||||
// 讀取清除按鈕的座標配置 (X, Y, Width, Height)
|
||||
// 讀取「清除」按鈕的座標配置 (X, Y, Width, Height)
|
||||
clearButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "clearButtonPinYinSongs");
|
||||
|
||||
// 載入清除按鈕的圖片 (一般狀態、滑鼠懸停、按下時的圖片)
|
||||
// 載入「清除」按鈕的圖片 (一般狀態、滑鼠懸停、按下時的圖片)
|
||||
var buttonImages = LoadButtonImages(data, "ClearButtonImagesPinYin");
|
||||
|
||||
// 建立「清除按鈕」並指定對應的座標與圖片
|
||||
// 建立「清除」按鈕,設定對應的座標與圖片,並綁定點擊事件
|
||||
clearButtonPinYinSongs = CreateSpecialButton(
|
||||
"btnClearPinYinSongs", // 按鈕名稱
|
||||
clearButtonPinYinCoords, // 按鈕的座標與大小
|
||||
buttonImages.normal, // 按鈕的普通狀態圖片
|
||||
buttonImages.mouseOver, // 滑鼠懸停時的圖片
|
||||
buttonImages.mouseDown, // 滑鼠按下時的圖片
|
||||
ClearButtonPinYinSongs_Click // 點擊事件處理函式
|
||||
clearButtonPinYinCoords, // 設定按鈕的座標與大小
|
||||
buttonImages.normal, // 設定按鈕的正常狀態圖片
|
||||
buttonImages.mouseOver, // 設定按鈕的滑鼠懸停圖片
|
||||
buttonImages.mouseDown, // 設定按鈕的按下狀態圖片
|
||||
ClearButtonPinYinSongs_Click // 綁定按鈕的點擊事件處理函式
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清空拼音輸入框的內容。
|
||||
/// 當使用者點擊清除按鈕時,若輸入框存在且有內容,則將其清空。
|
||||
/// </summary>
|
||||
private void ClearButtonPinYinSongs_Click(object sender, EventArgs e)
|
||||
{
|
||||
// 檢查視窗內是否包含 inputBoxPinYinSongs 控制項,且輸入框內是否有文字
|
||||
@ -193,38 +225,48 @@ namespace DualScreenDemo
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化「關閉」按鈕 (closeButtonPinYinSongs),用於隱藏拼音輸入介面。
|
||||
/// </summary>
|
||||
private void InitializeCloseButtonPinYinSongs()
|
||||
{
|
||||
// 讀取設定檔中的按鈕配置數據
|
||||
var data = LoadConfigData();
|
||||
|
||||
// 從設定檔中取得「關閉」按鈕的座標
|
||||
// 從設定檔中取得「關閉」按鈕的座標 (X, Y, Width, Height)
|
||||
closeButtonPinYinCoords = LoadSpecialButtonCoordinates(data, "SpecialButtonCoordinates", "closeButtonPinYinSongs");
|
||||
|
||||
// 從設定檔中讀取「關閉」按鈕的圖片
|
||||
// 從設定檔中讀取「關閉」按鈕的圖片 (一般狀態、滑鼠懸停、按下時的圖片)
|
||||
var buttonImages = LoadButtonImages(data, "CloseButtonImagesPinYin");
|
||||
|
||||
// 建立「關閉」按鈕,並設定名稱、座標、按鈕圖片及點擊事件
|
||||
// 建立「關閉」按鈕,設定名稱、座標、圖片及點擊事件
|
||||
closeButtonPinYinSongs = CreateSpecialButton(
|
||||
"btnClosePinYinSongs", // 按鈕名稱
|
||||
closeButtonPinYinCoords, // 按鈕座標 (X, Y, Width, Height)
|
||||
buttonImages.normal, // 按鈕的普通狀態圖片
|
||||
buttonImages.mouseOver, // 滑鼠懸停時的圖片
|
||||
buttonImages.mouseDown, // 按下時的圖片
|
||||
CloseButtonPinYinSongs_Click // 點擊事件處理函式
|
||||
"btnClosePinYinSongs", // 按鈕名稱
|
||||
closeButtonPinYinCoords, // 設定按鈕的座標與大小
|
||||
buttonImages.normal, // 設定按鈕的正常狀態圖片
|
||||
buttonImages.mouseOver, // 設定按鈕的滑鼠懸停圖片
|
||||
buttonImages.mouseDown, // 設定按鈕的按下狀態圖片
|
||||
CloseButtonPinYinSongs_Click // 綁定按鈕的點擊事件處理函式
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 關閉拼音輸入模式,隱藏相關 UI 元件。
|
||||
/// </summary>
|
||||
/// <param name="sender">觸發事件的按鈕。</param>
|
||||
/// <param name="e">事件參數。</param>
|
||||
private void CloseButtonPinYinSongs_Click(object sender, EventArgs e)
|
||||
{
|
||||
// 隱藏拼音輸入的背景圖片 (可能是 UI 中的輸入框背景)
|
||||
pictureBoxPinYinSongs.Visible = false;
|
||||
pinyinSearchSongButton.BackgroundImage = pinyinSearchSongNormalBackground;
|
||||
// 設定拼音輸入框與所有相關按鈕的可見性為 false
|
||||
SetPinYinSongsAndButtonsVisibility(false);
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化拼音輸入框 (RichTextBox),並從 config.ini 讀取相關設定。
|
||||
/// </summary>
|
||||
private void InitializeInputBoxPinYinSongs()
|
||||
{
|
||||
try
|
||||
@ -233,31 +275,31 @@ namespace DualScreenDemo
|
||||
var parser = new FileIniDataParser();
|
||||
|
||||
// 配置解析器的參數
|
||||
parser.Parser.Configuration.AssigmentSpacer = ""; // 設定 `=` 兩側沒有空格
|
||||
parser.Parser.Configuration.CommentString = "#"; // 使用 `#` 作為註解符號
|
||||
parser.Parser.Configuration.AssigmentSpacer = ""; // 設定 = 兩側沒有空格
|
||||
parser.Parser.Configuration.CommentString = "#"; // 使用 # 作為註解符號
|
||||
parser.Parser.Configuration.CaseInsensitive = true; // 參數名稱不區分大小寫
|
||||
|
||||
IniData data; // 儲存解析後的 INI 數據
|
||||
|
||||
// 讀取 `config.ini` 文件,使用 UTF-8 編碼
|
||||
// 讀取 config.ini 文件,使用 UTF-8 編碼
|
||||
using (var reader = new StreamReader("config.ini", System.Text.Encoding.UTF8))
|
||||
{
|
||||
data = parser.ReadData(reader);
|
||||
}
|
||||
|
||||
// 從 INI 檔案讀取拼音輸入框的位置與大小
|
||||
// **從 INI 檔案讀取拼音輸入框的位置與大小**
|
||||
int x = int.Parse(data["InputBoxPinYinSongs"]["X"]); // X 座標
|
||||
int y = int.Parse(data["InputBoxPinYinSongs"]["Y"]); // Y 座標
|
||||
int width = int.Parse(data["InputBoxPinYinSongs"]["Width"]); // 寬度
|
||||
int height = int.Parse(data["InputBoxPinYinSongs"]["Height"]); // 高度
|
||||
|
||||
// 讀取字型設定
|
||||
// **讀取字型設定**
|
||||
string fontName = data["InputBoxPinYinSongs"]["FontName"]; // 字型名稱
|
||||
float fontSize = float.Parse(data["InputBoxPinYinSongs"]["FontSize"]); // 字體大小
|
||||
FontStyle fontStyle = (FontStyle)Enum.Parse(typeof(FontStyle), data["InputBoxPinYinSongs"]["FontStyle"]); // 字體樣式
|
||||
Color foreColor = Color.FromName(data["InputBoxPinYinSongs"]["ForeColor"]); // 文字顏色
|
||||
|
||||
// 創建拼音輸入框 (`RichTextBox`)
|
||||
// 創建拼音輸入框 (RichTextBox)
|
||||
inputBoxPinYinSongs = new RichTextBox
|
||||
{
|
||||
Visible = false, // 預設為隱藏
|
||||
@ -273,7 +315,7 @@ namespace DualScreenDemo
|
||||
// 設定輸入框的位置與大小
|
||||
ResizeAndPositionControl(inputBoxPinYinSongs, x, y, width, height);
|
||||
|
||||
// 綁定 `TextChanged` 事件 (當輸入內容改變時觸發搜尋)
|
||||
// **綁定 TextChanged 事件 (當輸入內容改變時觸發搜尋)**
|
||||
inputBoxPinYinSongs.TextChanged += (sender, e) =>
|
||||
{
|
||||
string searchText = inputBoxPinYinSongs.Text;
|
||||
@ -298,23 +340,34 @@ namespace DualScreenDemo
|
||||
// 發生錯誤時輸出錯誤訊息 (避免程式崩潰)
|
||||
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;
|
||||
|
||||
/// <summary>
|
||||
/// 從 config.ini 配置檔案中載入 PictureBoxPinYinSongs 的座標與尺寸設定。
|
||||
/// </summary>
|
||||
private void LoadPictureBoxPinYinSongCoordsFromConfig()
|
||||
{
|
||||
// 創建一個 INI 檔案解析器
|
||||
var parser = new FileIniDataParser();
|
||||
|
||||
// 讀取 `config.ini` 文件並解析成 `IniData` 對象
|
||||
// 讀取 config.ini 文件並解析成 IniData 對象
|
||||
IniData data = parser.ReadFile("config.ini");
|
||||
|
||||
// 取得 `PictureBoxPinYinSongs` 區段的設定值
|
||||
// 取得 PictureBoxPinYinSongs 區段的設定值
|
||||
var coords = data["PictureBoxPinYinSongs"];
|
||||
|
||||
// 解析 `X`, `Y`, `Width`, `Height`,並存入 `pictureBoxPinYinSongCoords`
|
||||
// 解析 X, Y, Width, Height,並存入 pictureBoxPinYinSongCoords
|
||||
pictureBoxPinYinSongCoords = (
|
||||
int.Parse(coords["X"]), // 解析 X 座標
|
||||
int.Parse(coords["Y"]), // 解析 Y 座標
|
||||
@ -322,7 +375,10 @@ namespace DualScreenDemo
|
||||
int.Parse(coords["Height"]) // 解析 高度
|
||||
);
|
||||
}
|
||||
// 顯示拼音歌曲圖片
|
||||
/// <summary>
|
||||
/// 顯示拼音歌曲圖片
|
||||
/// </summary>
|
||||
/// <param name="imagePath">圖片路徑</param>
|
||||
private void ShowImageOnPictureBoxPinYinSongs(string imagePath)
|
||||
{
|
||||
// 從設定檔載入 PictureBox 的座標與大小
|
||||
@ -339,10 +395,10 @@ namespace DualScreenDemo
|
||||
pictureBoxPinYinSongCoords.Height // 設定 高度
|
||||
);
|
||||
|
||||
// 將載入的圖片設定為 `pictureBoxPinYinSongs` 的影像
|
||||
// 將載入的圖片設定為 pictureBoxPinYinSongs 的影像
|
||||
pictureBoxPinYinSongs.Image = originalImage;
|
||||
|
||||
// 調整 `PictureBox` 的大小與位置,使其符合 `displayArea` 的設定
|
||||
// 調整 PictureBox 的大小與位置,使其符合 displayArea 的設定
|
||||
ResizeAndPositionPictureBox(
|
||||
pictureBoxPinYinSongs,
|
||||
displayArea.X,
|
||||
@ -351,11 +407,14 @@ namespace DualScreenDemo
|
||||
displayArea.Height
|
||||
);
|
||||
|
||||
// 顯示 `PictureBox`
|
||||
// 顯示 PictureBox
|
||||
pictureBoxPinYinSongs.Visible = true;
|
||||
|
||||
}
|
||||
// 設定拼音模式的 UI 是否可見
|
||||
/// <summary>
|
||||
/// 設定拼音模式的 UI 是否可見
|
||||
/// </summary>
|
||||
/// <param name="isVisible">是否可見</param>
|
||||
private void SetPinYinSongsAndButtonsVisibility(bool isVisible)
|
||||
{
|
||||
// 定義一個委派 (Action),用於更新 UI 控件的可見性
|
||||
@ -364,7 +423,7 @@ namespace DualScreenDemo
|
||||
// 暫停佈局更新,以防止 UI 閃爍或重繪時出現異常
|
||||
SuspendLayout();
|
||||
|
||||
// 設定 `pictureBoxPinYinSongs` 的可見性
|
||||
// 設定 pictureBoxPinYinSongs 的可見性
|
||||
pictureBoxPinYinSongs.Visible = isVisible;
|
||||
if (isVisible) pictureBoxPinYinSongs.BringToFront(); // 確保顯示時位於最前方
|
||||
|
||||
@ -375,25 +434,25 @@ namespace DualScreenDemo
|
||||
if (isVisible) button.BringToFront();
|
||||
}
|
||||
|
||||
// 設定 `modifyButtonPinYinSongs` (修改按鈕) 的可見性
|
||||
// 設定 modifyButtonPinYinSongs (修改按鈕) 的可見性
|
||||
if (modifyButtonPinYinSongs != null)
|
||||
{
|
||||
modifyButtonPinYinSongs.Visible = isVisible;
|
||||
if (isVisible) modifyButtonPinYinSongs.BringToFront();
|
||||
}
|
||||
|
||||
// 設定 `clearButtonPinYinSongs` (清除按鈕) 的可見性
|
||||
// 設定 clearButtonPinYinSongs (清除按鈕) 的可見性
|
||||
if (clearButtonPinYinSongs != null)
|
||||
{
|
||||
clearButtonPinYinSongs.Visible = isVisible;
|
||||
if (isVisible) clearButtonPinYinSongs.BringToFront();
|
||||
}
|
||||
|
||||
// 設定 `closeButtonPinYinSongs` (關閉按鈕) 的可見性
|
||||
// 設定 closeButtonPinYinSongs (關閉按鈕) 的可見性
|
||||
closeButtonPinYinSongs.Visible = isVisible;
|
||||
if (isVisible) closeButtonPinYinSongs.BringToFront();
|
||||
|
||||
// 設定 `inputBoxPinYinSongs` (輸入框) 的可見性
|
||||
// 設定 inputBoxPinYinSongs (輸入框) 的可見性
|
||||
inputBoxPinYinSongs.Visible = isVisible;
|
||||
if (isVisible) inputBoxPinYinSongs.BringToFront();
|
||||
|
||||
@ -401,7 +460,7 @@ namespace DualScreenDemo
|
||||
ResumeLayout();
|
||||
PerformLayout();
|
||||
|
||||
// 刷新 `pictureBoxPinYinSongs`,確保畫面更新
|
||||
// 刷新 pictureBoxPinYinSongs,確保畫面更新
|
||||
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
|
||||
{
|
||||
/* 建構子創立,程式進入初始位置,所有搜尋初始化設置 */
|
||||
/*
|
||||
* 主要視窗 (PrimaryForm) 的部分定義
|
||||
* 負責初始化搜尋按鈕並處理歌曲搜尋 UI 相關邏輯
|
||||
*/
|
||||
public partial class PrimaryForm
|
||||
{
|
||||
// 各種歌曲搜尋按鈕及其對應的背景圖片 (一般狀態 / 啟動狀態)
|
||||
private Button zhuyinSearchSongButton;
|
||||
private Bitmap zhuyinSearchSongNormalBackground;
|
||||
private Bitmap zhuyinSearchSongActiveBackground;
|
||||
@ -26,8 +30,15 @@ namespace DualScreenDemo
|
||||
private Bitmap numberSearchSongNormalBackground;
|
||||
private Bitmap numberSearchSongActiveBackground;
|
||||
|
||||
/// <summary>
|
||||
/// 點擊「歌曲搜尋」按鈕時的事件處理函式
|
||||
/// 1. 更新導航按鈕的背景圖片,使「歌曲搜尋」按鈕顯示為啟動狀態
|
||||
/// 2. 隱藏其他搜尋/分類 UI,僅顯示歌曲搜尋選單
|
||||
/// 3. 若有 QR Code 顯示,則將其隱藏
|
||||
/// </summary>
|
||||
private void SongSearchButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
// 更新導航按鈕的背景圖片
|
||||
newSongAlertButton.BackgroundImage = newSongAlertNormalBackground;
|
||||
hotPlayButton.BackgroundImage = hotPlayNormalBackground;
|
||||
singerSearchButton.BackgroundImage = singerSearchNormalBackground;
|
||||
@ -41,7 +52,7 @@ namespace DualScreenDemo
|
||||
deliciousFoodButton.BackgroundImage = deliciousFoodNormalBackground;
|
||||
isOnOrderedSongsPage = false;
|
||||
|
||||
|
||||
// 隱藏其他 UI
|
||||
SetHotSongButtonsVisibility(false);
|
||||
SetNewSongButtonsVisibility(false);
|
||||
SetSingerSearchButtonsVisibility(false);
|
||||
@ -51,14 +62,15 @@ namespace DualScreenDemo
|
||||
SetZhuYinSingersAndButtonsVisibility(false);
|
||||
SetZhuYinSongsAndButtonsVisibility(false);
|
||||
SetEnglishSingersAndButtonsVisibility(false);
|
||||
|
||||
SetPinYinSingersAndButtonsVisibility(false);
|
||||
SetPinYinSongsAndButtonsVisibility(false);
|
||||
SetPictureBoxToggleLightAndButtonsVisibility(false);
|
||||
SetPictureBoxSceneSoundEffectsAndButtonsVisibility(false);
|
||||
|
||||
// 顯示歌曲搜尋選單按鈕
|
||||
SetSongSearchButtonsVisibility(true);
|
||||
|
||||
|
||||
// 隱藏 QR Code (若有)
|
||||
if (pictureBoxQRCode != null)
|
||||
{
|
||||
pictureBoxQRCode.Visible = false;
|
||||
@ -66,12 +78,25 @@ namespace DualScreenDemo
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 設定「歌曲搜尋」相關按鈕的可見性
|
||||
/// </summary>
|
||||
/// <param name="isVisible">是否顯示</param>
|
||||
private void SetSongSearchButtonsVisibility(bool isVisible)
|
||||
{
|
||||
pictureBox4.Visible = isVisible;
|
||||
pictureBox4.Visible = isVisible; // 控制搜尋 UI 背景的可見性
|
||||
|
||||
Button[] songSearchButtons = { zhuyinSearchSongButton, englishSearchSongButton, wordCountSearchSongButton, pinyinSearchSongButton, handWritingSearchSongButton, numberSearchSongButton };
|
||||
// 歌曲搜尋的按鈕陣列
|
||||
Button[] songSearchButtons = {
|
||||
zhuyinSearchSongButton,
|
||||
englishSearchSongButton,
|
||||
wordCountSearchSongButton,
|
||||
pinyinSearchSongButton,
|
||||
handWritingSearchSongButton,
|
||||
numberSearchSongButton
|
||||
};
|
||||
|
||||
// 設定按鈕可見性,若顯示則移至最前
|
||||
foreach (var button in songSearchButtons)
|
||||
{
|
||||
button.Visible = isVisible;
|
||||
@ -82,25 +107,41 @@ namespace DualScreenDemo
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化所有「歌曲搜尋」按鈕
|
||||
/// 依據不同的搜尋方式 (注音、英文、拼音、筆劃、手寫、數字) 建立對應按鈕
|
||||
/// </summary>
|
||||
private void InitializeButtonsForSongSearch()
|
||||
{
|
||||
|
||||
InitializeSearchButton(ref zhuyinSearchSongButton, "zhuyinSearchSongButton", 1214, 230, 209, 59, ref zhuyinSearchSongNormalBackground, ref zhuyinSearchSongActiveBackground, normalStateImageSongQuery, mouseDownImageSongQuery, ZhuyinSearchSongsButton_Click);
|
||||
// 初始化「注音搜尋」按鈕
|
||||
InitializeSearchButton(ref zhuyinSearchSongButton, "zhuyinSearchSongButton",
|
||||
1214, 230, 209, 59, ref zhuyinSearchSongNormalBackground, ref zhuyinSearchSongActiveBackground,
|
||||
normalStateImageSongQuery, mouseDownImageSongQuery, ZhuyinSearchSongsButton_Click);
|
||||
|
||||
|
||||
InitializeSearchButton(ref englishSearchSongButton, "englishSearchSongButton", 1214, 293, 209, 58, ref englishSearchSongNormalBackground, ref englishSearchSongActiveBackground, normalStateImageSongQuery, mouseDownImageSongQuery, EnglishSearchSongsButton_Click);
|
||||
// 初始化「英文搜尋」按鈕
|
||||
InitializeSearchButton(ref englishSearchSongButton, "englishSearchSongButton",
|
||||
1214, 293, 209, 58, ref englishSearchSongNormalBackground, ref englishSearchSongActiveBackground,
|
||||
normalStateImageSongQuery, mouseDownImageSongQuery, EnglishSearchSongsButton_Click);
|
||||
|
||||
|
||||
InitializeSearchButton(ref pinyinSearchSongButton, "pinyinSearchSongButton", 1214, 356, 209, 58, ref pinyinSearchSongNormalBackground, ref pinyinSearchSongActiveBackground, normalStateImageSongQuery, mouseDownImageSongQuery, PinyinSearchSongsButton_Click);
|
||||
// 初始化「拼音搜尋」按鈕
|
||||
InitializeSearchButton(ref pinyinSearchSongButton, "pinyinSearchSongButton",
|
||||
1214, 356, 209, 58, ref pinyinSearchSongNormalBackground, ref pinyinSearchSongActiveBackground,
|
||||
normalStateImageSongQuery, mouseDownImageSongQuery, PinyinSearchSongsButton_Click);
|
||||
|
||||
|
||||
InitializeSearchButton(ref wordCountSearchSongButton, "wordCountSearchSongButton", 1214, 418, 209, 59, ref wordCountSearchSongNormalBackground, ref wordCountSearchSongActiveBackground, normalStateImageSongQuery, mouseDownImageSongQuery, WordCountSearchSong_Click);
|
||||
// 初始化「筆劃搜尋」按鈕
|
||||
InitializeSearchButton(ref wordCountSearchSongButton, "wordCountSearchSongButton",
|
||||
1214, 418, 209, 59, ref wordCountSearchSongNormalBackground, ref wordCountSearchSongActiveBackground,
|
||||
normalStateImageSongQuery, mouseDownImageSongQuery, WordCountSearchSongsButton_Click);
|
||||
|
||||
|
||||
InitializeSearchButton(ref handWritingSearchSongButton, "handWritingSearchSongButton", 1214, 481, 209, 59, ref handWritingSearchSongNormalBackground, ref handWritingSearchSongActiveBackground, normalStateImageSongQuery, mouseDownImageSongQuery, HandWritingSearchButtonForSongs_Click);
|
||||
// 初始化「手寫搜尋」按鈕
|
||||
InitializeSearchButton(ref handWritingSearchSongButton, "handWritingSearchSongButton",
|
||||
1214, 481, 209, 59, ref handWritingSearchSongNormalBackground, ref handWritingSearchSongActiveBackground,
|
||||
normalStateImageSongQuery, mouseDownImageSongQuery, HandWritingSearchButtonForSongs_Click);
|
||||
|
||||
|
||||
InitializeSearchButton(ref numberSearchSongButton, "numberSearchSongButton", 1214, 544, 209, 58, ref numberSearchSongNormalBackground, ref numberSearchSongActiveBackground, normalStateImageSongQuery, mouseDownImageSongQuery, NumberSearchButton2_Click);
|
||||
// 初始化「數字搜尋」按鈕
|
||||
InitializeSearchButton(ref numberSearchSongButton, "numberSearchSongButton",
|
||||
1214, 544, 209, 58, ref numberSearchSongNormalBackground, ref numberSearchSongActiveBackground,
|
||||
normalStateImageSongQuery, mouseDownImageSongQuery, SongIDSearchSongsButton_Click);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
46
Program.cs
@ -32,6 +32,7 @@ using Microsoft.Ink;
|
||||
using Microsoft.Win32;
|
||||
using System.Diagnostics;
|
||||
using DualScreenDemo;
|
||||
using DBObj;
|
||||
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
@ -56,19 +57,6 @@ static void Main()
|
||||
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; // 使用单例
|
||||
@ -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()
|
||||
{
|
||||
if (Screen.AllScreens.Length > 1)
|
||||
|
BIN
References.zip
@ -106,7 +106,7 @@ namespace DualScreenDemo
|
||||
}
|
||||
catch (Exception processEx)
|
||||
{
|
||||
// Console.WriteLine($"處理資料時發生錯誤: {processEx.Message}");
|
||||
Console.WriteLine($"處理資料時發生錯誤: {processEx.Message}");
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -117,7 +117,7 @@ namespace DualScreenDemo
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// Console.WriteLine($"接收資料時發生錯誤: {ex.Message}");
|
||||
Console.WriteLine($"接收資料時發生錯誤: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
@ -137,7 +137,7 @@ namespace DualScreenDemo
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// Console.WriteLine($"關閉串列埠時發生錯誤: {ex.Message}");
|
||||
Console.WriteLine($"關閉串列埠時發生錯誤: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
71
TCPServer.cs
@ -8,7 +8,8 @@ using System.Threading.Tasks;
|
||||
using System.IO; // 為 Path 和 File 提供支持
|
||||
using System.Windows.Forms; // 為 Invoke 和 Form 控件提供支持
|
||||
using System.Collections.Generic;
|
||||
|
||||
using DBObj;
|
||||
using OverlayFormObj;
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
public class TCPServer
|
||||
@ -16,7 +17,7 @@ namespace DualScreenDemo
|
||||
private TcpListener listener;
|
||||
private const int Port = 1000;
|
||||
private readonly string hostNameSuffix;
|
||||
private bool isProcessingCommand = false;
|
||||
//private bool isProcessingCommand = false;
|
||||
|
||||
|
||||
public TCPServer()
|
||||
@ -81,14 +82,18 @@ namespace DualScreenDemo
|
||||
Console.WriteLine("Failed to invoke action after maximum retries");
|
||||
}
|
||||
|
||||
public void Start()
|
||||
public void Start()
|
||||
{
|
||||
// 啟動 TCP 監聽器
|
||||
listener.Start();
|
||||
Console.WriteLine("Server started on port " + Port + ".");
|
||||
|
||||
try {
|
||||
// 讀取初始狀態檔案
|
||||
string stateFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "states.txt");
|
||||
string initialState = ReadStateFile(stateFilePath);
|
||||
|
||||
// 若初始狀態為 "CLOSE",則顯示送客畫面,並禁用所有主畫面的控制項
|
||||
if (initialState.Equals("CLOSE", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
_ = SafeInvoke(PrimaryForm.Instance, () =>
|
||||
@ -106,14 +111,17 @@ namespace DualScreenDemo
|
||||
});
|
||||
}
|
||||
|
||||
// 不斷等待並處理 TCP 連線
|
||||
while (true)
|
||||
{
|
||||
Console.WriteLine("Waiting for connections...");
|
||||
|
||||
using (TcpClient client = listener.AcceptTcpClient())
|
||||
{
|
||||
Console.WriteLine("Connected!");
|
||||
NetworkStream stream = client.GetStream();
|
||||
|
||||
// 處理來自 client 的指令
|
||||
while (client.Connected)
|
||||
{
|
||||
byte[] buffer = new byte[1024];
|
||||
@ -124,16 +132,20 @@ namespace DualScreenDemo
|
||||
string request = Encoding.UTF8.GetString(buffer, 0, bytesRead);
|
||||
Console.WriteLine("Received: " + request.Trim());
|
||||
|
||||
// 忽略長度太短的請求
|
||||
if (request.Length < 5)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// 解析 host 名稱字尾與指令本體
|
||||
string requestHostSuffix = request.Substring(0, 3);
|
||||
string command = request.Substring(4);
|
||||
|
||||
// 比對主機名稱是否符合
|
||||
if (requestHostSuffix.Equals(hostNameSuffix, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
// 指令為 "X":播放 CLOSE.MPG,並顯示送客畫面
|
||||
if (command.Trim().Equals("X", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
_ = SafeInvoke(VideoPlayerForm.Instance, async () =>
|
||||
@ -143,33 +155,46 @@ namespace DualScreenDemo
|
||||
await SafeInvoke(PrimaryForm.Instance, () =>
|
||||
{
|
||||
PrimaryForm.Instance.ShowSendOffScreen();
|
||||
|
||||
PrimaryForm.Instance.HideFireScreen();
|
||||
string marqueeMessage= "歡迎使用網路版系統,與你共度美好時光。";
|
||||
OverlayForm.MainForm.UpdateMarqueeText(marqueeMessage, OverlayForm.MarqueeStartPosition.Middle, Color.White);
|
||||
Console.WriteLine("開始設置新的播放列表");
|
||||
|
||||
|
||||
string closePath = @"C:\video\CLOSE.MPG";
|
||||
|
||||
if (File.Exists(closePath))
|
||||
{
|
||||
// 建立結束播放用的 SongData 實例
|
||||
SongData closeSong = new SongData(
|
||||
"", "", "結束播放", 0, "", "", "", "",
|
||||
DateTime.Now, closePath, "", "", "", "",
|
||||
"", "", "", "", "", "", "", 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)
|
||||
{
|
||||
VideoPlayerForm.playingSongList.Add(VideoPlayerForm.Instance.currentPlayingSong);
|
||||
}
|
||||
|
||||
VideoPlayerForm.publicPlaylist.Add(closeSong);
|
||||
// 將 CLOSE.MPG 加入播放清單
|
||||
VideoPlayerForm.playingSongList.Add(closeSong);
|
||||
|
||||
// 清空使用者點播清單
|
||||
PrimaryForm.userRequestedSongs = new List<SongData>();
|
||||
|
||||
// 隱藏 Overlay 的「下一首提示」
|
||||
if (IsFormReady(OverlayForm.MainForm))
|
||||
{
|
||||
OverlayForm.MainForm.nextSongLabel.Visible = false;
|
||||
}
|
||||
|
||||
VideoPlayerForm.Instance.PlayNextSong();
|
||||
Console.WriteLine("已設置新的播放列表,包含當前歌曲和 CLOSE.MPG");
|
||||
}
|
||||
else
|
||||
@ -180,22 +205,47 @@ namespace DualScreenDemo
|
||||
}
|
||||
});
|
||||
|
||||
// 更新狀態檔案為 CLOSE
|
||||
UpdateStateFile(stateFilePath, "CLOSE");
|
||||
continue;
|
||||
}
|
||||
|
||||
// 指令為 "O":開啟系統,隱藏送客畫面
|
||||
if (command.Trim().Equals("O", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
_ = SafeInvoke(PrimaryForm.Instance, () =>
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
// 若 Overlay Form 準備好,嘗試顯示跑馬燈文字
|
||||
if (IsFormReady(OverlayForm.MainForm))
|
||||
{
|
||||
string message = request.Trim();
|
||||
@ -206,18 +256,21 @@ namespace DualScreenDemo
|
||||
{
|
||||
if (match.Success)
|
||||
{
|
||||
// 若符合格式,顯示主跑馬燈文字
|
||||
string marqueeMessage = message.Substring(match.Value.Length).Trim();
|
||||
Color textColor = GetColorFromString(match.Groups[2].Value);
|
||||
OverlayForm.MainForm.UpdateMarqueeText(marqueeMessage, OverlayForm.MarqueeStartPosition.Middle, textColor);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 不符合格式,顯示在第二行跑馬燈
|
||||
string marqueeMessage = "系統公告: " + message;
|
||||
OverlayForm.MainForm.UpdateMarqueeTextSecondLine(marqueeMessage);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 指令為 "exit":結束此連線
|
||||
if (request.Trim().Equals("exit", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
break;
|
||||
@ -234,10 +287,12 @@ namespace DualScreenDemo
|
||||
}
|
||||
finally
|
||||
{
|
||||
// 關閉 listener
|
||||
listener.Stop();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private Color GetColorFromString(string 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.Threading.Tasks;
|
||||
using DirectShowLib;
|
||||
|
||||
using DBObj;
|
||||
using OverlayFormObj;
|
||||
namespace DualScreenDemo
|
||||
{
|
||||
public class VideoPlayerForm : Form
|
||||
@ -91,8 +92,8 @@ namespace DualScreenDemo
|
||||
private IVideoWindow videoWindowPrimary;
|
||||
private IMediaEventEx mediaEventExPrimary;
|
||||
private IMediaEventEx mediaEventExSecondary;
|
||||
private int videoWidth;
|
||||
private int videoHeight;
|
||||
//private int videoWidth;
|
||||
//private int videoHeight;
|
||||
private static bool isInitializationComplete = false;
|
||||
|
||||
public static OverlayForm overlayForm;
|
||||
@ -399,7 +400,7 @@ namespace DualScreenDemo
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
@ -514,10 +515,10 @@ namespace DualScreenDemo
|
||||
}
|
||||
}
|
||||
|
||||
public void InitializePublicPlaylist(List<SongData> initialPlaylist)
|
||||
public async void InitializePublicPlaylist(List<SongData> initialPlaylist)
|
||||
{
|
||||
publicPlaylist = initialPlaylist;
|
||||
PlayPublicPlaylist(); // 开始播放公播歌单
|
||||
await PlayPublicPlaylist(); // 开始播放公播歌单
|
||||
}
|
||||
|
||||
public async Task SetPlayingSongList(List<SongData> songList)
|
||||
@ -1520,7 +1521,7 @@ namespace DualScreenDemo
|
||||
string labelText = isVocalRemoved ? "無人聲" : "有人聲";
|
||||
// 显示标签
|
||||
OverlayForm.MainForm.ShowOriginalSongLabel(labelText);
|
||||
await Task.Delay(300);
|
||||
await Task.Delay(3000);
|
||||
// 隐藏标签
|
||||
OverlayForm.MainForm.HideOriginalSongLabel();
|
||||
}
|
||||
@ -1528,6 +1529,7 @@ namespace DualScreenDemo
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine( ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1570,16 +1572,11 @@ namespace DualScreenDemo
|
||||
DsUtils.FreeAMMediaType(mediaType);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
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 |