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