Files
HLib/Forms/ContextMenuHelper.cs
T
2026-06-01 13:23:34 +09:00

333 lines
13 KiB
C#
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}
}
}