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";
///
/// フォーム背景色選択
///
///
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);
}
}
}
///
/// 背景色をINIから取得して設定
///
///
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);
}
///
/// INIに登録されている色選択
///
///
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);
}
}
}
///
/// INIに設定されている色取得
///
///
///
///
///
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);
}
///
/// チェックボックスのメニュー項目のチェック値のロード
///
///
///
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);
}
}
///
/// メニューのチェックボックスアイテムのクリック時
///
///
///
public static void MenuCheckBoxItemClick(Form frm, ToolStripMenuItem menuItem)
{
menuItem.Checked = !menuItem.Checked;
IniHelper.WriteValue(null, frm.Name, menuItem.Name, menuItem.Checked.ToString());
}
///
/// メニューのフォント設定
/// ※フォームロードでCallしてください
///
///
///
public static void SetFont(Form form, ContextMenuStrip menu)
{
menu.Font = FontUxer.GetFont(form.Name, menu.Name + ".Font", menu.Font);
}
///
/// コントロール(ラベル等)のフォント設定
/// ※フォームロードでCallしてください
///
///
///
public static void SetControlFont(Form form, Control control)
{
control.Font = FontUxer.GetFont(form.Name, control.Name + ".Font", control.Font);
}
///
/// メニュー自身のフォント選択
///
///
///
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;
}
///
/// コントロール(ラベル等)のフォント選択
///
///
///
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;
}
///
/// フォームのタイトル設定
///
///
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);
}
}
///
/// バージョン表示
///
///
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 のぼぼ工房" : "");
}
///
/// ショートカットキーで動作するようにする
/// ※フォームの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;
// }
// }
///
///
///
///
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;
}
///
/// コンボメニューの選択値をINIに保存
/// (ToolStripComboBoxのSelectedIndexChangedでCallしてね!💖)
///
///
///
public static void SaveComboMenuToIni(Form form, ToolStripComboBox combo)
{
IniHelper.WriteValue(null, form.Name, combo.Name + ".Values", combo.Text);
}
///
/// コンボメニューの選択値をINIから復元
/// (FormのLoadでCallしてね💖)
///
///
///
///
public static void LoadComboMenuFromIni(Form form, ToolStripComboBox combo, string defaultValue)
{
combo.Text = IniHelper.ReadValue(null, form.Name, combo.Name + ".Values", defaultValue);
}
///
/// コンボメニューの選択値をINIから取得
///
///
///
///
///
public static string ComboMenuFromIni(Form form, ToolStripComboBox combo, string defaultValue)
{
return IniHelper.ReadValue(null, form.Name, combo.Name + ".Values", defaultValue);
}
///
/// フォームガチャ
///
///
///
public static async Task FormGacha(Form form)
{
// 現在の状態をバックアップ
var originalState = form.Controls.Cast()
.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;
}
}
}
}