333 lines
13 KiB
C#
333 lines
13 KiB
C#
using DocumentFormat.OpenXml.Office2010.CustomUI;
|
||
using KssSmaPlaLib.Forms.ContextMenuFunction;
|
||
using KssSmaPlaLib.Ini;
|
||
using KssSmaPlaLib.Input.Gamen;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Drawing;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Windows.Forms;
|
||
using Windows.UI.Popups;
|
||
|
||
namespace KssSmaPlaLib.Forms
|
||
{
|
||
public static class ContextMenuHelper
|
||
{
|
||
private const string INI_KEY_TITLE = "Title";
|
||
private const string INI_KEY_BACK_COLOR = "BackColor";
|
||
|
||
/// <summary>
|
||
/// フォーム背景色選択
|
||
/// </summary>
|
||
/// <param name="form"></param>
|
||
public static void SelectBackColor(Form form)
|
||
{
|
||
using (ColorDialog cd = new ColorDialog())
|
||
{
|
||
// 今の色を初期選択にしておく
|
||
cd.Color = form.BackColor;
|
||
|
||
if (cd.ShowDialog() == DialogResult.OK)
|
||
{
|
||
// 1. フォームの背景色を即時変更
|
||
form.BackColor = cd.Color;
|
||
|
||
// 2. 🔥 Colorを16進数(#RRGGBB)に変換してINIに書き込み
|
||
string colorHex = ColorTranslator.ToHtml(cd.Color);
|
||
IniHelper.WriteValue(null, form.Name, INI_KEY_BACK_COLOR, colorHex);
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 背景色をINIから取得して設定
|
||
/// </summary>
|
||
/// <param name="form"></param>
|
||
public static void SetBackColorFromIni(Form form)
|
||
{
|
||
var colorHex = IniHelper.ReadValue(null, form.Name, INI_KEY_BACK_COLOR, ColorTranslator.ToHtml(form.BackColor));
|
||
form.BackColor = ColorTranslator.FromHtml(colorHex);
|
||
}
|
||
|
||
/// <summary>
|
||
/// INIに登録されている色選択
|
||
/// </summary>
|
||
/// <param name="form"></param>
|
||
public static void SelectIniColor(Form form, string key, Color defaultColor)
|
||
{
|
||
var colorHex = IniHelper.ReadValue(null, form.Name, key, ColorTranslator.ToHtml(defaultColor));
|
||
var color = ColorTranslator.FromHtml(colorHex);
|
||
|
||
using (ColorDialog cd = new ColorDialog())
|
||
{
|
||
// 今の色を初期選択にしておく
|
||
cd.Color = color;
|
||
|
||
if (cd.ShowDialog() == DialogResult.OK)
|
||
{
|
||
// 2. 🔥 Colorを16進数(#RRGGBB)に変換してINIに書き込み
|
||
colorHex = ColorTranslator.ToHtml(cd.Color);
|
||
IniHelper.WriteValue(null, form.Name, key, colorHex);
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// INIに設定されている色取得
|
||
/// </summary>
|
||
/// <param name="form"></param>
|
||
/// <param name="key"></param>
|
||
/// <param name="defaultColor"></param>
|
||
/// <returns></returns>
|
||
public static Color GetIniColor(Form form, string key, Color defaultColor)
|
||
{
|
||
var colorHex = IniHelper.ReadValue(null, form.Name, key, ColorTranslator.ToHtml(defaultColor));
|
||
return ColorTranslator.FromHtml(colorHex);
|
||
}
|
||
|
||
/// <summary>
|
||
/// チェックボックスのメニュー項目のチェック値のロード
|
||
/// </summary>
|
||
/// <param name="frm"></param>
|
||
/// <param name="menuItem"></param>
|
||
public static void MenuCheckBoxItemLoad(Form frm, ToolStripMenuItem menuItem)
|
||
{
|
||
menuItem.Checked =
|
||
//bool.TryParse(
|
||
// IniHelper.ReadValue(
|
||
// null, frm.Name, menuItem.Name, false.ToString()),
|
||
// out var boolVal) ? boolVal : false;
|
||
IniHelper.ReadBoolValue(null, frm.Name, menuItem.Name, false);
|
||
}
|
||
|
||
public static void LoadAllMenuStates(Form form, ContextMenuStrip contextMenu)
|
||
{
|
||
foreach (ToolStripItem item in contextMenu.Items)
|
||
ProcessMenuItemLoad(form, item);
|
||
}
|
||
|
||
private static void ProcessMenuItemLoad(Form form, ToolStripItem item)
|
||
{
|
||
// ToolStripMenuItem かつ CheckOnClick が true の場合のみ処理
|
||
if (item is ToolStripMenuItem menuItem && menuItem.CheckOnClick)
|
||
{
|
||
// 🚀 ご提示のヘルパーメソッドを1行呼び出すだけ!
|
||
ContextMenuHelper.MenuCheckBoxItemLoad(form, menuItem);
|
||
}
|
||
|
||
// 子メニュー(階層)がある場合は再帰的に奥まで処理
|
||
if (item is ToolStripDropDownItem dropDownItem && dropDownItem.HasDropDownItems)
|
||
{
|
||
foreach (ToolStripItem subItem in dropDownItem.DropDownItems)
|
||
ProcessMenuItemLoad(form, subItem);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// メニューのチェックボックスアイテムのクリック時
|
||
/// </summary>
|
||
/// <param name="frm"></param>
|
||
/// <param name="menuItem"></param>
|
||
public static void MenuCheckBoxItemClick(Form frm, ToolStripMenuItem menuItem)
|
||
{
|
||
menuItem.Checked = !menuItem.Checked;
|
||
IniHelper.WriteValue(null, frm.Name, menuItem.Name, menuItem.Checked.ToString());
|
||
}
|
||
|
||
/// <summary>
|
||
/// メニューのフォント設定
|
||
/// ※フォームロードでCallしてください
|
||
/// </summary>
|
||
/// <param name="form"></param>
|
||
/// <param name="menu"></param>
|
||
public static void SetFont(Form form, ContextMenuStrip menu)
|
||
{
|
||
menu.Font = FontUxer.GetFont(form.Name, menu.Name + ".Font", menu.Font);
|
||
}
|
||
|
||
/// <summary>
|
||
/// コントロール(ラベル等)のフォント設定
|
||
/// ※フォームロードでCallしてください
|
||
/// </summary>
|
||
/// <param name="form"></param>
|
||
/// <param name="menu"></param>
|
||
public static void SetControlFont(Form form, Control control)
|
||
{
|
||
control.Font = FontUxer.GetFont(form.Name, control.Name + ".Font", control.Font);
|
||
}
|
||
|
||
/// <summary>
|
||
/// メニュー自身のフォント選択
|
||
/// </summary>
|
||
/// <param name="form"></param>
|
||
/// <param name="menu"></param>
|
||
public static void SelectMenuFont(Form form, ContextMenuStrip menu)
|
||
{
|
||
if (FontUxer.SelectFont(form, form.Name, menu.Name + ".Font", menu.Font, out var font))
|
||
menu.Font = font;
|
||
}
|
||
|
||
/// <summary>
|
||
/// コントロール(ラベル等)のフォント選択
|
||
/// </summary>
|
||
/// <param name="form"></param>
|
||
/// <param name="control"></param>
|
||
public static void SelectControlFont(Form form, Control control)
|
||
{
|
||
if (FontUxer.SelectFont(form, form.Name, control.Name + ".Font", control.Font, out var font))
|
||
control.Font = font;
|
||
}
|
||
|
||
/// <summary>
|
||
/// フォームのタイトル設定
|
||
/// </summary>
|
||
/// <param name="form"></param>
|
||
public static void SetFormTitle(Form form)
|
||
{
|
||
var title = IniHelper.ReadValue(null, form.Name, INI_KEY_TITLE, form.Text);
|
||
using (var dlg = new TextInputForm(title))
|
||
{
|
||
if (dlg.ShowDialog() == DialogResult.Cancel) return;
|
||
IniHelper.WriteValue(null, form.Name, INI_KEY_TITLE, dlg.EditedText);
|
||
form.Text = IniHelper.ReadValue(null, form.Name, INI_KEY_TITLE, form.Text);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// バージョン表示
|
||
/// </summary>
|
||
/// <param name="menuItem"></param>
|
||
public static void DispVersion(ToolStripMenuItem menuItem, bool isDispCraftedBy = true)
|
||
{
|
||
// バージョン
|
||
menuItem.Font = new Font(menuItem.Font.FontFamily, 8.0f);
|
||
menuItem.Enabled = false;
|
||
menuItem.Text = "Ver." + Application.ProductVersion + (isDispCraftedBy ? " | Crafted by のぼぼ工房" : "");
|
||
}
|
||
|
||
/// <summary>
|
||
/// ショートカットキーで動作するようにする
|
||
/// ※フォームのKeyPreviewをtrueにして、
|
||
/// フォームのKeyDownイベントでCallしてください。
|
||
/// private void Form1_KeyDown(object sender, KeyEventArgs e)
|
||
// {
|
||
// // メニューのEnabledを制御している場合、そのOpeningを呼んでおく。
|
||
// contextMenuStrip1_Opening(contextMenuStrip1, new System.ComponentModel.CancelEventArgs());
|
||
//
|
||
// if (ExecuteShortcutWithEnabledCheck(contextMenuStrip1.Items, e.KeyData))
|
||
// {
|
||
// e.Handled = true;
|
||
// }
|
||
// }
|
||
/// </summary>
|
||
/// <param name="items"></param>
|
||
/// <param name="keyData"></param>
|
||
/// <returns></returns>
|
||
public static bool ExecuteShortcutWithEnabledCheck(ToolStripItemCollection items, Keys keyData)
|
||
{
|
||
foreach (ToolStripItem item in items)
|
||
{
|
||
if (item is ToolStripMenuItem menuItem)
|
||
{
|
||
// ショートカットが一致し、かつ「有効(Enabled)」な時だけ実行!
|
||
if (menuItem.ShortcutKeys == keyData && menuItem.Enabled)
|
||
{
|
||
menuItem.PerformClick();
|
||
return true;
|
||
}
|
||
|
||
if (menuItem.HasDropDownItems)
|
||
{
|
||
if (ExecuteShortcutWithEnabledCheck(menuItem.DropDownItems, keyData)) return true;
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// コンボメニューの選択値をINIに保存
|
||
/// (ToolStripComboBoxのSelectedIndexChangedでCallしてね!💖)
|
||
/// </summary>
|
||
/// <param name="form"></param>
|
||
/// <param name="combo"></param>
|
||
public static void SaveComboMenuToIni(Form form, ToolStripComboBox combo)
|
||
{
|
||
IniHelper.WriteValue(null, form.Name, combo.Name + ".Values", combo.Text);
|
||
}
|
||
|
||
/// <summary>
|
||
/// コンボメニューの選択値をINIから復元
|
||
/// (FormのLoadでCallしてね💖)
|
||
/// </summary>
|
||
/// <param name="form"></param>
|
||
/// <param name="combo"></param>
|
||
/// <param name="defaultValue"></param>
|
||
public static void LoadComboMenuFromIni(Form form, ToolStripComboBox combo, string defaultValue)
|
||
{
|
||
combo.Text = IniHelper.ReadValue(null, form.Name, combo.Name + ".Values", defaultValue);
|
||
}
|
||
|
||
/// <summary>
|
||
/// コンボメニューの選択値をINIから取得
|
||
/// </summary>
|
||
/// <param name="form"></param>
|
||
/// <param name="combo"></param>
|
||
/// <param name="defaultValue"></param>
|
||
/// <returns></returns>
|
||
public static string ComboMenuFromIni(Form form, ToolStripComboBox combo, string defaultValue)
|
||
{
|
||
return IniHelper.ReadValue(null, form.Name, combo.Name + ".Values", defaultValue);
|
||
}
|
||
|
||
/// <summary>
|
||
/// フォームガチャ
|
||
/// </summary>
|
||
/// <param name="form"></param>
|
||
/// <returns></returns>
|
||
public static async Task FormGacha(Form form)
|
||
{
|
||
// 現在の状態をバックアップ
|
||
var originalState = form.Controls.Cast<Control>()
|
||
.Select(c => new { Ctrl = c, Loc = c.Location, Txt = c.Text, Font = c.Font }).ToList();
|
||
var formLoc = form.Location;
|
||
|
||
Random rng = new Random();
|
||
|
||
// 5秒間の狂宴(癒し)
|
||
for (int i = 0; i < 100; i++)
|
||
{
|
||
// 1. フォーム自体が震える
|
||
form.Location = new Point(formLoc.X + rng.Next(-20, 21), formLoc.Y + rng.Next(-20, 21));
|
||
|
||
foreach (var item in originalState)
|
||
{
|
||
// 2. コントロールがバラバラに踊る
|
||
item.Ctrl.Location = new Point(item.Loc.X + rng.Next(-15, 16), item.Loc.Y + rng.Next(-15, 16));
|
||
|
||
// 3. ラベルが叫び、ボタンが点滅する
|
||
if (item.Ctrl is System.Windows.Forms.Label) item.Ctrl.Text = "がちゃ!";
|
||
item.Ctrl.BackColor = Color.FromArgb(rng.Next(256), rng.Next(256), rng.Next(256));
|
||
}
|
||
|
||
// 4. マウスカーソルを中央に拘束(逃がさない)
|
||
Cursor.Position = form.PointToScreen(new Point(form.Width / 2, form.Height / 2));
|
||
|
||
await Task.Delay(30);
|
||
}
|
||
|
||
// 祭りのあと(完全復旧)
|
||
form.Location = formLoc;
|
||
foreach (var item in originalState)
|
||
{
|
||
item.Ctrl.Location = item.Loc;
|
||
item.Ctrl.Text = item.Txt;
|
||
item.Ctrl.Font = item.Font;
|
||
item.Ctrl.BackColor = SystemColors.Control;
|
||
}
|
||
}
|
||
}
|
||
}
|