test #1

Merged
jasonchenwork merged 64 commits from test into master 2025-03-18 17:32:23 +08:00
1969 changed files with 5824 additions and 57338 deletions

6
.gitignore vendored
View File

@ -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

View File

@ -1 +0,0 @@
netsh http add urlacl url=http://192.168.11.7:9090/ user=Everyone

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

View File

@ -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

View File

@ -1,4 +1,4 @@
namespace DualScreenDemo
namespace DBObj
{
// artist OOP test
public class Artist

View File

@ -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
{

View File

@ -1,6 +1,6 @@
using System;
namespace DualScreenDemo
namespace DBObj
{
public class SongData
{

View File

@ -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();

File diff suppressed because it is too large Load Diff

View File

@ -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();

View File

@ -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);
}

View File

@ -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
{

View File

@ -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);

View File

@ -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()
{

View File

@ -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

View File

@ -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, "台語");
// }
// }
// }

View File

@ -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);

View File

@ -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()

View File

@ -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);
}

View File

@ -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);

View File

@ -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()

View File

@ -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));

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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(); // 否則直接執行
}
}
}
}

View File

@ -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);
}

View File

@ -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();
}

View File

@ -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);*/
};

View File

@ -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);
}

View File

@ -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>
/// 此元組包含以下四個值:
/// XX 座標
/// , YY 座標
/// , Width寬度
/// , Height高度
/// </remarks>
private (int X, int Y, int Width, int Height) pictureBoxZhuYinSongCoords;
/// <summary>
/// 從設定檔 (config.ini) 讀取 PictureBoxZhuYinSongs 的座標與尺寸
/// </summary>
private void LoadPictureBoxZhuYinSongCoordsFromConfig()
{
// 建立 INI 檔案解析器
var parser = new FileIniDataParser();
// 讀取 config.ini 設定檔的內容
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();
}
}
}
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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>
/// 此元組包含以下四個值:
/// XX 座標
/// , YY 座標
/// , 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();
// 刷新拼音字母按鈕

View File

@ -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
{
}
}

View File

@ -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);
}
}
}
}

View File

@ -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)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -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}");
}
}
}

Binary file not shown.

Binary file not shown.

View File

@ -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)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 KiB

View File

@ -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);
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
歡迎使用超級巨星歡唱網路版系統,與你共度美好時光。

10
app.manifest Normal file
View 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
View File

@ -0,0 +1 @@
歡迎使用網路版系統,與你共度美好時光。

786
bin/config.ini Normal file
View 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

View File

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

Before

Width:  |  Height:  |  Size: 486 KiB

After

Width:  |  Height:  |  Size: 486 KiB

View File

Before

Width:  |  Height:  |  Size: 552 KiB

After

Width:  |  Height:  |  Size: 552 KiB

View File

Before

Width:  |  Height:  |  Size: 662 KiB

After

Width:  |  Height:  |  Size: 662 KiB

View File

Before

Width:  |  Height:  |  Size: 720 KiB

After

Width:  |  Height:  |  Size: 720 KiB

View File

Before

Width:  |  Height:  |  Size: 462 KiB

After

Width:  |  Height:  |  Size: 462 KiB

View File

Before

Width:  |  Height:  |  Size: 496 KiB

After

Width:  |  Height:  |  Size: 496 KiB

Some files were not shown because too many files have changed in this diff Show More