using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.Desktop.Library.Component
{
///
/// ShowMessage提供三个按钮,三种按钮组合方式(单一,是否,是否+取消),提供自动关闭弹窗的功能。
///
public partial class ShowMessage : GeneralForm
{
private MessageResult MessageResult = MessageResult.Cancel;
private readonly MessageResult AutoResult = MessageResult.OK;
private string InputResult = "";
private const string TITLE_TIP = "提示";
private const string TITLE_WARNING = "警告";
private const string TITLE_ERROR = "错误";
private const string BUTTON_OK = "确定";
private const string BUTTON_CANCEL = "取消";
private const string BUTTON_YES = "是";
private const string BUTTON_NO = "否";
private const string BUTTON_RETRY = "重试";
///
/// 弹出单一按钮(确定)的弹窗
///
///
///
///
///
public static MessageResult Message(string msg, string title, int autoclose = 0)
{
MessageResult result = new ShowMessage(title, msg, autoclose, MessageButtonType.OK, BUTTON_OK).MessageResult;
return result;
}
///
/// 弹出单一按钮(确定)的弹窗,标题默认为“提示”
///
///
///
///
///
public static MessageResult TipMessage(string msg, string title = "", int autoclose = 0)
{
MessageResult result = new ShowMessage(title == "" ? TITLE_TIP : title, msg, autoclose, MessageButtonType.OK, BUTTON_OK).MessageResult;
return result;
}
///
/// 弹出单一按钮(确定)的弹窗,标题默认为“警告”
///
///
///
///
///
public static MessageResult WarningMessage(string msg, string title = "", int autoclose = 0)
{
MessageResult result = new ShowMessage(title == "" ? TITLE_WARNING : title, msg, autoclose, MessageButtonType.OK, BUTTON_OK).MessageResult;
return result;
}
///
/// 弹出单一按钮(确定)的弹窗,标题默认为“错误”
///
///
///
///
///
public static MessageResult ErrorMessage(string msg, string title = "", int autoclose = 0)
{
MessageResult result = new ShowMessage(title == "" ? TITLE_ERROR : title, msg, autoclose, MessageButtonType.OK, BUTTON_OK).MessageResult;
return result;
}
///
/// 弹出选择(是,否)的弹窗
///
///
///
///
///
public static MessageResult YesNoMessage(string msg, string title, int autoclose = 0)
{
MessageResult result = new ShowMessage(title, msg, autoclose, MessageButtonType.YesNo, BUTTON_CANCEL, BUTTON_YES, BUTTON_NO).MessageResult;
return result;
}
///
/// 弹出选择(确定,取消)的弹窗
///
///
///
///
///
public static MessageResult OKCancelMessage(string msg, string title, int autoclose = 0)
{
MessageResult result = new ShowMessage(title, msg, autoclose, MessageButtonType.OKCancel, BUTTON_CANCEL, BUTTON_OK, BUTTON_CANCEL).MessageResult;
return result;
}
///
/// 弹出选择(重试,取消)的弹窗
///
///
///
///
///
public static MessageResult RetryCancelMessage(string msg, string title, int autoclose = 0)
{
MessageResult result = new ShowMessage(title, msg, autoclose, MessageButtonType.RetryCancel, BUTTON_CANCEL, BUTTON_RETRY, BUTTON_CANCEL).MessageResult;
return result;
}
///
/// 弹出具有输入框的弹窗
///
///
///
/// 输入框内的文本
public static string InputMessage(string msg, string title)
{
string result = new ShowMessage(title, msg, 0, MessageButtonType.Input).InputResult;
return result;
}
///
/// 弹出具有输入框的弹窗,多增加了(点击的按钮)返回值,可用于判断是否取消操作
///
///
///
/// 点击的按钮
/// 输入框内的文本
public static string InputMessageCancel(string msg, string title, out MessageResult cancel)
{
ShowMessage window = new(title, msg, 0, MessageButtonType.Input);
string result = window.InputResult;
cancel = window.MessageResult;
return result;
}
///
/// 构造方法
///
/// 标题
/// 信息
/// 自动关闭倒计时(秒)
/// 按钮类型(组合类型)
/// 中间按钮的文本
/// 左边按钮的文本
/// 右边按钮的文本
private ShowMessage(string title = "", string msg = "", int autoclose = 0, MessageButtonType type = MessageButtonType.OK, string mid = "", string left = "", string right = "")
{
InitializeComponent();
Opacity = 0.85; // 透明度
// 标题
Title.Text = title;
Text = title;
// 信息
MsgText.Text = msg;
// 按钮类型(组合类型)
switch (type)
{
case MessageButtonType.OK:
MidButton.Text = BUTTON_OK;
InputText.Visible = false;
InputButton.Visible = false;
LeftButton.Visible = false;
RightButton.Visible = false;
MidButton.Visible = true;
break;
case MessageButtonType.OKCancel:
LeftButton.Text = BUTTON_OK;
RightButton.Text = BUTTON_CANCEL;
InputText.Visible = false;
InputButton.Visible = false;
LeftButton.Visible = true;
RightButton.Visible = true;
MidButton.Visible = false;
AutoResult = MessageResult.Cancel;
break;
case MessageButtonType.YesNo:
LeftButton.Text = BUTTON_YES;
RightButton.Text = BUTTON_NO;
InputText.Visible = false;
InputButton.Visible = false;
LeftButton.Visible = true;
RightButton.Visible = true;
MidButton.Visible = false;
AutoResult = MessageResult.No;
break;
case MessageButtonType.RetryCancel:
LeftButton.Text = BUTTON_RETRY;
RightButton.Text = BUTTON_CANCEL;
InputText.Visible = false;
InputButton.Visible = false;
LeftButton.Visible = true;
RightButton.Visible = true;
MidButton.Visible = false;
AutoResult = MessageResult.Cancel;
break;
case MessageButtonType.Input:
InputButton.Text = BUTTON_OK;
LeftButton.Visible = false;
RightButton.Visible = false;
MidButton.Visible = false;
InputText.Visible = true;
InputButton.Visible = true;
AutoResult = MessageResult.Cancel;
break;
}
// 按钮文本
MidButton.Text = mid;
LeftButton.Text = left;
RightButton.Text = right;
// 自动关闭倒计时
TaskUtility.NewTask(async () => await AutoClose(autoclose));
ShowDialog();
}
///
/// 自动关闭窗口的实现
///
///
///
private async Task AutoClose(int autoclose)
{
if (autoclose > 0)
{
string msg = MsgText.Text;
await Task.Run(() =>
{
while (IsHandleCreated)
{
break;
}
});
ChangeSecond(msg, autoclose);
while (!Disposing)
{
if (autoclose > 0) await Task.Delay(1000);
else break;
autoclose--;
ChangeSecond(msg, autoclose);
}
MessageResult = AutoResult;
InvokeUpdateUI(Dispose);
}
}
///
/// 设置窗体按钮返回值
///
///
private void SetButtonResult(string text)
{
MessageResult = text switch
{
BUTTON_OK => MessageResult.OK,
BUTTON_CANCEL => MessageResult.Cancel,
BUTTON_YES => MessageResult.Yes,
BUTTON_NO => MessageResult.No,
BUTTON_RETRY => MessageResult.Retry,
_ => MessageResult.Cancel
};
Dispose();
}
///
/// 修改倒计时显示
///
///
///
private void ChangeSecond(string msg, int s)
{
InvokeUpdateUI(() => MsgText.Text = msg + "\n[ " + s + " 秒后自动关闭 ]");
}
private void LeftButton_Click(object sender, EventArgs e)
{
SetButtonResult(LeftButton.Text);
}
private void RightButton_Click(object sender, EventArgs e)
{
SetButtonResult(RightButton.Text);
}
private void MidButton_Click(object sender, EventArgs e)
{
SetButtonResult(MidButton.Text);
}
private void InputButton_Click()
{
MessageResult = MessageResult.OK;
if (InputText.Text != null && !InputText.Text.Equals(""))
{
InputResult = InputText.Text;
Dispose();
}
else
{
InputText.Enabled = false;
WarningMessage("不能输入空值!");
InputText.Enabled = true;
}
}
private void InputButton_Click(object sender, EventArgs e)
{
InputButton_Click();
}
private void InputText_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode.Equals(Keys.Enter))
{
InputButton_Click();
}
}
private void Exit_Click(object sender, EventArgs e)
{
MessageResult = MessageResult.Cancel;
Dispose();
}
}
}